В процессе работы с базами данных Access и использованием компонента ADOQuery в Delphi может возникнуть ошибка "Missing SQL property", когда вы пытаетесь выполнить операцию вставки данных. Давайте разберемся, как можно решить эту проблему на примере.
Описание проблемы
Пользователь столкнулся с ошибкой "Missing SQL property" при попытке выполнить вставку одной записи в таблицу Access с помощью ADOQuery. Таблица для вставки содержит три поля: StockID (AutoNumber), Description (Text), Cost (Number). В коде использовалась прямая вставка значений, но при выполнении появлялась ошибка.
Для корректной вставки данных следует использовать параметризованный запрос, что позволит избежать многих потенциальных проблем, включая уязвимости типа SQL-инъекций. Вот пример кода, который правильно вставляет запись:
x := StrToInt(txtStockID.Text);
y := txtDescription.Text;
z := StrToCurr(txtCost.Text);
adoQuery1.SQL.Clear;
adoQuery1.SQL.Add('INSERT INTO tblStock (StockID,Description,Cost)');
adoQuery1.SQL.Add('VALUES (:StockID,:Description,:Cost)');
adoQuery1.Parameters.ParamByName('StockID').Value := x;
adoQuery1.Parameters.ParamByName('Description').Value := y;
adoQuery1.Parameters.ParamByName('Cost').Value := z;
adoQuery1.ExecSQL;
Обратите внимание, что свойство Active не должно быть установлено в true, а метод Open не используется для выполнения операций вставки, обновления или удаления (DML). Вместо этого следует использовать метод ExecSQL.
Важные замечания
В строковых литералах используйте двойные апострофы (''Cheese'') или функцию QuotedStr('Cheese').
Не забудьте удалить строку adoQuery1.Active := true;.
Вызов adoQuery1.Close; не требуется после ExecSQL.
Альтернативный подход
Для упрощения выполнения SQL-запросов с параметрами можно использовать вспомогательные функции:
function TCore.ExecQuery(const ASQL: String; const AParamNames: array of string; const AParamValues: array of Variant): Integer;
begin
// Код функции...
end;
function TCore.GetQuery(const ASQL: String): TDataSet;
begin
// Код функции...
end;
procedure TCore.SetParamValue(AQuery: TDataSet; const AName: string; const AValue: Variant);
begin
// Код процедуры...
end;
Использование этих функций позволяет легко выполнить запрос:
Использование параметризованных запросов упрощает поддержку кода и повышает его безопасность.
Пользователь сталкивается с ошибкой 'Missing SQL property' при попытке вставки данных в базу данных Access через компонент ADOQuery в Delphi, что требует исправления с использованием параметризованных запросов для корректного выполнения операции и повыше
Комментарии и вопросы
Получайте свежие новости и обновления по Object Pascal, Delphi и Lazarus прямо в свой смартфон. Подпишитесь на наш Telegram-канал delphi_kansoftware и будьте в курсе последних тенденций в разработке под Linux, Windows, Android и iOS