Украина, Киев |
Передача изменений в базу данных при помощи хранимых процедур. Объект 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.