
- •Задания для самостоятельной работы
- •Тема 1. Разработка клиентского приложения в среде ado.Net
- •Тема 2. Параллельное выполнение транзакций
- •Тема 3. Использование olap средств (дополнительно)
- •Приложение. Построение клиентского приложения в среде ado.Net
- •Организация интерфейса
- •Аутентификация пользователя
- •Вариант шифрования пароля
- •Выполнение хранимых процедур Подготовка
- •Подготовка соединения
- •Подготовка команды
- •Подготовка параметров
- •Выполнение команды select
- •Выполнение команды select count(*)
- •Выполнение других команд
- •Использование объекта типа DataSet
- •Создание фрагмента базы данных
- •Связывание таблиц с оконными формами
- •Именование объектов
- •Обмен данными с базой данных
- •Редактирование схемы
Подготовка команды
Если нужно выполнить отдельное предложение SQL или процедуру, прежде всего, необходимо подготовить исполняемую команду. Для этого необходимо задать тип команды, ее текст и активное соединение, на котором будет выполняться команда.
Если требуется выполнить команду SQL, тогда тип команды – CommandType.Text, и в качестве текста команды задается SQL–предложение. При этом если в команде используются параметры, они должны быть заданы как именованные параметры с произвольным именем, например, @par, или @DocId. В ADO.NET не поддерживается символ ? в качестве placeholder в командах SQL; вместо него следует использовать произвольное имя параметра: "SELECT A, B, C FROM T WHERE X = @par".
Если требуется выполнить хранимую процедуру, тогда тип команды – CommandType.StoredProcedure, и в качестве текста команды задается имя хранимой процедуры.
Если объект cmd уже был создан ранее (с помощью команды new), тогда остается определить активное соединение, исполняемую команду и ее тип.
cmd.Connection = активное_соединение;
cmd.CommandType = тип_команды;
cmd.CommandText = текст_команды;
Объект cmd можно создать и непосредственно там, где нужно исполнять команду. В этом случае можно воспользоваться следующими методами:
SqlCommand cmd = new SqlCommand("текст_команды", активное_соединение);
cmd.CommandType = тип_команды;
Теперь можно открыть соединение:
con.Open();
выполнить команду:
исполнение_команды;
отображение_результатов;
и закрыть соединение:
con.Close();
Подготовка параметров
Прежде всего, если объект cmd используется неоднократно, следует удалить старые параметры:
cmd.Parameters.Clear();
Если объект cmd создается заново при каждом исполнении, этого можно не делать.
Параметры являются свойством команды и могут подготавливаться двумя способами: так же, как это делалось в ADO, и с помощью собственных возможностей ADO.NET.
В первом случае создается объект типа SqlParameter, определяются его свойства, и объект добавляется к команде:
SqlParameter p1 = new SqlParameter();
p1.ParameterName = "@par";
p1.DbType = тип_данных_параметра;
В этом случае тип данных параметра определяется как DbType.тип и может не соответствовать точно типам данных, существующим в MS SQL Server;
p1.Direction = ParameterDirection.направление;
p1.Value = значение;
cmd.Parameters.Add(p1);
Во втором случае объект типа SqlParameter создается сразу как часть команды, и нужно только доопределить некоторые его свойства:
SqlParameter p1 = cmd.Parameters.Add("имя_параметра", тип_данных_параметра);
В этом случае тип данных параметра определяется через Sqlтип_данных и соответствует типам, используемым в MS SQL Server;
p1.Direction = ParameterDirection.направление;
p1.Value = значение;
Выполнение команды select
Если необходимо выполнить команду SELECT или хранимую процедуру, выполняющую SELECT, при условии, что получаемый результат представляет собой справочные данные, не требующие изменений, чтение получаемых результатов целесообразно выполнять с помощью специального объекта типа DataReader. С помощью этого объекта более эффективно получается read-only, forward-only поток данных:
SqlDataReader dr = cmd.ExecuteReader();
Чтобы получить данные, следует к объекту dr в цикле применять метод Read():
while(dr.Read()){
. . .
}
Само значение получается с помощью методов группы GetXX(номер_колонки);
Здесь ХХ определяет, что именно хотим получить: Name – позволяет получить имя соответствующей колонки, тип данных – значение колонки (тип данных, указанный в методе GetXX(номер_колонки), должен соответствовать типу данных указанной колонки).
Свойство HasRows объекта dr позволяет определить, есть ли строки в результате; если dr.HasRows == true, следовательно, строки есть. Значение dr.HasRows не изменяется при получении данных из потока.