Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Методичка БД.doc
Скачиваний:
19
Добавлен:
16.11.2019
Размер:
842.75 Кб
Скачать

2.3. Лабораторная работа № 3: транзакции

Задание: Разработать две транзакции для схемы из своего варианта индивидуального задания. Реализовать программу в Delphi, демонстрирующую работу каждой транзакции.

Выполнение.

Используйте программу, разработанную в предыдущей лабораторной работе. Определите транзакции, описав их, как показано в приведенном ниже коде, где TransDesc1 — имя одной из транзакций. Выполнение кода можно связать, например, с нажатием кнопки в окне программы. По окончании выполнения транзакции сообщите, было ли оно успешным, с помощью процедуры ShowMessage или MessageDlg.

procedure Tform1.Button1Click(Sender: TObject);

// объявление переменной, содержащей описание транзакции

var

TransDesc1: TTransactionDesc;

Begin

TransDesc1.TransactionID:= 1;

TransDesc1.IsolationLevel:= xilREADCOMMITTED;

SQLConnection.StartTransaction(TransDesc1);

// блок обработки исключений try…except…end

try

// здесь помещаются все операции над данными, производимые в транзакции

SQLConnection.ExecuteDirect(‘UPDATE Accounts

SET AccountAmount = AccountAmount – 100

WHERE AccountNum = 100100232113 AND AccountAmount >=100 ’);

SQLConnection.ExecuteDirect(‘UPDATE Accounts

SET AccountAmount = AccountAmount + 100

WHERE AccountNum = 458710232198’);

SQLConnection.Commit(TransDesc1);

ShowMessage(‘Транзакция выполнена успешно!’);

except

SQLConnection.Rollback(TransDesc1);

ShowMessage(‘При выполнении транзакции произошла ошибка.’);

end;

End;

Блок обработки исключений tryexceptend позволяет выполнить главное условие транзакции: она или выполняется полностью, или не выполняется совсем. Если при исполнении кода, помещенного до ключевого слова except, произойдет ошибка, все действия над данными, относящиеся к транзакции, будут отменены (Rollback). Если же ошибок не возникнет, метод Commit сохранит произведенные изменения. Убедиться в этом можно, намеренно допустив синтаксическую ошибку в одном из операторов SQL транзакции. В этом случае ошибочный SQL-запрос, как и другие (даже верные) запросы транзакции, не даст результатов.

2.4. Лабораторная работа № 4: отображение данных запроса

Задание: С помощью компонентов SQLConnection, SQLDataSet, DataSetProvider, ClientDataSet, DataSource и DBGrid реализовать простую программу, отображающую результаты выполнения SQL-запросов, описанных в индивидуальном задании. Все запросы должны быть параметризированными.

Выполнение.

Поместите на форму все указанные в задании компоненты. Произведите их настройку (см. лаб. работу № 2). Интерфейс приложения рекомендуется организовать аналогично примеру, приведенному в лаб. работе № 6 по технологии BDE (см. раздел 1).

Для того чтобы можно было выполнять SQL-запросы, установите свойству CommandType компонента SQLDataSet значение ctQuery, a в свойстве CommandText укажите любой SQL-запрос. Этот запрос выполнится первым при запуске вашей программы.

Перед выполнением очередного запроса закройте основной и клиентский наборы данных:

ClientDataSet1.Close;

SQLDataSet1.Close;

Затем присвойте свойству CommandText набора данных SQLDataSet1 строку SQL-запроса:

SQLDataSet1.CommandText:= 'select rec_name from records r

where exists(select * from albums al, artists a

where al.id_artist= a.id_artist and a.a_name=:ANAME

and al.id_album=r.id_album)’;

После этого установите значения параметров запроса следующим образом:

SQLDataSet1.ParamByName('ANAME').AsString:=Edit5.Text;

Внимание: для выполнения запросов, которые не возвращают результатов (например, UPDATE или INSERT), используйте метод

SQLDataSet1.ExecSQL(false);

Значение false, передаваемое методу, говорит о том, что запрос содержит параметры. Вызвав этот метод, присвойте свойству CommandText строку любого SQL-запроса, возвращающего результат (т.е. SELECT).

Теперь откройте наборы данных (рекомендуется выполнять эту операцию в блоке tryexceptend для обработки возможных исключительных ситуаций в случае, если запрос содержит ошибки):

SQLDataSet1.Open;

ClientDataSet1.Open;

Код выполненного SQL-запроса, т.е. значение свойства CommandText, выведите в отведенное для этого поле.