Автор работы: Пользователь скрыл имя, 20 Ноября 2013 в 16:53, реферат
Рассмотрим организацию совместной работы СУБД и приложения, передающего СУБД команды и получающего от СУБД данные. Как правило, для этой цели необходима специальная библиотека-посредник между СУБД и приложением. Одной из такого рода библиотек является Microsoft ADO.NET (ActiveX Data Objects). Это библиотека классов (входящая в состав .NET Framework), позволяющая .NET-приложению взаимодействовать с MS SQL Server, Oracle и другими СУБД через стандартные интерфейсы.
//выполнение команды
int cnt = (int)cmd.ExecuteNonQuery();
В этом случае инструкция передаётся SQL Server следующим образом:
exec sp_executesql N'insert into T(n,m) values (@n, @m)',N'@n int,@m int',@n=12,@m=12
При этом изменить смысл команды невозможно.
Необходимая часть работы с БД – рассмотрение возможных ошибок и программирование реакции на них. Большинство ошибок при выполнении DQL- и DML-инструкций сводится к следующим видам:
● ошибки подключения и аутентификации;
● недостаток привилегий;
● неверная структура инструкции;
● нарушение ограничений целостности данных;
● конфликты параллельно выполняемых транзакций.
Естественно, в первую очередь следует заботиться о предотвращении ошибок. Если ошибка всё же возникла, то, в зависимости от серьёзности ошибки, произойдет следующее:
● для ошибок уровня серьёзности менее 11 СУБД передаёт информационное сообщение, доступное через событие InfoMessage объекта подключения;
● для ошибок уровня от 11 до 20 генерируется ошибка, но подключение не закрывается. ADO.NET создаёт исключение, которое должно быть обработано;
● для ошибок уровня более 20 генерируется ошибка, и подключение закрывается.
Рассмотрим несколько типичных ошибок и приёмы их обработки.
Если параметры строки подключения неверны либо сервер БД по какой-либо причине недоступен, то при выполнении метода Open() класса SqlConnection возникнет исключение типа SqlException.
try {
SqlConnection cn = new SqlConnection(@"Data Source = wrong name; Initial Catalog = master; Integrated Security = true; Connect Timeout = 5");
cn.Open();
}
catch (SqlException ex) {
Console.WriteLine("Не удалось подключиться к БД");
}
Если же сервер отказал в авторизации, то также возникнет исключение SqlException с сообщением «Login failed for user …».
В данном примере перехватываются любые исключения SqlException, и пользователю выдаётся сообщение общего характера об ошибке подключения.
Если неверен формат самой строки подключения, то исключение типа ArgumentException возникнет в момент присваивания неверной строки свойству ConnectionString объекта SqlConnection.
Сюда относятся нарушения типов данных, проверочных ограничений, ограничений первичных и внешних ключей, а также срабатывание обеспечивающих целостность триггеров. Самая распространённая ошибка – нарушение ограничения внешнего ключа. Рассмотрим пример.
При попытке вставки строки в таблицу студент с неверным значением внешнего ключа возникает ошибка с сообщением «The INSERT statement conflicted with the FOREIGN KEY constraint "FK_Student_Group". The conflict occurred in database "Study", table "dbo.Groups", column 'GroupID'. The statement has been terminated».
Для понимания причины ошибки достаточно имени ограничения, которое нарушено: FK_Student_Group. Поэтому обработку ошибки можно осуществить следующим образом:
SqlConnection cn = new SqlConnection(@"Data Source = localhost\sqlexpress; Initial Catalog = study; Integrated Security = true; ");
try {
cn.Open();
}
catch (SqlException ex) {
Console.WriteLine("Не удалось подключиться к БД");
}
try {
SqlCommand cmd = new SqlCommand(@"insert into Student(FIO, GroupID) values('John', 'Wrong Group')", cn);
cmd.ExecuteNonQuery();
cn.Close();
}
catch (SqlException ex) {
if (ex.Message.Contains("FK_
//обработка ошибки внешнего ключа
Console.WriteLine("Указан неверный код группы");
}
else {
//обработка других возможных ошибок
}
cn.Close();
}
Заметим, что закрытие подключения следует выполнить в любом случае.