Карта сайта Kansoftware
НОВОСТИУСЛУГИРЕШЕНИЯКОНТАКТЫ
KANSoftWare

Исправление ошибки в процедуре Delphi для генерации и управления токенами в базе данных

Delphi , Базы данных , ADO

При работе с компонентом TADOQuery в Delphi может возникнуть ошибка, связанная с неправильно определенными параметрами запроса. Это может произойти, если в SQL-запросе используется один и тот же параметр более одного раза, что не поддерживается ADO. Давайте разберемся, как исправить эту ошибку на примере процедуры, которая генерирует случайный токен и вставляет его в базу данных, обновляя его, если пользователь уже имеет токен, или вставляя новый, если токена нет.

Оригинальный код процедуры:

procedure createToken(BenuNr: integer);
var
  AQ_Query:       TADOQuery;
  strToken:       string;
  intZaehler:     integer;
  const cCharSet: string = 'abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789';
begin
    // Генерация случайной строки в качестве токена
    SetLength(strToken, 8);
    for intZaehler := 1 to 8 do
    begin
      strToken[intZaehler] := cCharSet[1+Random(Length(cCharSet))];
    end;
    // Вставка токена в базу данных
    with AQ_Query do
    begin
      try
        AQ_Query := TADOQuery.Create(nil);
        ConnectionString := strConnectionString;
        SQL.Text := 'if EXISTS(select * from TOKN where BENU_NR = :paramBenu_NR) begin update TOKN set TOKEN = :paramTOKEN where BENU_NR = :paramBenu_NR end else insert into TOKN (BENU_NR, TOKEN) values (:paramBENU_NR,:paramTOKEN)';
        Prepared := true;
        Parameters.ParamByName('paramBENU_NR').DataType := ftInteger;
        Parameters.ParamByName('paramTOKEN').DataType := ftString;
        Parameters.ParamByName('paramBENU_NR').Value := BenuNr;
        Parameters.ParamByName('paramTOKEN').Value := strToken;
        ExecSQL;    // Здесь возникает ошибка
      finally
        Free;
      end;
    end;
end;

Ошибка:

При выполнении данной процедуры возникает исключение, связанное с неправильно определенными параметрами. Ошибка возникает из-за того, что в SQL-запросе используется один и тот же параметр :paramBenu_NR дважды, что не допускается ADO.

Исправление:

Чтобы исправить ошибку, необходимо использовать разные имена для параметров в SQL-запросе:

SQL.Text := 'if EXISTS(select * from TOKN where BENU_NR = :paramBenuNr) begin update TOKN set TOKEN = :paramToken where BENU_NR = :paramBenuNrEnd end else insert into TOKN (BENU_NR, TOKEN) values (:paramBenuNrValue,:paramTokenValue)';

И установить соответствующие значения для каждого параметра:

Parameters.ParamByName('paramBenuNr').Value := BenuNr;
Parameters.ParamByName('paramToken').Value := strToken;
Parameters.ParamByName('paramBenuNrValue').Value := BenuNr;
Parameters.ParamByName('paramTokenValue').Value := strToken;

Важные моменты:

  • Убедитесь, что все параметры используются только один раз в SQL-запросе.
  • Порядок добавления параметров не важен, но важно, чтобы каждый параметр был уникален.
  • Проверьте, что все параметры имеют правильно установленные типы данных и значения перед выполнением запроса.

Альтернативные подходы:

  • Отключите подготовку запроса, установив Prepared в False.
  • Используйте хранимые процедуры для управления транзакциями вставки/обновления.
  • Используйте встроенные переменные вместо параметров, если это поддерживается вашей СУБД (например, для MSSQL).

Применение этих рекомендаций поможет избежать ошибок, связанных с неправильным использованием параметров в запросах TADOQuery.

Создано по материалам из источника по ссылке.

Исправление ошибки в процедуре Delphi, связанной с неправильным использованием параметров в запросе `TADOQuery` при генерации и управлении токенами в базе данных.


Комментарии и вопросы

Получайте свежие новости и обновления по Object Pascal, Delphi и Lazarus прямо в свой смартфон. Подпишитесь на наш Telegram-канал delphi_kansoftware и будьте в курсе последних тенденций в разработке под Linux, Windows, Android и iOS




Материалы статей собраны из открытых источников, владелец сайта не претендует на авторство. Там где авторство установить не удалось, материал подаётся без имени автора. В случае если Вы считаете, что Ваши права нарушены, пожалуйста, свяжитесь с владельцем сайта.


:: Главная :: ADO ::


реклама


©KANSoftWare (разработка программного обеспечения, создание программ, создание интерактивных сайтов), 2007
Top.Mail.Ru

Время компиляции файла: 2024-12-22 20:14:06
2025-03-13 20:50:25/0.0034239292144775/0