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

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

Передача изменений в базу данных при помощи хранимых процедур MS Access

В "Подключение к базе данных Microsoft Access" мы вызывали запрос файла базы данных MS Access из внешнего приложения. Создадим теперь запросы для добавления, изменения и удаления записей. Скопируйте файл BDTur_firm2.mdb из "Подключение к базе данных Microsoft Access" , назовите его "BDTur_firm3.mdb". Открываем базу, переходим на вкладку "Запросы" и нажимаем дважды на заголовок "Создание запроса в режиме конструктора". Закрываем появившееся окно1Если вы хорошо знаете Microsoft Access, вы можете самостоятельно создать эти запросы в режиме конструктора, выбирая их соответствующие типы. "Добавление таблицы", в главном меню выбираем "Вид \ Режим SQL". В появившееся текстовое поле вводим текст SQL-конструкции:

INSERT INTO Туристы ( Фамилия, Имя, Отчество )
VALUES (@Фамилия, @Имя, @Отчество);

Сохраняем запрос, называя его "myInsertSP". Текст запроса взят из приложения "VisualAllOleDbCommands", и Microsoft Access корректно сохранил его. Однако, если снова открыть "myInsertSP" в режиме конструктора, мы заметим, что его вид изменился (рис. 13.4):

INSERT INTO Туристы ( Фамилия, Имя, Отчество )
VALUES ([@Фамилия], [@Имя], [@Отчество]);
 Запрос myInsertSP в режиме конструктора

Рис. 13.4. Запрос myInsertSP в режиме конструктора

Дело в том, что программа незначительным образом изменяет синтаксис SQL-конструкций, приводя его к своему внутреннему формату. Но сам запрос должен быть верным. Попытка сохранить некорректный запрос приводит к ошибке (рис. 13.5):

INSERT Туристы ( Фамилия, Имя, Отчество )
VALUES ([@Фамилия], [@Имя], [@Отчество]);
 Сообщение об ошибке

Рис. 13.5. Сообщение об ошибке

Аналогичным образом создаем запрос на обновление myUpdateSP:

UPDATE Туристы SET Имя = @Имя, Отчество = @Отчество, Фамилия = @Фамилия
WHERE (Кодтуриста = @Кодтуриста);

Последний запрос myDeleteSP на удаление записей:

DELETE *
FROM Туристы
WHERE (Фамилия=@Фамилия) And (Имя=@Имя) And (Отчество=@Отчество);

В результате в окне базы данных будет четыре запроса (с учетом ранее созданного "Сортировка_туристов"), каждый из них будет отмечен значком, соответствующим его типу (рис. 13.6):

 Окно базы данных BDTur_firm3.mdb после создания всех запросов

Рис. 13.6. Окно базы данных BDTur_firm3.mdb после создания всех запросов

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

using System.Data.OleDb;

В классе формы создаем строку connectionString, а также объекты DataSet и DataAdapter:

string connectionString =
 @"Provider=""Microsoft.Jet.OLEDB.4.0"";Data
 Source=""D:\Uchebnik\Code\Glava6\BDTur_firm3.mdb"
 ";User ID=Admin;Jet OLEDB:Encrypt Database=False";
DataSet dsTourists; 
OleDbDataAdapter dataAdapter;

В конструкторе формы создаем все объекты ADO .NET:

public Form1()
{
	InitializeComponent();
	OleDbConnection conn = new OleDbConnection();
	conn.ConnectionString = connectionString;
	OleDbCommand mySelectCommand = conn.CreateCommand();
	mySelectCommand.CommandText =
	 "SELECT * FROM Туристы";
	dataAdapter = new OleDbDataAdapter();
	dataAdapter.SelectCommand = mySelectCommand;
	dsTourists = new DataSet();
	dataAdapter.Fill(dsTourists);
	dataGrid1.DataSource = dsTourists.Tables[0].DefaultView;
	//InsertCommand
	OleDbCommand myInsertCommand = conn.CreateCommand();
	myInsertCommand.CommandType =
	 CommandType.StoredProcedure;
	myInsertCommand.CommandText = "[myInsertSP]";
	myInsertCommand.Parameters.Add("@Фамилия",
	 OleDbType.VarWChar, 50, "Фамилия");
	myInsertCommand.Parameters.Add("@Имя",
	 OleDbType.VarWChar, 50, "Имя");
	myInsertCommand.Parameters.Add("@Отчество",
	 OleDbType.VarWChar, 50, "Отчество");
	dataAdapter.InsertCommand = myInsertCommand;

	//UpdateCommand
	OleDbCommand myUpdateCommand = conn.CreateCommand();
	myUpdateCommand.CommandType =
	 CommandType.StoredProcedure;
	myUpdateCommand.CommandText = "[myUpdateSP]";
	myUpdateCommand.Parameters.Add("@Имя",
	 System.Data.OleDb.OleDbType.VarWChar, 50, "Имя");
	myUpdateCommand.Parameters.Add("@Отчество",
	 System.Data.OleDb.OleDbType.VarWChar, 50, "Отчество");
	myUpdateCommand.Parameters.Add("@Фамилия",
	 System.Data.OleDb.OleDbType.VarWChar, 50, "Фамилия");
	myUpdateCommand.Parameters.Add(new OleDbParameter("@Кодтуриста",
	 System.Data.OleDb.OleDbType.Integer, 0,
	 System.Data.ParameterDirection.Input, false,
	 ((System.Byte)(0)), ((System.Byte)(0)), "Кодтуриста",
	 System.Data.DataRowVersion.Original, null));
	dataAdapter.UpdateCommand = myUpdateCommand;

	//DeleteCommand
	OleDbCommand myDeleteCommand =
	 conn.CreateCommand();
	myDeleteCommand.CommandType =
	 CommandType.StoredProcedure;
	myDeleteCommand.CommandText = "[myDeleteSP]";
	myDeleteCommand.Parameters.Add("@Фамилия",
	 OleDbType.VarWChar, 50, "Фамилия");
	myDeleteCommand.Parameters.Add("@Имя",
	 OleDbType.VarWChar, 50, "Имя");
	myDeleteCommand.Parameters.Add("@Отчество",
	 OleDbType.VarWChar, 50, "Отчество");
	dataAdapter.DeleteCommand = myDeleteCommand;
}

В обработчике события Closing формы вызываем метод Update объекта DataAdapter:

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

Запускаем приложение. Мы снова можем добавлять, изменять и удалять записи (рис. 13.7):

 Готовое приложение StoredProcedures_in_Access

Рис. 13.7. Готовое приложение StoredProcedures_in_Access

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

Мы рассмотрели более сложный, программный способ работы с внутренними запросами Microsoft Access. Среда Visual Studio .NET предоставляет также графический интерфейс для работы с ними. Переходим на вкладку "Server Explorer", щелкаем правой кнопкой мыши на заголовке "Data Connections" и выбираем пункт меню "Add Connection". В появившемся окне "Свойства связи с данными" настраиваем подключение к базе данных BDTur_firm3.mdb. Раскрываем затем узел базы данных для просмотра его содержимого (рис. 13.8):

 База данных BDTur_firm3.mdb в окне Server Explorer

увеличить изображение
Рис. 13.8. База данных BDTur_firm3.mdb в окне Server Explorer

Запрос "Сортировка_туристов" был отнесен к представлениям базы (Views). Его можно просмотреть, как и таблицы базы данных, дважды щелкая на него. Запросы модификации данных, отнесенные к узлу Stored Procedures, недоступны для непосредственного изменения в среде, в отличие от хранимых процедур MS SQL Server. Мы можем только просмотреть их свойства в окне Properties.

При перетаскивании хранимых процедур на форму создаются соответствующие объекты OleDbCommnad. Дальнейшее создание приложения практически не отличается от рассмотренного выше описания VisualUpdateWithSP.

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