Технология Microsoft ADO.NET

       

Объект Command Builder


Самым сложным во всех рассмотренных примерах передачи изменений в базу данных является описание параметров. В самом деле, мы должны указывать название, тип данных, а также значение передаваемого параметра - поскольку их может быть много, понятно, что наибольшую часть кода будет занимать именно создание набора Parameters. С другой стороны, данные, которые нуждаются в обновлении, каким-то способом уже прочитаны из базы и выведены на форму. Следовательно, сам факт их вывода указывает на успешное взаимодействие с базой. Возникает логичный вопрос: а можно ли вообще избежать описания параметров для передачи изменений, раз уж данные прочитаны? Ответ - можно, для этого мы должны применять объект CommandBuilder, который предоставит возможность сделать это, если выполняются следующие условия:

  • запрос возвращает данные только из одной таблицы;
  • таблица содержит первичный ключ;
  • возвращаемый запрос содержит первичный ключ.

В коде объект CommandBuilder связывается с уже имеющимся экземпляром dataAdapter так:

SqlCommandBuilder commandBuilder = new SqlCommandBuilder(dataAdapter);

Создайте новое приложение и назовите его "CommandBuilder". Перетаскиваем на форму элемент управления DataGrid, его свойству Dock устанавливаем значение "Fill". Подключаем пространство имен для работы с базой данных:

using System.Data.SqlClient;

В классе формы создаем строку подключения, а также объекты DataSet и dataAdapter:

string connectionString = "integrated security=SSPI;data source=\".\"; persist security info=False; initial catalog=BDTur_firm2"; DataSet dsTourists; SqlDataAdapter dataAdapter;

В классе формы мы создаем самый обычный набор объектов ADO .NET и добавляем одной строкой объект CommandBuilder:

public Form1() { InitializeComponent(); SqlConnection conn = new SqlConnection(); conn.ConnectionString = connectionString; SqlCommand mySelectCommand = conn.CreateCommand(); mySelectCommand.CommandText = "SELECT * FROM Туристы"; dataAdapter = new SqlDataAdapter(); dataAdapter.SelectCommand = mySelectCommand; dsTourists = new DataSet(); dataAdapter.Fill(dsTourists); dataGrid1.DataSource = dsTourists.Tables[0].DefaultView; SqlCommandBuilder commandBuilder = new SqlCommandBuilder(dataAdapter); }


В обработчике события Closing формы передаем изменения в базу данных:

private void Form1_Closing(object sender, System.ComponentModel.CancelEventArgs e) { try { if (dsTourists.HasChanges()) { dataAdapter.Update(dsTourists); } } catch(Exception ex) { MessageBox.Show(ex.ToString()); } }

Запускаем приложение. Это кажется странным, но мы снова можем вставлять, изменять и удалять записи!

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

Объект CommandBuilder применим для обновления данных, полученных в результате извлечения хранимой процедуры. Создайте новое приложение и назовите его "CommandBuilderSP". Переходим на вкладку "ServerExplorer" в узле базы данных BDTur_firm2 и создаем новую хранимую процедуру:

CREATE PROCEDURE mySelectSP

AS SELECT * FROM Туристы RETURN

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

public Form1() { InitializeComponent(); SqlConnection conn = new SqlConnection(); conn.ConnectionString = connectionString; SqlCommand mySelectCommand = conn.CreateCommand(); mySelectCommand.CommandType = CommandType.StoredProcedure; mySelectCommand.CommandText = "[mySelectSP]"; dataAdapter = new SqlDataAdapter(); dataAdapter.SelectCommand = mySelectCommand; dsTourists = new DataSet(); dataAdapter.Fill(dsTourists); dataGrid1.DataSource = dsTourists.Tables[0].DefaultView; SqlCommandBuilder commandBuilder = new SqlCommandBuilder(dataAdapter); }

Все остальные части приложения будут в точности такими же, как и в CommandBuilder. Конечно, в этом примере можно обойтись и без хранимой процедуры, поскольку SQL-конструкция в ней предельно проста. Однако для нас важна методика применения объекта CommandBuilder - в случае даже самых изощренных запросов на выборку она будет той же самой.

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

Для работы с базой данных Microsoft Access применяется объект OleDbCommandBuilder:

OleDbCommandBuilder commandBuilder1 = new OleDbCommandBuilder(dataAdapter);

Несмотря на простоту использования объекта CommandBuilder, этот способ передачи изменений не является максимально производительным. Один из его главных недостатков также - невозможность передачи обновлений с помощью хранимых процедур типа INSERT, UPDATE и DELETE.


Содержание раздела