Опубликован: 04.05.2010 | Уровень: для всех | Доступ: платный
Лекция 7:

Проектирование баз данных и работа с ними Веб-приложений. Введение в БД, SQL Server, ADO.NET

9.2.2.2.2. Выполнение команд над наборами данных

Одним из основных элементов из набора классов ADO.NET, способным выполнять любой SQL оператор является класс Command. Для того чтобы использовать класс Command необходимо установить тип команды, установить текст запроса SQL и привязать ее к соединению с БД.

Существует 3 типа команд класса Command (табл. 9.8).

Таблица 9.8. Типы команд класса Command
Тип команды Описание
CommandType.Text Выполнение прямого оператора SQL, текст которого устанавливается в свойстве CommandText. Это значение по умолчанию.
CommandType. StoredProcedure Выполнение хранимой процедуры, имя которой установлено в свойстве CommandText.
CommandType. TableDirect Выполняет опрос всей таблицы базы данных, имя которой задается в свойстве CommandText. Этот тип команды используется для обратной совместимости с некоторыми драйверами OLE DB и не поддерживается поставщиком данных SQL Server.

Пример создания объекта Command для выполнения SQL запроса:

SqlCommand command_SQL = new SqlCommand("Select * From FORTEST_Table",sqlCon);
command_SQL.CommandType = CommandType.Text;

Для выполнения созданной команды необходимо использовать один из следующих методов (табл. 9.9).

Таблица 9.9. Методы класса Command
Метод Описание
ExecuteReader() Выполнение запроса SQL и возврат объекта DataReader, представляющего однонаправленный курсор, с доступом только для чтения.
ExecuteNonQuery() Выполнение SQL команд, предназначенных для вставки, изменения, удаления записей БД. Результатом работы команды является количество строк, обработанных командой.
ExecuteScalar() Выполнение SQL команды и возврат первой строки результата запроса. Обычно используется для выполнения команды, содержащей агрегирующие функции типа COUNT(), MAX() и т.д.

Рассмотрим подробнее метод ExecuteReader().

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

SqlDataReader reader_SQL = command_SQL.ExecuteReader();
while (reader_SQL.Read())
{
    //берем данные из rdr_SQL
}
reader_SQL.Close();

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

Использованный подход достаточно трудоемок для того, чтобы его применять на практике для вывода информации, содержащейся в базе данных. В ASP.NET существует несколько более мощных классов, способных производить данную операцию. Одним из таких классов является класс GridView. Применение данного класса позволяет осуществлять вывод информации на экран очень простым способом. В следующем примере показан способ вывода информации, получаемой из БД посредством объекта DataReader:

GridView1.DataSource = reader_SQL;
GridView1.DataBind();
9.2.2.2.3. Использование параметризованных команд

Параметризованная команда – это обычная SQL команда, в тексте которой используются специальные символы, указывающие место для динамической подстановки значений, передаваемых объекту Command через коллекцию Parameters. Например, команда удаления записи из таблицы будет выглядеть следующим образом при использовании параметра.

string strSQLServer = "DELETE FROM FORTEST_Table WHERE Column1=@Parameter";

Здесь @Parameter представляет собой параметр, значение которого должно быть установлено до того, как будет запущено выполнение запроса. Синтаксис параметризованных команд отличается в разных поставщиках данных. Приведенный выше пример справедлив для взаимодействия с SQL Server. Для означивания параметра можно выполнить, например, следующий код:

SqlCommand cmdDeleteSQLServer = new SqlCommand(strSQLServer,sqlCon);
cmdDeleteSQLServer.Parameters.Add("@ProductName", "Text");

Кроме того, что работа с параметризованными запросами проще с точки зрения динамического формирования текста самого запроса, она еще обеспечивает защиту от атаки внедрением SQL.

9.2.2.2.4. Использование хранимых процедур

Хранимая процедура представляет собой набор операторов SQL, сохраненный в базе данных (на стороне сервера), имеющий имя, а также набор параметров, посредством которых могут быть переданы значения в хранимую процедуру. Они подобны процедурам, используемых в языках программирования с той лишь разницей, что в данном случае, предназначены для обработки данных, содержащихся в базе данных.

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

Рассмотрим пример создания и использования простой хранимой процедуры, позволяющей добавить новую запись в таблицу:

CREATE PROCEDURE AddProduct 
@Column1 int, 
	@Column2 varchar(100)
AS
INSERT INTO FORTEST_Table
VALUES(@Column1,@ Column2)

Данная хранимая процедура использует два значения переменных для формирования запроса на добавление данных в таблицу.

Для ее вызова можно воспользоваться объектом SqlCommand. Текст программы, реализующей вызов данной хранимой процедуры, приведен ниже.

SqlCommand command_SQL = new SqlCommand("AddProduct",sqlCon);
command_SQL.CommandType = CommandType.StoredProcedure;
string[] strProduct = tb_AddProduct.Text.Split(new char[] {','});
command_SQL.Parameters.Add(new SqlParameter("@Column1", SqlDbType.Int, 4));
command_SQL.Parameters["@Column1"].Value = Convert.ToInt32(strProduct[0]);
command_SQL.Parameters.Add(new SqlParameter("@Column2", SqlDbType.NVarChar, 100));
command_SQL.Parameters["@Column2"].Value = strProduct[1];
try
{
    sqlCon.Open();
    int k = command_SQL.ExecuteNonQuery();
}
finally
{
sqlCon.Close();
}

В процессе работы данной программы, введенный пользователем текст в элемент TextBox преобразуется в массив строк. В коллекцию Parameters объекта SqlConnection добавляется два параметра, соответствующих параметрам хранимой процедуры. Для них устанавливаются значения, ранее помещенные в массив строк. После чего открывается соединение и посылается запрос на исполнение хранимой процедуры постредством команды ExecuteNonQuery().

Владимир Тадеуш
Владимир Тадеуш
Украина
Кирилл Дубовик
Кирилл Дубовик
Россия, Петрозаводск