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

Передача изменений в базу данных при помощи хранимых процедур. Объект CommandBuilder

Объект 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.

Александра Тимофеева
Александра Тимофеева
Украина, Киев
Bakke Aleksander
Bakke Aleksander
Россия, Mуниципальный округ N 4