Опубликован: 05.08.2007 | Доступ: свободный | Студентов: 2201 / 83 | Оценка: 4.47 / 4.09 | Длительность: 20:11:00
ISBN: 978-5-9556-0097-0
Лекция 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.