Технология Microsoft ADO.NET

       

Обработка исключений


Подключение к базе данных представляет собой одно из слабых мест в работе программы. В силу самых разных причин клиент может не получить доступ к базе данных. Поэтому при создании приложения следует обязательно включать обработку исключений и возможность предоставления пользователю информации о них.

Для получения специализированных сообщений при возникновении ошибок подключения к базе данных Microsoft SQL Server используются классы SqlException и SqlError. Объекты этих классов можно применять для перехвата номеров ошибок, возвращаемых базой данных (таблица 4.2):

Таблица 4.2. Ошибки SQL Server

Номер ошибки Описание
17 Неверное имя сервера
4060 Неверное название базы данных
18456 Неверное имя пользователя или пароль

Дополнительно вводятся уровни ошибок SQL Server, позволяющие охарактеризовать причину проблемы и ее сложность (таблица 4.3):

Таблица 4.3. Уровни ошибок SQL Server

Интервал возвращаемых значений Описание Действие
11-16 Ошибка, созданная пользователем Пользователь должен повторно ввести верные данные
17-19 Ошибки программного обеспечения или оборудования Пользователь может продолжать работу, но некоторые запросы будут недоступны. Соединение остается открытым
20-25 Ошибки программного обеспечения или оборудования Сервер закрывает соединение. Пользователь должен открыть его снова

Создайте новое Windows-приложение и назовите его "ExceptionsSQL". Свойству Size формы устанавливаем значение "600;380". Добавляем на форму элемент управления DataGrid, его свойству Dock устанавливаем значение "Fill". Перетаскиваем элемент Panel, определяем следующие его свойства:

panel1, свойство Значение
Dock Right
Location 392; 0
Size 200; 346

На панели размещаем четыре текстовых поля, надпись и кнопку:

textBox1, свойство Значение
Name txtDataSource
Location 8; 8
Size 184; 20
Text Введите название сервера
textBox2, свойство Значение
Name txtInitialCatalog
Location 8; 40
Size 184; 20
Text Введите название базы данных
textBox3, свойство Значение
Name txtUserID
Location 8; 72
Size 184; 20
Text Введите имя пользователя
textBox4, свойство Значение
Name txtPassword
Location 8; 104
Size 184; 20
Text Введите пароль1)
label1, свойство Значение
Location 16; 136
Size 176; 160
Text
button1, свойство Значение
Name btnConnect
Location 56; 312
Size 96; 23
Text Соединение


Интерфейс приложения готов. Подключаем пространство имен для работы с базой данных:

using System.Data.SqlClient;

Объекты ADO .NET и весь блок обработки исключений помещаем в обработчик кнопки "Соединение":

private void btnConnect_Click(object sender, System.EventArgs e) { SqlConnection conn = new SqlConnection(); label1.Text = ""; try { //conn.ConnectionString = "workstation id=9E0D682EA8AE448;data source=\"(local) //\";" + "persist security info=True;initial catalog=Northwind; //user id=sa;password=12345";

//Строка ConnectionString в качестве параметров //будет передавать значения, введенные в текстовые поля: conn.ConnectionString = "initial catalog=" + txtInitialCatalog.Text + ";" + "user id=" + txtUserID.Text + ";" + "password=" + txtPassword.Text + ";" + "data source=" + txtDataSource.Text + ";" + "workstation id=9E0D682EA8AE448;persist security info=True;"; SqlDataAdapter dataAdapter = new SqlDataAdapter("SELECT * FROM Customers", conn); DataSet ds = new DataSet(); conn.Open(); dataAdapter.Fill(ds); dataGrid1.DataSource = ds.Tables[0].DefaultView; } catch (SqlException OshibkiSQL) { foreach (SqlError oshibka in OshibkiSQL.Errors) { //Свойство Number объекта oshibka возвращает //номер ошибки SQL Server switch (oshibka.Number) { case 17: label1.Text += "\nНеверное имя сервера!"; break; case 4060: label1.Text += "\nНеверное имя базы данных!"; break; case 18456: label1.Text += "\nНеверное имя пользователя или пароль!"; break; } //Свойство Class объекта oshibka возвращает //уровень ошибки SQL Server, //а свойство Message - уведомляющее сообщение label1.Text +="\n"+oshibka.Message + " Уровень ошибки SQL Server: " + oshibka.Class; } } //Отлавливаем прочие возможные ошибки: catch (Exception ex) { label1.Text += "\nОшибка подключения: " + ex.Message; } finally { conn.Dispose(); } }



Закомментированная строка подключения содержит обычное перечисление параметров. При отладке приложения будет легче сначала добиться наличия подключения, а затем осуществлять привязку параметров, вводимых в текстовые поля. Запускаем приложение. При вводе неверных параметров в надпись выводятся соответствующие сообщения, а при правильных параметрах элемент DataGrid отображает данные (рис. 4.11):


увеличить изображение
Рис. 4.11.  Готовое приложение ExceptionsSQL

В программном обеспечении к курсу вы найдете приложение Exceptions SQL (Code\Glava2\ ExceptionsSQL).

Скопируйте папку приложения ExceptionsSQL и назовите ее "ExceptionsMDB". Удаляем с панели на форме имеющиеся текстовые поля и добавляем три новых:

textBox1, свойство Значение
Name txtDataBasePassword
Location 8; 16
Size 184; 20
Text Введите пароль базы данных
textBox2, свойство Значение
Name txtUserID
Location 8; 48
Size 184; 20
Text Введите имя пользователя
textBox3, свойство Значение
Name TxtPassword
Location 8; 80
Size 184; 20
Text Введите пароль пользователя
Изменяем пространство имен для работы с базой данных:

using System.Data.OleDb;

Обработчик кнопки "Соединение" будет выглядеть так:

private void btnConnect_Click(object sender, System.EventArgs e) { OleDbConnection conn = new OleDbConnection(); label1.Text = ""; try { // conn.ConnectionString = @"Provider=""Microsoft.Jet.OLEDB.4.0""; //Data Source=""D:\Uchebnik\Code\Glava2\BDwithUsersP.mdb""; Jet OLEDB:System database=""D:\Uchebnik\Code\Glava2\BDWorkFile.mdw""; User ID=Adonetuser;Password=12345;Jet OLEDB:Database Password=98765;";

//Строка ConnectionString в качестве параметров //будет передавать значения, введенные в текстовые поля: conn.ConnectionString = "Jet OLEDB:Database Password=" + txtDataBasePassword.Text + ";" + "User ID=" + txtUserID.Text + ";" + "password=" + txtPassword.Text + ";" +



@"Provider=""Microsoft.Jet.OLEDB.4.0"";Data Source=""D:\Uchebnik\Code\Glava2\BDwithUsersP.mdb""; Jet OLEDB:System database=""D:\Uchebnik\Code\Glava \BDWorkFile.mdw"";";

OleDbDataAdapter dataAdapter = new OleDbDataAdapter("SELECT * FROM Туристы", conn); DataSet ds = new DataSet(); conn.Open(); dataAdapter.Fill(ds); dataGrid1.DataSource = ds.Tables[0].DefaultView; } catch (OleDbException oshibka) { // Пробегаем по всем ошибкам for (int i=0; i < oshibka.Errors.Count; i++) { label1.Text+= "Номер ошибки " + i + "\n" + "Сообщение: " + oshibka.Errors[i].Message + "\n" + "Номер ошибки NativeError: " + oshibka.Errors[i].NativeError + "\n" + "Источник: " + oshibka.Errors[i].Source + "\n" + "Номер SQLState: " + oshibka.Errors[i].SQLState + "\n"; } } //Отлавливаем прочие возможные ошибки: catch (Exception ex) { label1.Text += "\nОшибка подключения: " + ex.Message; } finally { conn.Dispose(); } }

Запускаем приложение (рис. 4.12). Свойство Message возвращает причину ошибки на русском языке, поскольку установлена русская версия Microsoft Office 2003. Свойство NativeError (внутренняя ошибка) возвращает номер исключения, генерируемый самим источником данных. Вместе или по отдельности со свойством SQL State их можно использовать для создания переключателя, предоставляющего пользователю расширенную информацию (мы это делали в приложении ExceptionsSQL) .


Рис. 4.12.  Готовое приложение ExceptionsMDB

Кроме обработки исключений, здесь следует обратить внимание на интерфейс, предоставляющий возможность пользователю вводить сведения своей учетной записи. Теперь в целях безопасности приложения не нужно включать пароль в код при использовании мастеров, поскольку строка соединения будет генерироваться динамически. Разумеется, ваше приложение может иметь другой интерфейс - например, окно соединения будет появляться в дочерней форме.

В программном обеспечении к курсу вы найдете приложение Exceptions MDB (Code\Glava2\ ExceptionsMDB).


Содержание раздела