Отправляет email-рассылки с помощью сервиса Sendsay

Килограмм килобайтов

  Все выпуски  

Килограмм килобайтов


"Килограмм килобайтов"


Выпуск №2 Дата выхода:2007-01-21
Сайт рассылки: отсутствует

Здравствуйте, уважаемые подписчики.


С этого выпуска рассылки я начинаю цикл статей о работе с базой данных Oracle в Microsoft .Net.

* * *

Работа с базой данных в .Net

Вся информация для этой статьи взята из Microsoft MSDN Library for Visual Studio 2005.
Работать будем с СУБД Oracle, а программу будем писать на языке C#.

Вступление

.NET Framework предоставляет набор классов для работы с СУБД Oracle.
Эти классы содержатся в пространстве имен System.Data.OracleClient, в сборке System.Data.OracleClient.dll.
Чтобы использовать эти средства, в проект необходимо включить System.Data.dll и System.Data.OracleClient.dll,
а текст программы надо добавить пространства имен:

using System.Data;
using System.Data.OracleClient;

Соединение и базой данных

Первым шагом работы с базой данных является - установка соединения. Для этой цели предназначен класс OracleConnection, входящий в пространство имен System.Data.OracleClient. Для установки соединения необходимо определить "Строку соедиения" - это указание с какой базой устанваливать соедиение и какими должны быть параметры этого соединения. Строка может быть, например, такой:

          string vConnectionString;
                 vConnectionString = "Data Source="+DBname.Text+
                                     ";User Id="+UserName.Text+
                                     ";Password="+UserPassword.Text+
                                     ";Pooling=false";
  
Где Data Source - имя базы данных, User Id - имя пользователя, Password - пароль пользователя. А вот о параметре Pooling стоит сказать особо. Установка этого параметра позволяет устранить появление ошибки: 'ResourcePool' is not supported on the current platform. Ошибка эта весьма странная и почему появляется не понятно. В моей практике был случай, когда стабильно работавшая программа почему-то стала выдавать такую ошибку. Точную причину выявить не удалось, на каком-то форуме подсказали установить параметр Pooling, ошибка пропала.
"Строку соедиинения" в класс можно передать двумя способами или как аргумент конструктора или как свойство ConnectionString.
Давайте посмотрим, что получилось:

          private void connectionUp()
          {
            OracleConnection vConnection = new OracleConnection();
            string           vConnectionString;
                             vConnectionString = "Data Source="+DBname.Text+
                                                 ";User Id="+UserName.Text+
                                                 ";Password="+UserPassword.Text+
                                                 ";Pooling=false";
            vConnection.ConnectionString = vConnectionString;
            try
            {
              vConnection.Open();
            }
            catch (Exception msg)
            {
              MessageBox.Show(msg.ToString(), "Ошибка соединения",
                              MessageBoxButtons.OK, MessageBoxIcon.Error);
            }
          }
                  
        
Я формирую "строку соединения", используя данные, полученные через форму. Потом инициализирую свойство ConnectionString и устанавливаю соединение. Т.к. этот процесс чреват множеством ошибок, желательно вставить обработчик исключений.
После запуска функции можно посмотреть результат. Для этого можно воспользоваться, например, SQL Navigator'ом.
Запрос:
select * from v$session where UserName='имя пользователя'
Вы увидите несколько соединений, в том числе и только что установленное, его можно определить по значению поля program - это должно быть название вашей программы.

Давайте рассмотрим еще один интересный член класса OracleConnection. Свойство State - состояние соединение. Например, чтобы убедиться, что соединение действительно установлено, можно использовать следующий код:


          if (vConnection.State == ConnectionState.Open)
            MessageBox.Show("Соедиение установлено", "Сообщение",
                            MessageBoxButtons.OK,MessageBoxIcon.Information);
        
Обратите внимание, Miscosort советует самостоятельно закрывать соединение после того как оно больше не нужно, не надеяться на сборщик мусора. Это можно сделать методом Close.
Рассмотрим пример:

          vConnection.Close();
            if (vConnection.State == ConnectionState.Closed)
              MessageBox.Show("Соедиение не установлено", "Сообщение",
                              MessageBoxButtons.OK, MessageBoxIcon.Information);
        
Я закрыл соединение и проверил его статус.

Обработка исключительных ситуаций

В работе любой программы могут появиться ошибки. Под ошибками я подразумеваю события, не предусмотренные логикой программы. Например, это могут быть некорректно введенные данные. В нашем случае такими данными могут быть имя пользователя и пароль. Собственно, в возникновении таких ситуаций нет ничего страшного, если разработчик предусмотрел адекватную реакцию на них. В примере выше для отлова этих ситуаций я использую стандартный механизм обработки исключений try - catch (Exception msg). При неправильном вводе пароля вывалится здоровая портянка с кучей текста, увидев этот "мусор", пользователь, скорее всего, подумает что программа сглючила. Чтобы придать сообщению об ошибке более осознанный вид, можно строку

          MessageBox.Show(msg.ToString(), "Ошибка соединения", 
                          MessageBoxButtons.OK, MessageBoxIcon.Error);
        
заменить на что-нибудь, вроде:

          MessageBox.Show("Имя пользователя/пароль введены с ошибкой", "Ошибка соединения",
                          MessageBoxButtons.OK, MessageBoxIcon.Error);
  
Однако в этом случае при появлении любой ошибки будет выводиться одно и то же сообщение, что, конечно же, не верно. Лучшей практикой является определение, какая именно ошибка появилась и что делать с этой ошибкой. При работе с СУБД Oracle наиболее простым является анализ кода, возвращаемого СУБД. Значение этого кода можно получить, используя класс OracleException. Для его использования надо следующим образом исправить блок try-catch:

          try
          {
            vConnection.Open();
          }
          catch (OracleException msg)
          {
            if (msg.Code == 1017)
            {
              MessageBox.Show("Неверное имя пользователя/пароль", "Ошибка",
                              MessageBoxButtons.OK, MessageBoxIcon.Information);
            }
            else
              MessageBox.Show(msg.Message, "Ошибка",
                              MessageBoxButtons.OK, MessageBoxIcon.Information);
            }
          }
          
Я анализирую код ошибки и, если он равен 1017 (ошибка идентификации пользователя), вывожу соответствующее сообщение. Если произошла какая-то другая ошибка, сработает обработчик по умолчанию (в этом примере блок else). Используя этот подход можно предусмотреть реакцию программы на различные ошибки, которые могут появиться в ходе работы с базой данных.

Продолжение следует...

* * *

Ведущий рассылки: Петрелевич Сергей

Вас есть вопрос? Cпрашивайте
Напишите, что Вы хотите видеть в рассылке. Мне важно знать Ваше мнение.


В избранное