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

Свойства и методы объекта Command

< Лекция 5 || Лекция 6: 123456 || Лекция 7 >
Аннотация: Объект Command. Свойства CommandType и CommandText. Методы ExecuteNonQuery, ExecuteScalar и ExecuteReader объекта Command. Объект DataReader. Применение методов объекта Command в Windows-приложениях. Параметризированные запросы. Вывод данных, полученных объектом DataReader, в элементы управления ListBox, ListView, DataGrid

Свойства и методы объекта Command

Объект Command. Свойства CommandType и CommandText

При определении объектов ADO .NET мы назвали DataAdapter адаптером, преобразователем, предназначенным для взаимодействия с базой данных. Это действительно так, однако если рассматривать взаимодействие с базой данных более глубоко, то выясняется, что в ADO .NET есть специализированный объект для выполнения запросов, называемый Command. Под запросами понимается выполнение SQL-конструкций или запуск хранимых процедур. С объектом Command мы познакомились еще во "Объекты ADO .NET" , но у вас могло сложиться впечатление, что его введение достаточно формально - вполне можно обойтись одним объектом DataAdapter. Например, в приложении VisualDataAdapterSP мы создавали и выполняли хранимые процедуры, настраивая DataAdapter без всякого объекта Command! В действительности, среда создала его неявным образом - открываем метод InitializeComponent и видим объявление sqlSelectCommand1, а также описание нескольких его свойств:

private void InitializeComponent()
	{
...
this.sqlSelectCommand1 = new System.Data.SqlClient.SqlCommand();
		...
// 
// sqlSelectCommand1
// 
this.sqlSelectCommand1.CommandText = "[proc_da1]";
this.sqlSelectCommand1.CommandType = System.Data.CommandType.StoredProcedure;
this.sqlSelectCommand1.Connection = this.sqlConnection1;
this.sqlSelectCommand1.Parameters.Add(new System.Data.SqlClient.SqlParameter
 ("@RETURN_VALUE", System.Data.SqlDbType.Int, 4, 
 System.Data.ParameterDirection.ReturnValue, false, ((System.Byte)(0)),
 ((System.Byte)(0)), "", System.Data.DataRowVersion.Current, null));
...

Нам нужно научиться понимать это описание и создавать его программным образом. Среда Visual Studio .NET содержит инструменты для визуальной настройки объекта Command, и поскольку разобраться в них проще, чем в коде, начнем с них. Создайте новое Windows-приложение и назовите его "VisualCommand". Добавляем элемент управления DataGrid, его свойству Dock устанавливаем значение Fill. В окне ToolBox переходим на вкладку Data, перетаскиваем на форму объект SqlCommand (рис. 6.1):

Окно Toolbox, вкладка Data

Рис. 6.1. Окно Toolbox, вкладка Data

Переходим в окно Properties появившегося объекта sqlCommand1, в свойстве "Connection" из выпадающего списка выбираем создание нового подключения (New) (рис. 6.2).

Свойство "Connection" объекта sqlCommand1

Рис. 6.2. Свойство "Connection" объекта sqlCommand1

В окне "Свойства связи с данными" настраиваем подключение к базе данных BDTur_firm2 (см. рис. 5.18). На панели компонент появляется объект sqlConnection1 - если бы мы вначале создали и настроили подключение, то в свойстве Connection объекта sqlCommand1 можно было выбрать "Existing/sqlConnection1". Свойство CommandType указывает на тип команды (запроса), который будет направляться к базе данных (рис. 6.3):

Свойство CommandType объекта sqlCommand1

Рис. 6.3. Свойство CommandType объекта sqlCommand1

Возможны следующие значения:

  • Text. Текстовая команда состоит из SQL-конструкции, направляемой к базе данных. Это значение используется по умолчанию.
  • StoredProcedure. Текстовая команда состоит из названия хранимой процедуры.
  • TableDirect. Текстовая команда состоит из названия таблицы базы данных. В результате извлекается все содержимое таблицы. Эта команда аналогична текстовой команде SELECT * FROM Название_таблицы. Команда TableDirect поддерживается только управляемым поставщиком OLE DB.

Оставляем пока значение по умолчанию. В поле свойства CommandText нажимаем на кнопку(...) (рис. 6.4):

Свойство CommandText объекта sqlCommand1

Рис. 6.4. Свойство CommandText объекта sqlCommand1

В появившемся построителе выражений настраиваем извлечение содержимого таблицы "Туры". Обратите внимание на то, что в поле свойства CommandText появилась SQL-конструкция:

SELECT Туры.* FROM Туры

Снова в окне Toolbox переходим на вкладку Data, перетаскиваем на форму объект SqlDataAdapter. В мастере "Data Adapter Configuration Wizard" нажимаем кнопку "Cancel" - у нас уже есть подключение и настроенный объект sqlCommand1, достаточно указать в свойстве Select Command объект sqlCommand1 (рис. 6.5):

Свойство SelectCommand объекта sqlDataAdapter1

Рис. 6.5. Свойство SelectCommand объекта sqlDataAdapter1

Выделяем sqlDataAdapter1, создаем DataSet, нажимая на ссылку "Generate Dataset". В окне "Generate Dataset" оставляем название "DataSet1", нажимаем "OK". В выпадающем списке свойства DataSource элемента управления DataGrid выбираем "datSet11" в качестве источника данных (рис. 6.6):

Свойство DataSource элемента dataGrid1

Рис. 6.6. Свойство DataSource элемента dataGrid1

Наконец в конструкторе формы вызываем метод Fill объекта DataAdapter:

public Form1()
		{
			InitializeComponent();
			sqlDataAdapter1.Fill(dataSet11);
		}

Запускаем приложение. На форму выводится содержимое таблицы "Туры" (рис. 6.7):

Приложение VisualCommand, вывод таблицы "Туры"

Рис. 6.7. Приложение VisualCommand, вывод таблицы "Туры"

Установим теперь в свойстве CommandType объекта Command значение "StoredProcedure", а в свойстве CommandText введем название имеющейся хранимой процедуры - "[proc10]" (рис. 6.8):

Настройка свойств объекта sqlCommand1 для вывода процедуры [proc10]

Рис. 6.8. Настройка свойств объекта sqlCommand1 для вывода процедуры [proc10]

Чтобы избежать проблем со структурой DataSet, удалим имеющийся объект с панели компонент. Дополнительно в окне Solution Explorer удаляем файл DataSet1.xsd. Снова генерируем DataSet и определяем его в качестве источника данных для элемента DataGrid. Запускаем приложение - на форму выводится результат выполнения хранимой процедуры (рис. 6.9):

Приложение VisualCommand, извлечение хранимой процедуры proc10

увеличить изображение
Рис. 6.9. Приложение VisualCommand, извлечение хранимой процедуры proc10

Таким образом можно извлекать данные из таблиц при помощи SQL-конструкций и запускать хранимые процедуры таблицы 5.1. Поставщик данных SQL Server не поддерживает значение TableDirect свойства CommandType - при его выборе появляется диагностическое сообщение об ошибке. Это значение можно применять при подключении к базе данных Microsoft Access.

В программном обеспечении к курсу вы найдете приложение Visual Command (Code\Glava3\ VisualCommand).

Перейдем теперь к реализации аналогичного приложения без применения визуальных средств студии для объектов ADO .NET. Создайте новое Windows-приложение и назовите его "ProgrammCommand". Перетаскиваем на форму элемент управления DataGrid, его свойству Dock устанавливаем значение "Fill". В классе формы создаем строки connectionString и commandText:

string connectionString = "integrated security=SSPI;
 data source=\".\"; persist security info=False;
 initial catalog=BDTur_firm2";
string commandText = "SELECT * FROM Туры";

Конструктор формы будет иметь следующий вид:

public Form1()
{		
	InitializeComponent();
	SqlConnection conn = new SqlConnection(connectionString);
	SqlCommand myCommand = new SqlCommand();
	myCommand.Connection = conn;
	myCommand.CommandText = commandText;
	SqlDataAdapter dataAdapter = new SqlDataAdapter();
	dataAdapter.SelectCommand = myCommand;
	DataSet ds = new DataSet();
	conn.Open();
	dataAdapter.Fill(ds, "Туры");
	conn.Close();
	dataGrid1.DataSource = ds;
}

Запускаем приложение. На форму выводится содержимое таблицы "Туры" (см. рис. 6.7). Здесь мы используем всего один объект DataAdapter, который сам открывает и закрывает соединение для получения данных. Поэтому можно не вызывать методы Open и Close объекта conn. Конструктор объекта SqlCommand может принимать значения, указанные в таблице 6.1.

Таблица 6.1. Конструктор объекта SqlCommand1Конструктор объекта OleDbCommand в точности такой же.
Вид
1

Пример 2Приводится только создание объекта SqlTransaction, без его методов, - см далее "Вызов хранимых процедур. Работа с транзакциями" , тему "Работа с транзакциями". Описание
public Form1()
{		
InitializeComponent();
SqlConnection  conn =
 new SqlConnection(connectionString);
SqlTransaction trans = conn.BeginTransaction();
SqlCommand myCommand =
 new SqlCommand(commandText, conn, trans);
//SqlCommand  myCommand = 
// new SqlCommand("SELECT * FROM Туры", conn, trans);
SqlDataAdapter dataAdapter = new SqlDataAdapter();
dataAdapter.SelectCommand = myCommand;
DataSet ds = new DataSet();
dataAdapter.Fill(ds, "Туры");
dataGrid1.DataSource = ds;		
}
Первый параметр - строка commandText, причем можно сразу задавать SQL-конструкцию без создания строки в классе. Затем экземпляры объектов SqlConnection и SqlTransaction. Подробно о транзакциях см. далее
Вид
2

Пример Описание
public Form1()
{		
InitializeComponent();
SqlConnection  conn =
 new SqlConnection(connectionString);
SqlCommand  myCommand =
 new SqlCommand(commandText, conn);
//SqlCommand  myCommand =
// new SqlCommand("SELECT * FROM Туры", conn);
SqlDataAdapter dataAdapter = new SqlDataAdapter();
dataAdapter.SelectCommand = myCommand;
DataSet ds = new DataSet();
dataAdapter.Fill(ds, "Туры");
dataGrid1.DataSource = ds;	
}
Вариант без экземпляра объекта SqlTransaction
Вид
3

Пример Описание
public Form1()
{
SqlConnection  conn =
 new SqlConnection(connectionString);
SqlCommand  myCommand =
 new SqlCommand(commandText);
//SqlCommand  myCommand =
//  new SqlCommand("SELECT * FROM Туры");
myCommand.Connection = conn;
SqlDataAdapter dataAdapter =
 new SqlDataAdapter();
dataAdapter.SelectCommand = myCommand;
DataSet ds = new DataSet();
dataAdapter.Fill(ds, "Туры");
dataGrid1.DataSource = ds;	
}
Конструктор принимает в качестве параметра только строку commandText. Для указания соединений используем свойство Connection созданного экзмепляра myCommand
Вид
4
Пример Описание
public Form1()
{
SqlConnection  conn =
 new SqlConnection(connectionString);
SqlCommand  myCommand = new SqlCommand();
myCommand.Connection = conn;
myCommand.CommandText = commandText;
//Command.CommandText = "SELECT * FROM Туры";
SqlDataAdapter dataAdapter = new SqlDataAdapter();
dataAdapter.SelectCommand = myCommand;
DataSet ds = new DataSet();
dataAdapter.Fill(ds, "Туры");
dataGrid1.DataSource = ds;
}
Конструктор не принимает параметров. Для указания соединения и строки commandText вызываем соответствующие свойства созданного экземпляра myCommand. Строке commandText можно передать SQL-конструкцию непосредственно - в этом случае создавать переменную в классе не нужно

Первый вариант конструктора обеспечивает самую компактную форму записи. Его можно использовать при работе с одним соединением с базой данных. В случае работы с несколькими соединениями удобнее определить значения командных строк в классе формы (или вообще в отдельном классе) и использовать четвертый вариант. При изменении параметров подключения нужно будет исправить только сами строки, не затрагивая код, относящийся к объекту Command.

Для вывода хранимой процедуры следует указать значение "Stored Procedure" свойства CommandType:

public Form1()
{
SqlConnection conn =
 new SqlConnection(connectionString);
SqlCommand myCommand =
 new SqlCommand();
myCommand.Connection = conn;
myCommand.CommandType =
 CommandType.StoredProcedure;
myCommand.CommandText = "[proc10]";
SqlDataAdapter dataAdapter =
 new SqlDataAdapter();
dataAdapter.SelectCommand = myCommand;
DataSet ds = new DataSet();
dataAdapter.Fill(ds, "Туры");
dataGrid1.DataSource = ds;
}

Название процедуры можно также присвоить переменной commandText, созданной в классе формы.

В программном обеспечении к курсу вы найдете приложение Programm Command (Code\Glava3\ ProgrammCommand).

< Лекция 5 || Лекция 6: 123456 || Лекция 7 >
Александра Тимофеева
Александра Тимофеева
Украина, Киев
Bakke Aleksander
Bakke Aleksander
Россия, Mуниципальный округ N 4