Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Лекции OOP c#.doc
Скачиваний:
44
Добавлен:
22.09.2019
Размер:
3.38 Mб
Скачать

4.2. Учебная база cd Rent

Опишем простую базу данных, которая будет использоваться в примерах. Назначение базы CD_Rent – хранить информацию о компакт-дисках и о том, кому и когда был предоставлен диск. База состоит из четырех таблиц:

1. Artists. Хранит информацию об исполнителях. Информация о колонках таблицы:

  • id – первичный ключ, тип данных: int2;

  • name – имя исполнителя, тип данных: varchar(50).

2. Disks. Таблица содержит информацию о дисках:

  • id – первичный ключ, тип данных: int;

  • title – название альбома, тип данных: varchar(50);

  • artist_id – идентификатор исполнителя, тип данных: int;

  • release_year – год выпуска альбома, тип данных: char(4), допустимы пустые значения.

3. Users. Таблица с описанием пользователей (тех, кто берет диски):

  • id – первичный ключ, тип данных: int;

  • user_name – имя пользователя, тип данных: varchar(50);

  • user_address – адрес пользователя, тип данных: varchar(50), допустимы пустые значения.

4. Rent. Данная рабочая таблица содержит информацию о том, какой диск кем был взят и когда был возвращен:

  • id – первичный ключ, тип данных: int;

  • user_id – идентификатор пользователя, тип данных: int;

  • disk_id – идентификатор диска, тип данных: int;

  • rent_date – дата, когда взяли диск, тип данных: datetime(8);

  • return_date – дата, когда вернули диск, тип данных: datetime(8), допустимы пустые значения;

  • disk_rate – рейтинг популярности диска, тип данных: float(8), допустимы пустые значения;

Схема связей между таблицами в базе представлена на диаграмме 11.

Рис. 11. Связи между таблицами в базе CD_Rent

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

Любое действие с базой данных начинается с подключения к базе. Аналогией может служить разговор по телефону. Прежде чем получить некую информацию, необходимо набрать номер, установить соединение, представиться, а лишь только затем обращаться с запросом. В ADO.NET поставщики данных предоставляют собственные классы для описания соединений с базой данных:

  • Класс System.Data.SqlClient.SqlConnection используется для соединения с базами данных SQL Server (версии 7.0 или более поздней);

  • Класс System.Data.OleDb.OleDbConnection позволяет подключиться к базам данных через интерфейс OLE DB.

Любой класс соединения реализует интерфейс System.Data.IDbConnection. Свойства и методы данного интерфейса перечислены в таблице 21. Наиболее важными являются свойство ConnectionString и методы Open() и Close(). Все свойства интерфейса IDbConnection – это свойства только для чтения, за исключением ConnectionString.

Таблица 21

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

Свойство или метод 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 (размер пакета обмена с сервером в байтах). Также этот класс (как впрочем, и класс OleDbConnection) поддерживает событие StateChange, которое генерируется при открытии или закрытии соединения, и событие InfoMessage, возникающее, если сервер БД послал строку с предупреждением или ошибкой.

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

Таблица 22

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

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

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

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

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

Persist Security Info

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

User ID

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

Password/Pwd

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

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

Таблица 23

Дополнительные параметры строки подключения к 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 БД. В случае поставщика данных SQL Server подключение может быть выполнено следующим образом:

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

"Initial Catalog=Northwind;" +

"user id=userid;" +

"password=password");

con.Open();

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

Еще два примера показывают подключение к базе при помощи провайдера OLE DB. Данный провайдер можно использовать для работы с SQL Server. В этом случае строка подключения выглядит так:

OleDbConnection con = new OleDbConnection(

"Data Source=(local);" +

"Initial Catalog=Northwind; " +

"user id=sa;password=secret;" +

"Provider=SQLOLEDB");

Как правило, провайдер OLE DB используют для работы с менее мощными СУБД. Следующий пример демонстрирует соединение с базой данных Access через поставщика Jet:

OleDbConnection con = new OleDbConnection(

"Data Source=localhost;" +

"Initial Catalog=c:\Nortwdind.mdb;"+

"Provider=Microsoft.Jet.OLEDB.4.0");

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

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

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

Таблица 24

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

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

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

Pooling

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

Min Pool Size

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

Max Pool Size

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

Connection Lifetime

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

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

try {

. . .

}

catch (SqlException ex) {

string error = "";

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";

}

}