Связный уровень взаимодействия ADO.NET

Работа со связным слоем позволяет взаимодействовать с базой данных, используя объекты соединения, команд и чтения данных.

Первым шагом в работе с поставщиком данных является создание соединения, для чего используется объект соединения, производный от DbConnection.

Предположим, что в файле конфигурации указаны строки соединения и поставщика данных:

 

< cоnfiguration>

<appSettings>

<!-- Какой поставщик? -->

<add key="provider" value="System.Data.SqlClient" />

<!-- Какая строка соединения? -->

<add key="cnStr" value=

"Data Source=localhost;uid=sa;pwd=;Initial Catalog=Pubs"/> </appSettings>

</configuration>

 

Тогда соответствующий программный код для соединения может выглядеть следующим образом:

 

// Получение строк соединения и поставщика данных

// из конфигурационного файла

string dp = ConfigurationManager.AppSettings("provider");

string cnStr = ConfigurationManager.AppSettings("cnStr");

// Создание источника поставщика.

DbProviderFactory df = DbProviderFactories.GetFactory(dp);

// Создание объекта соединения

DbConnection сn = df.CreateConnection();

cn.CornneccionString = cnStr;

cn.Open();

 

Далее необходимо разместить и настроить объект команды, передав ему объект соединения в виде аргумента конструктора или с помощью свойства Connection. Вид соответствующей команды указывается с помощью свойства CommandType, которое может принимать значения StoredProcedure, TableDirect, и по умолчанию принимает значение Text.

 

//Создание объекта команды

DbCommand cmd = df.CreateComnmand();

cmd.Connection = cn;

cmd.CommandText = "Select * From Authors";

 

Следует понимать, что в этот момент еще не предъявляется запрос базе данных непосредственно, а только подготавливается объект команды, для использования в будущем.

После создания активного соединения и SQL-команды следующим шагом является предъявление запроса источнику данных. Тип DbDataReader (реализующий IDataReader) обеспечивает самый простой и самый быстрый способ получения информации из хранилища данных. Объекты чтения данных создают однонаправленный и доступный только для чтения поток данных, возвращающий по одной записи за один раз. Поэтому должно быть вполне очевидно, что объекты чтения данных используются для отправки хранилищу данных только SQL-операторов выборки данных.

Объекты чтения данных оказываются полезными тогда, когда требуется очень быстро просмотреть большой объем данных и при этом нет необходимости заботиться об их представлении в памяти. Например, если запрашивается 20000 записей из таблицы для того, чтобы сохранять их в текстовом файле, то при хранении этой информации в DataSet возникает достаточно большая нагрузка на память. Более выгодным решением оказывается создание объекта чтения данных, который будет обрабатывать каждую запись настолько быстро, насколько это возможно. Но при этом следует учитывать то, что объекты чтения данных (в отличие от объектов адаптера данных, которые будут рассмотрены позже) поддерживают открытое соединение с источником данных, пока явно не закроется сеанс связи.

Объекты чтения данных получаются из объекта команды с помощью вызова ExecuteReader(). При вызове этого метода объекту чтения данных можно дополнительно дать инструкцию автоматически закрыть соответствующий объект соединения, указав CommandBehavior.CloseConnection.

После подготовки можно, наконец, обработать каждую запись, используя метод Read() объекта чтения данных.

 

// Вывод данных с помощью объекта чтения данных

DbDataReader dr = cmd.ExecuteReader(CommandBehavior.CloseConnection);

while (dr.Read())

Console.WriteLine("{0}, {1}", dr[au.lname"], dr[au.fname");

// Поскольку был указан CommandBehavior.CloseConnection,

// то для соединения нет необходимости явно вызывать Close()

dr.Close();

 

Однако, если необходимо применить команду, в результате которой должна произойти модификация таблицы, то нужно вызвать метод ExecuteNonQuery. Этот метод выполняет вставки, обновления и удаления в соответствии с форматом соответствующей команды.

Также, объекты команд ADO.NET поддерживают коллекцию дискретных типов параметра. По умолчанию эта коллекция пуста, но можно добавить в нее любое число объектов параметра, которые должны будут отображаться в "заместитель" параметра в SQL-запросе. Чтобы ассоциировать параметр в SQL-запросе с членом коллекции параметров данного объекта команды, нужно добавить к текстовому SQL-параметру префикс @ (это работает, как минимум, при использовании Microsoft SQL Server, но такое обозначение поддерживают не все СУБД).

 

string sql = string.Format("Insert Into Inventory" + "(CarlD, Make, Color, PetName, Values" + "(@CarID, @Make, @Color, @PetName)");

// Наполнение коллекции параметров

SqlParameter param = new SqlParameter();

param.ParameterName = "@СагID";

param.Value = newCarID;

param.SqlDbType = SqlDbType.Int;

cmd.Parameters.Add(param);