Свойства и методы объекта Command
Свойства и методы объекта 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):
Переходим в окно Properties появившегося объекта sqlCommand1, в свойстве "Connection" из выпадающего списка выбираем создание нового подключения (New) (рис. 6.2).
В окне "Свойства связи с данными" настраиваем подключение к базе данных BDTur_firm2 (см. рис. 5.18). На панели компонент появляется объект sqlConnection1 - если бы мы вначале создали и настроили подключение, то в свойстве Connection объекта sqlCommand1 можно было выбрать "Existing/sqlConnection1". Свойство CommandType указывает на тип команды (запроса), который будет направляться к базе данных (рис. 6.3):
Возможны следующие значения:
- Text. Текстовая команда состоит из SQL-конструкции, направляемой к базе данных. Это значение используется по умолчанию.
- StoredProcedure. Текстовая команда состоит из названия хранимой процедуры.
- TableDirect. Текстовая команда состоит из названия таблицы базы данных. В результате извлекается все содержимое таблицы. Эта команда аналогична текстовой команде SELECT * FROM Название_таблицы. Команда TableDirect поддерживается только управляемым поставщиком OLE DB.
Оставляем пока значение по умолчанию. В поле свойства CommandText нажимаем на кнопку
(...) (рис. 6.4):
В появившемся построителе выражений настраиваем извлечение содержимого таблицы "Туры". Обратите внимание на то, что в поле свойства CommandText появилась SQL-конструкция:
SELECT Туры.* FROM Туры
Снова в окне Toolbox переходим на вкладку Data, перетаскиваем на форму объект SqlDataAdapter. В мастере "Data Adapter Configuration Wizard" нажимаем кнопку "Cancel" - у нас уже есть подключение и настроенный объект sqlCommand1, достаточно указать в свойстве Select Command объект sqlCommand1 (рис. 6.5):
Выделяем sqlDataAdapter1, создаем DataSet, нажимая на ссылку "Generate Dataset". В окне "Generate Dataset" оставляем название "DataSet1", нажимаем "OK". В выпадающем списке свойства DataSource элемента управления DataGrid выбираем "datSet11" в качестве источника данных (рис. 6.6):
Наконец в конструкторе формы вызываем метод Fill объекта DataAdapter:
public Form1()
{
InitializeComponent();
sqlDataAdapter1.Fill(dataSet11);
}Запускаем приложение. На форму выводится содержимое таблицы "Туры" (рис. 6.7):
Установим теперь в свойстве CommandType объекта Command значение "StoredProcedure", а в свойстве CommandText введем название имеющейся хранимой процедуры - "[proc10]" (рис. 6.8):
Чтобы избежать проблем со структурой DataSet, удалим имеющийся объект с панели компонент. Дополнительно в окне Solution Explorer удаляем файл DataSet1.xsd. Снова генерируем DataSet и определяем его в качестве источника данных для элемента DataGrid. Запускаем приложение - на форму выводится результат выполнения хранимой процедуры (рис. 6.9):
Таким образом можно извлекать данные из таблиц при помощи 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.
| № | Вид | |
|---|---|---|
| 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).







![Настройка свойств объекта sqlCommand1 для вывода процедуры [proc10]](/EDI/13_04_18_1/1523571786-30342/tutorial/304/objects/6/files/6_8.gif)




