Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Лекции_CSharp_4.docx
Скачиваний:
37
Добавлен:
02.11.2018
Размер:
237.61 Кб
Скачать

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

Любое действие с базой данных начинается с подключения к базе. Аналогией может служить разговор по телефону. Прежде чем получить некую информацию, необходимо набрать номер, установить соединение, представиться, а лишь только затем обращаться с запросом. В ADO.NET поставщики данных предоставляют собственные классы для описания соединений с базой данных. Так, класс System.Data.SqlClient.SqlConnection используется для соединения с базами данных MS SQL Server версии 7.0 или более поздней.

Класс соединения реализует интерфейс System.Data.IDbConnection. и наследуется от класса System.Data.Common.DbConnection. Элементы интерфейса IDbConnection перечислены в табл. 1. Наиболее важными являются свойство ConnectionString и методы Open() и Close(). Все свойства интерфейса IDbConnection, за исключением ConnectionString, – это свойства только для чтения.

Таблица 1

Элементы интерфейса IDbConnection

Имя элемента

Описание

ConnectionString

Строка, описывающая параметры подключения к базе данных

ConnectionTimeout

Время ожидания открытия подключения (в секундах) перед тем, как возникнет исключение «Невозможно подключиться к базе». По умолчанию – 15 секунд, ноль соответствует бесконечному ожиданию. Значение устанавливается строкой подключения

Database

Имя базы данных, к которой подключаемся. Значение устанавливается строкой подключения, но может быть изменено вызовом метода ChangeDatabase(). Не все поставщики поддерживают это свойство

State

Состояние соединения. Принимает значение из перечисления ConnectionState. В настоящий момент поддерживаются ConnectionState.Open и ConnectionState.Closed

BeginTransaction()

Метод начинает транзакцию в базе данных

ChangeDatabase()

Устанавливает новую базу данных для использования. Является аналогом команды USE в SQL Server. Поставщики для СУБД Oracle не поддерживают этот метод

CreateCommand()

Возвращает объект, реализующий интерфейс IDbCommand (команду), но специфичный для конкретного поставщика данных

Open() и Close()

Попытка соединиться и разъединиться с источником данных

Конкретные поставщики данных могут добавлять дополнительные свойства и методы в класс Connection. Например, класс SqlConnection имеет свойство ServerVersion (строка с информацией о версии СУБД), свойство WorkstationId (строка, идентифицирующая подключившегося клиента), свойство PacketSize (размер пакета обмена с сервером в байтах). Также этот класс поддерживает событие StateChange, которое генерируется при открытии или закрытии соединения, и событие InfoMessage, возникающее, если сервер БД послал строку с предупреждением или ошибкой.

Строка подключения служит для указания параметров подключения к базе данных. В строке подключения через точку с запятой перечислены пары вида «имя параметра =значение». В табл. 2 перечислены некоторые возможные параметры подключения. Не все из них являются обязательными для указания, некоторые специфичны для определенных поставщиков данных. Через наклонную черту указаны возможные альтернативные названия параметров.

Таблица 2

Параметры строки подключения

Имя параметра

Описание параметра

AttachDBFilename /

Initial File Name

Используется при подключении к базе данных, представленной файлом (например, файл .mdf). Обычно вместо этого параметра используется параметр Initial Catalog

Connect Timeout /

Connection Timeout

Время ожидания подключения в секундах. Если подключение не осуществлено по истечении этого времени, генерируется исключение. Значение по умолчанию – 15 секунд

Data Source / Server/

Address / Addr /

Network Address

Имя или сетевой адрес сервера. Для локальных серверов используется значение localhost

Initial Catalog /

Database

Имя базы данных

Integrated Security /

Trusted_Connection

Если установлено в true или SSPI, поставщик данных пытается подключиться к серверу, используя имя и пароль пользователя в системе Windows

Persist Security Info

Если установлено в false (по умолчанию), критическая в плане безопасности информация (например, пароль) удаляется из свойства ConnectionString сразу после осуществления подключения

User ID

Идентификатор пользователя базы данных

Password / Pwd

Пароль пользователя базы данных

Строка подключения к Microsoft SQL Server может иметь несколько дополнительных параметров, перечисленных в табл. 3.

Таблица 3

Дополнительные параметры строки подключения к MS SQL Server

Имя параметра

Описание параметра

Current Language

Язык, используемый SQL Server (при сортировке и т. п.)

Network Library / Net

Сетевая библиотека, которая используется для подключения к SQL Server. Поддерживаемые значения: dbnmpntw (именованные каналы), dbmsrpcn (мультипротокол), dbmsadsn (Apple Talk), dbmsgnet (VIA), dbmsipcn (Shared Memory), dbmsspxn (IPX/SPX) и dbmssocn (TCP/IP) (используется по умолчанию)

Packet Size

Размер в байтах сетевого пакета для обмена с сервером (по умолчанию – 8192 байт)

Workstation ID

Имя рабочей станции, подключающейся к серверу (по умолчанию – это имя компьютера клиента).

Задать строку подключения можно, либо указав её как параметр конструктора класса соединения, либо при помощи свойства ConnectionString. Естественно, строка подключения задается до вызова у соединения метода Open().

Рассмотрим пример кода, в котором создается соединение c БД. В случае поставщика данных MS SQL Server подключение может быть выполнено следующим образом:

var con = new SqlConnection("Data Source=(local);" +

"Initial Catalog=Northwind;" +

"User ID=the_user;" +

"Password=pass123");

con.Open();

Для MS SQL Server обязательным является задание в строке подключения источника данных (Data Source), имени базы (Initial Catalog) и способа аутентификации. Можно применить два способа аутентификации. Если база данных использует встроенную аутентификацию, то передаётся имя пользователя и пароль. MS SQL Server может применять интегрированную Windows-аутентификацию. Тогда в строке подключения указывается "Integrated Security=SSPI".

Предыдущий пример кода демонстрирует очевидное неудобство, возникающее при работе со строками подключения. Параметры строки необходимо помнить и задавать без ошибок, так как эти ошибки будут обнаружены только в момент подключения к базе, но не при компиляции. Для устранения указанных недостатков в поставщиках данных имеется специальный класс, унаследованный от DbConnectionStringBuilder, который предназначен для построения правильных строк подключения. Отдельные параметры строки задаются как типизированные свойства этого класса. Следующий пример демонстрирует использование класса SqlConnectionStringBuilder.

var con_string = new SqlConnectionStringBuilder

{

DataSource = "(local)",

InitialCatalog = "Northwind",

IntegratedSecurity = true

};

var con = new SqlConnection(con_string.ConnectionString);

Приведём два совета, касающихся подключения к базам. Во-первых, строка подключения обычно не записывается в коде программы, а берется из конфигурационного файла. Во-вторых, не забывайте закрывать подключения к базам, так как СУБД имеют лимит на количество одновременных подключений.

Для увеличения производительности приложений поставщики данных могут поддерживать пул соединений (connection pool). Сущность пула заключается в следующем. При вызове метода Close() соединение с базой не разрывается, а помещается в буфер. Если приложение захочет открыть соединение, аналогичное существующему в буфере, то система возвращает открытое подключение из пула1. Какие подключения считаются «аналогичным», зависит от поставщика данных. Например, поставщик для MS SQL Server требует буквального совпадения строк подключения с точностью до символа.

Настройка пула соединений выполняется при помощи параметров в строке подключения. Для поставщика MS SQL Server можно использовать параметры, перечисленные в табл. 4.

Таблица 4

Параметры строки подключения, управляющие пулом соединений

Имя параметра

Описание параметра

Pooling

Булево выражение, определяет необходимость использования пула. Значение по умолчанию – true

Min Pool Size

Минимальное число соединений в пуле в любой момент времени (по умолчанию – 0)

Max Pool Size

Максимальное число соединений в пуле (по умолчанию – 100). Если достигнут лимит соединений, клиент ждет до тех пор, пока не появиться свободное соединение или пока не истечет таймаут установки соединения

Connection Lifetime

Время жизни открытого соединения в пуле (в секундах). Значение по умолчанию – 0, это означает, что Connection Lifetime = Connect Timeout

В заключение параграфа рассмотрим вопросы, связанные с обработкой ошибок при работе с базами данных. Управляемые поставщики обычно содержат специальные классы, описывающие исключения. Для поставщика MS SQL Server это класс SqlException. В классе SqlException доступно свойство Errors ‑ набор объектов типа SqlError. В этих объектах содержится дополнительная информация об определенном исключении, полученная от базы данных. Использование обсуждаемых классов демонстрирует следующий код:

try

{

. . .

}

catch (SqlException ex)

{

string error = ex.Message;

foreach (SqlError err in ex.Errors)

{

error += "Message: " + err.Message + "\n" +

"LineNumber: " + err.LineNumber + "\n" +

"Source: " + err.Source + "\n" +

"Procedure: " + err.Procedure + "\n";

}

}