Автор работы: Пользователь скрыл имя, 20 Ноября 2013 в 16:53, реферат
Рассмотрим организацию совместной работы СУБД и приложения, передающего СУБД команды и получающего от СУБД данные. Как правило, для этой цели необходима специальная библиотека-посредник между СУБД и приложением. Одной из такого рода библиотек является Microsoft ADO.NET (ActiveX Data Objects). Это библиотека классов (входящая в состав .NET Framework), позволяющая .NET-приложению взаимодействовать с MS SQL Server, Oracle и другими СУБД через стандартные интерфейсы.
Рассмотрим организацию совместной работы СУБД и приложения, передающего СУБД команды и получающего от СУБД данные. Как правило, для этой цели необходима специальная библиотека-посредник между СУБД и приложением. Одной из такого рода библиотек является Microsoft ADO.NET (ActiveX Data Objects). Это библиотека классов (входящая в состав .NET Framework), позволяющая .NET-приложению взаимодействовать с MS SQL Server, Oracle и другими СУБД через стандартные интерфейсы.
Основной сценарий взаимодействия приложения с СУБД выглядит следующим образом:
1. Создание подключения.
2. Создание команды, содержащей SQL-запрос.
3. Открытие подключения.
4. Выполнение команды.
5. Обработка ошибок
6. Закрытие подключения.
7. Обработка результатов.
Для подключения к MS SQL
Server служит класс System.Data.SqlClient.
Для подключения
к Oracle – System.Data.OracleClient.
Для подключения
к какой-либо СУБД по протоколу ODBC – System.Data.Odbc.
Для подключения
к какому-либо источнику данных (в т.ч.
текстовому файлу или файлу Excel) - System.Data.OleDb.
Дальнейшее рассмотрение
касается взаимодействия с MS SQL Server.
Наиболее важные члены класса System.Data.SqlClient.
Конструктор | |
SqlConnection() |
Инициализирует новый |
SqlConnection(String) |
Инициализирует новый |
Свойства | |
ConnectionString |
Возвращает или задает строку, используемую для открытия базы данных SQL Server |
ConnectionTimeout |
Получает время ожидания при попытке
установки подключения, по истечении
которого попытка подключения |
ServerVersion |
Получает строку, которая содержит версию экземпляра SQL Server, к которому подключен клиент |
State |
Отображает состояние SqlConnection во время последней выполненной операции |
Методы | |
BeginTransaction() |
Начинает транзакцию базы данных |
BeginTransaction( |
Начинает транзакцию базы данных с указанным уровнем изоляции |
Close () |
Закрытие подключения к базе данных. Рекомендуется использовать этот метод для закрытия любого открытого подключения |
Dispose() |
Освобождает все ресурсы, используемые объектом |
Open () |
Открывает подключение к базе данных со значениями свойств, определяемыми объектом ConnectionString |
Практически работа с классом System.Data.
//строка подключения к БД
string connectionString = @"data source=.\sqlexpress; initial catalog = study; integrated security = true;";
//создание объекта
System.Data.SqlClient.
System.Data.SqlClient.SqlConne
//открытие подключения
cn.Open();
//выполнение команд
//...
//закрытие подключения
cn.Close();
Примечание. В C#, в отличие от C++, имя
пространства имён (namespace) присоединяется
к имени типа при помощи точки. Сравните:
System::Data::SqlClient:: SqlConnection и System.Data.SqlClient.
Строка подключения (Connection String) – набор всей необходимой для подключения информации, представленный в виде последовательности пар "ключевое слово — значение", разделенных символами точки с запятой. В приведенной ниже таблице представлены некоторые допустимые имена для значений ключевых слов в Connection String.
Ключевое слово |
Значение по умолчанию |
Описание |
Async |
false |
Когда задано значение true, поддерживаются асинхронные операции. Распознаваемые значения: true, false, yes и no. |
Connect Timeout -или- Connection Timeout |
15 |
Продолжительность времени ожидания подключения к серверу (в секундах) перед прекращением попытки подключения и генерацией ошибки. |
Data Source -или- Server -или- Address -или- Addr -или- Network Address |
Отсутствует |
Имя или сетевой адрес экземпляра SQL Server, к которому осуществляется подключение. При задании локального экземпляра можно использовать имя (local). |
Initial Catalog -или- Database |
Отсутствует |
Имя базы данных. |
Integrated Security -или- Trusted_Connection |
false |
Если задано значение false, в подключении должны быть заданы также параметры User ID и Password. Если задано значение true, для проверки подлинности используются текущие учетные данные Windows. Распознаваемые значения: true, false, yes, no и sspi (настоятельно рекомендуется), что эквивалентно true. |
Password -или- Pwd |
Отсутствует |
Пароль для входа в SQL-сервер |
User ID |
Отсутствует |
Учетная запись входа в SQL Server |
//подключение к экземпляру SQL Server с именем sqlexpress; БД myDB; аутентификация Windows
string connectionString = @"Data Source = localhost\sqlexpress; Initial Catalog = myDB; Integrated Security = True;";
//подключение к неименованному экземпляру SQL Server на удалённом сервере; БД myDB2; аутентификация Sql Server по логину и паролю
string connectionString = @"Data Source = 192.168.137.14; Initial Catalog = myDB2; User ID = MyUserID; Password = pa$$w0rd";
Примечание. Символ «@» перед открывающей кавычкой в языке C# означает, что строка должна интерпретироваться компилятором дословно: в частности, символы «\» (backslash) и «новая строка» не интерпретируются специальным образом, а просто сохраняются в строке.
За выполнение команды
MS SQL Server в ADO.NET отвечает класс System.Data.SqlClient.
Конструктор | |
SqlCommand() |
Инициализирует новый |
SqlCommand(String) |
Инициализирует новый |
SqlCommand(String, SqlConnection) |
Инициализирует новый |
SqlCommand(String, SqlConnection, SqlTransaction) |
Инициализирует новый |
Свойства | |
CommandText |
Возвращает или задает |
CommandTimeout |
Возвращает или задает время ожидания
перед завершением попытки |
CommandType |
Возвращает или задает значение, указывающее, как будет интерпретироваться свойство CommandText (команда SQL или имя хранимой процедуры) |
Connection |
Получает или задает объект SqlConnection, используемый данным экземпляром класса SqlCommand |
Parameters |
Получает коллекцию параметров команды – объект SqlParameterCollection |
Transaction |
Получает или задает объект SqlTransaction, в рамках которого выполняется команда SqlCommand. |
Методы | |
CreateParameter () |
Создает новый экземпляр параметра команды – объекта SqlParameter |
ExecuteNonQuery () |
Выполняет для подключения инструкцию Transact-SQL и возвращает количество задействованных в инструкции строк |
ExecuteReader() |
Отправляет CommandText в Connection и строит SqlDataReader |
ExecuteScalar () |
Выполняет запрос и возвращает первый столбец первой строки результирующего набора, возвращаемого запросом. Дополнительные столбцы и строки игнорируются |
ExecuteXmlReader () |
Отправляет CommandText в Connection и строит объект XmlReader |
Наиболее удобна перегрузка конструктора, принимающая текст команды и объект подключения (поскольку и то, и другое необходимо):
System.Data.SqlClient.SqlComma
Если команда является частью транзакции, то полезно передать конструктору и ссылку на объект транзакции:
cn.Open();
System.Data.SqlClient.SqlTrans
System.Data.SqlClient.SqlComma
cn, tran);
Объект System.Data.SqlClient.
Начатая транзакция должна быть
позднее явным образом
tran.Commit();
//или
tran.Rollback();
Если же явная транзакция не создаётся, то каждая SQL-инструкция в рамках команды выполняется как отдельная автоматическая транзакция. Вызывать Commit() или Rollback() в этом случае не требуется.
Способ выполнения зависит от ожидаемого результата:
● Если ожидается получение результата в виде таблицы, то используется метод ExecuteReader();
● Если ожидается получение скалярного результата, то используется метод ExecuteScalar();
● Если ожидается получение XML-документа, то используется метод ExecuteXmlReader ();
● Если команда не возвращает значения, то используется метод ExecuteNonQuery ().
Метод ExecuteScalar() возвращает значение типа object, которое упаковывает настоящее значение результата. Для распаковки применяется операция приведения типа к простому типу (чаще всего int, double, string или Date).
Пример.
string connectionString = @"data source=.\sqlexpress; initial catalog = NorthWind; integrated security = true;";
System.Data.SqlClient.SqlConne
new System.Data.SqlClient.SqlConne
System.Data.SqlClient.SqlComma
new System.Data.SqlClient.SqlComma
cn);
cn.Open();
//выполнение скалярной команды
int result = (int)cmd.ExecuteScalar();
cn.Close();
//вывод результата на консоль
System.Console.WriteLine("
Взаимодействие объектов в данном примере схематически показано на диаграмме.
Метод ExecuteReader() класса SqlCommand возвращает объект типа SqlDataReader, который позволяет просматривать строки и столбцы набора результатов в режиме только чтения в прямом направлении.
Свойства | |
HasRows |
Возвращает значение, указывающее, содержит ли объект SqlDataReader хотя бы одну строку |
Item[String] |
Индексатор. Возвращает значение заданного столбца при указании имени столбца |
FieldCount |
Возвращает количество столбцов в текущей строке |
Методы | |
Read() |
Перемещает SqlDataReader к следующей записи. Возвращает false, если следующей записи не существует, иначе – true |
Работать с объектом SqlDataReader следует до закрытия подключения. Если получена хотя бы одна строка (на что указывает истинность значения свойства HasRows), то для получения очередной строки можно вызывать метод Read(), а для чтения значений в строке – индексатор.
Пример использования SqlDataReader.
string connectionString = @"data source=.\sqlexpress; initial catalog = Study; integrated security = true;";
//создание объекта System.Data.SqlClient.
System.Data.SqlClient.SqlConne
//открытие подключения
cn.Open();
System.Data.SqlClient.SqlComma
//выполнение команды
System.Data.SqlClient.SqlDataR
if (reader.HasRows) {
//чтение очередной строки
while (reader.Read()) {
//вывод значений на консоль
System.Console.WriteLine("{0} {1} {2}", reader["StudentID"], reader["FIO"], reader["GroupID"]);
}
}
//закрытие подключения
cn.Close();
При вызове индексатора (в данном примере – reader["StudentID"]) ему передаётся номер или (чаще) имя столбца, возвращённого запросом. Возвращаемое значение представляет собой объект, который следует распаковывать, как и в случае с возвращаемым значением ExecuteScalar(), например:
int StudentID = (int)reader["StudentID"];
string FIO = (string)reader["FIO"];
Метод ExecuteNonQuery() класса SqlCommand возвращает количество строк, затронутых последней инструкцией команды. Как правило, при помощи данного метода выполняются DML- и DDL-инструкции.
Пример.
//строка подключения к БД
string connectionString = @"data source=.\sqlexpress; initial catalog = tempdb; integrated security = true;";
//создание объекта System.Data.SqlClient.
System.Data.SqlClient.SqlConne
//открытие подключения
cn.Open();
System.Data.SqlClient.SqlComma
cn);
//выполнение команды
int cnt = (int)cmd.ExecuteNonQuery();
//закрытие подключения
cn.Close();
System.Console.WriteLine("
В предыдущем примере значения, передаваемые с командой, были встроены в саму команду. Если значения получены из внешнего источника (и безопасность значений не гарантирована), то этого делать ни в коем случае нельзя, поскольку путём простой вставки строки в команду легко изменить её смысл. Вместо этого параметры следует передавать СУБД отдельно – для этого в классе SqlCommand имеется коллекция параметров Parameters.
Обычно параметры добавляются сразу со значением:
System.Data.SqlClient.SqlComma
cmd.Parameters.AddWithValue("
cmd.Parameters.AddWithValue("