При работе с компонентом 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)';
И установить соответствующие значения для каждого параметра:
Исправление ошибки в процедуре Delphi, связанной с неправильным использованием параметров в запросе `TADOQuery` при генерации и управлении токенами в базе данных.
Комментарии и вопросы
Получайте свежие новости и обновления по Object Pascal, Delphi и Lazarus прямо в свой смартфон. Подпишитесь на наш Telegram-канал delphi_kansoftware и будьте в курсе последних тенденций в разработке под Linux, Windows, Android и iOS
Материалы статей собраны из открытых источников, владелец сайта не претендует на авторство. Там где авторство установить не удалось, материал подаётся без имени автора. В случае если Вы считаете, что Ваши права нарушены, пожалуйста, свяжитесь с владельцем сайта.