При работе с базами данных Access и DAO возникают ситуации, когда необходимо выполнить список запросов, включающий как запросы действия (action queries), так и запросы выборки (select queries). В случае использования метода Database.Execute() можно выполнить запросы, не возвращающие наборы записей, в то время как для запросов, возвращающих записи, применяется метод Database.OpenRecordset(). Оба метода могут вызвать исключение, если используется неправильный тип запроса.
Проблема
Перед выполнением запросов необходимо определить, будет ли запрос возвращать набор записей или нет, чтобы корректно выбрать метод выполнения.
Решение
Для определения типа запроса можно использовать свойство Type объекта QueryDef, предоставляемого интерфейсом DAO. Это свойство позволяет отличать запросы действия от запросов выборки.
Пример реализации
function TAccessDatabase.SQLExec(AName, AQuery: String): Integer;
var
I: Integer;
QDef: QueryDef;
QDefExists: Boolean;
begin
Result := 0;
// Поиск определения запроса в базе данных
QDefExists := False;
for I := 0 to DB.QueryDefs.Count - 1 do
begin
QDef := DB.QueryDefs[I];
if QDef.Name = AName then
begin
QDefExists := True;
break;
end;
end;
// Создание определения запроса, если оно не существует
if not QDefExists then
begin
QDef := DB.CreateQueryDef(AName, AQuery);
// Обновление необходимо для получения корректного значения QDef.Type
DB.QueryDefs.Refresh;
end;
// Выполнение запроса только если он не является SELECT
if QDef.Type_ <> dbQSelect then
begin
DB.Execute(AQuery, dbInconsistent);
Result := DB.RecordsAffected;
end;
end;
Важные замечания
Использование Database.OpenRecordset() для запросов, возвращающих наборы записей.
Использование Database.Execute() для запросов действия, не возвращающих наборы записей.
Обработка исключений при неправильном использовании методов.
Возможность использования скрытой таблицы MSysObjects для определения типа запроса.
Важно учитывать, что не все запросы SELECT возвращают записи, например, запросы на создание новых таблиц.
Заключение
При выполнении списка запросов к базе данных Access с использованием DAO необходимо заранее определить тип каждого запроса для корректного выбора метода выполнения. Использование свойства Type объекта QueryDef позволяет автоматизировать этот процесс и избежать ошибок при выполнении запросов.
При работе с базами данных Access и DAO необходимо определить тип запроса (действия или выборки) для корректного выполнения с использованием соответствующих методов.
Комментарии и вопросы
Получайте свежие новости и обновления по Object Pascal, Delphi и Lazarus прямо в свой смартфон. Подпишитесь на наш Telegram-канал delphi_kansoftware и будьте в курсе последних тенденций в разработке под Linux, Windows, Android и iOS
Материалы статей собраны из открытых источников, владелец сайта не претендует на авторство. Там где авторство установить не удалось, материал подаётся без имени автора. В случае если Вы считаете, что Ваши права нарушены, пожалуйста, свяжитесь с владельцем сайта.