Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
shpory_1-44.docx
Скачиваний:
19
Добавлен:
21.04.2019
Размер:
1.07 Mб
Скачать

30.Ado.Net. Выполнение команд и запросов к бд. Основные свойства и методы: CommandType, ExecuteNonQuery(), ExecuteScalar(), ExecuteReader().

Для выполнения запросов любых типов в ADO.NET используются объекты класса command.

Для создания объекта command существует 2 способа:

  1. использование конструктора. Класс SqlCommand использует несколько перегруженных конструкторов:

  • var cmd_1 = new SqlCommand();

  • var cmd_2 = new SqlCommand (“SELECT * FROM Albums”);

  • var con = new SqlConection();

var cmd_3 = new SqlCommand (“SELECT * FROM Artists”, con);

  1. На основе объекта connection

Связь с соединением должна быть установлена для любой команды перед выполнением. В общем случае для этого используется свойство Connection

SqlConnection c = new SqlConnection();

SqlCommand cmd = new SqlCommand();

cmd.connection = c;

Свойство Command.Type и Command.Text

Command.Text содержит текст программы.

Command.Type определяет как следует понимать этот текст. Оно может принимать значения:

CommandType.Text – для SQL – инструкций

CommandType.StoredProcedure тескт программы который содержит имя хранимой процедуры, которая находиться в БД

CommandType.TableDirect – для извлечения из БД полной таблицы.

Методы выполнения команд: За подготовкой команды следует её выполнение, до выполнения команда должна быть связана с соединением и соединение должно быть открыто

  1. ExecuteNonQuery() применяется для запросов, не возвращающих данные. Этот метод возвращает суммарное число строк добавленных, изменённых или удалённых в результате выполнения команды. Если выполняется DDL запрос, то этот метод возвращает значение -1.

  2. ExecuteScalar() может быть полезен при выполнении запросов или хранимых процедур, возвращающих единственный результат. Данный метод выполняет команду и возвращает 1 столбец 1 строки 1 результирующего набора данных.

  3. ExecuteRader() выполняет команду и возвращает объект DbDataReader. Тип возвращаемого Reader’а соответствует поставщику. Данный метод используется когда требуется получить набор данных из базы.

Поставщик MS SQL Server поддерживает метод выполнения команды, возвращающий объект класса XmlReader

Это метод ExecuteXmlReader(). Метод поддерживается для SQL Server 2000 и более поздние версий требует, чтобы возвращаемые данные были в формате XML.

У поставщика SQL Server реализован ряд методов класса SqlCommand, позволяющие выполнять Асинхронные операции.

Например:

BeginExecuteNonQuery

BeginExecuteReader

BeginExecuteXmlReader

EndExecuteNonQuery

EndExecuteReader

EndExecuteXmlReader

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

//Запрашиваем у пользователя информацию…

Console.Write(“Input name to find the id: “);

cmd.Parameters[@”sp_name”].Value = Console.ReadLine();

// … и возвращаем ему результат

con.Open();

cmd.ExecuteNonQuery();

Console.WriteLine(cmd.Parameters[“@RetVal”].Value);

con.Close();

Чтение из БД – наиболее часто используемая операция. Для этого используется метод ExecuteReader возвращающий объект DataReader. Использование DataReader’а имеет следующие особенности:

  • Reader’ы не создаются при помощи вызова конструктора. Единственный способ создать Reader - выполнить метод ExecuteReader

  • Reader’ы позволяют перемещается по данным наборам строго последовательно в одном направлении. Большинство СУБД выполняют эту операцию достаточно быстро

  • Данные получаемые при помощи Reader’а доступны только для чтения

  • На время чтения данных соответствующее соединение с БД блокируется. Это означает что соединение не может быть использовано другими командами до тех пор, пока чтение данных не завершено.

Основным методом является Read, который перемещает указатель на следующую запись в наборе данных и возвращает false если записи в наборе больше нет

После прочтения всех записей у Reader’a необходимо выполнить метод Close(). Данный метод освобождает соединение, которое было занято Reader’ом

// стандартные подготовительные действия

var con = new SqlConnection {ConnectionString = “…”};

var cmd = new SqlCommand (“Select* FROM Songs”, con);

// открываем соединение и получаем ридер

con.Open();

var r = cmd.ExecuteReader();

// в цикле читаем данные (пока кода в цикле нет!)

while (r.Read()) {}

// закрываем ридер; если необходимо, закрываем соединение

r.Close();

con.Close()

;

Чтобы прочитать данные получаемы Reader’ом существует 2 возможности:

  • использование индексатора Reader’а. В качестве индекса выступает строка с именем столбца, возвращаемое значение имеет тип object поэтому выполняется операция приведения типов.

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

Выполнение поиска столбца по имени требует сравнения строки происходит медленно.

  • используя в качестве индекса номера столбца. В этом случае производительность повышается:

В некоторых ситуациях известно только имя столбца, но его не порядковый номер.

Метод GetOrdinal() принимает строку представляющую имя столбца, и возвращает целое значение, соответствующее порядковому номеру столбца.

Это позволяет достичь компромисса между гибкостью и производительностью:

// Получаем ридер

SqlDataReader r = cmd.ExecuteReader();

// Один раз находим номер столбца по имени (а не в цикле!)

int id_index = r.GetOrdinal(“name”);

// В цикле доступ будет быстрее

while (r.Read()) {Console.WriteLine(r[id_index]+”\t”+r[name_index]);}

Отдельные поля записей набора данных могут иметь null-значения, то есть быть незаполненными. При попытке преобразования null-поля в требуемый тип будет сгенерировано исключение..

Ридер имеет метод IsDBNull(), предназначенный для индикации пустых полей:

If (!r.IsDBNull(id_inex))

Console.Writern(r.GetInt32(id_index))

Метод NextResult() выполняет переход к следующему набору или возвращает false, если такого набора нет.

cmd.CommandText = “SELECT * FROM Albums; SELECT * FROM Songs”;

con.Open();

var r = cmd.ExecuteReader();

// вложенные циклы, внешний – по наборам данных

Do

{

While (r.Read())

{

Cosole.Writeln(r[0]);

}

}

Соседние файлы в предмете [НЕСОРТИРОВАННОЕ]