gpt4 book ai didi

delphi - 为参数化查询的参数赋值时出现赋值错误

转载 作者:行者123 更新时间:2023-12-03 15:12:59 26 4
gpt4 key购买 nike

我正在使用带有 AnyDac 组件和 Advantage Database 10 的 Delphi XE2。在我的代码中,我使用如下参数化查询:

q.SQL.Text := 'SELECT * FROM Table1 ' +
'LEFT JOIN Table2 ON (Table1.ID = Table1 .ID_Table2) ' +
'WHERE ' +
':0 BETWEEN Table1.StartAm AND Table1.EndeAm ' +
'AND Table2 = :1';
q.Params[0].Value := AStartDateTime;
q.Params[1].Value := AIDRessourcenGruppe;
q.Open;

这最终会导致异常:

Exception der Klasse EADSNativeException mit der Meldung '[AnyDAC][Phys][ADS] Error 7200: AQE Error: State = 22018;
NativeError = 2112; [iAnywhere Solutions][Advantage SQL Engine]Assignment error' aufgetreten.

当然AStartDateTime是一个有效的delphi TDateTime值,AIDRessourcenGruppe是一个整数值。

有趣的是,这两种变体都有效:

q.SQL.Text := 'SELECT * FROM Table1 ' +
'LEFT JOIN Table2 ON (Table1.ID = Table1 .ID_Table2) ' +
'WHERE ' +
':0 BETWEEN Table1.StartAm AND Table1.EndeAm ' +
'AND Table2 = :1';
q.Params[0].AsDateTime:= AStartDateTime;
q.Params[1].AsInteger:= AIDRessourcenGruppe;
q.Open;

-

q.SQL.Text := 'SELECT * FROM Table1 ' +
'LEFT JOIN Table2 ON (Table1.ID = Table1 .ID_Table2) ' +
'WHERE ' +
':SomeDate BETWEEN Table1.StartAm AND Table1.EndeAm ' +
'AND Table2 = :ID_PT_Ressourcengruppe';
q.ParamByName('SomeDate').Value := AStartDateTime;
q.ParamByName('ID_PT_Ressourcengruppe').Value := AIDRessourcenGruppe;
q.Open;

我错过了什么吗?感谢您的帮助!

最佳答案

答案 - 只是猜测:

我想说,对参数的 Value 属性的索引写入访问不能确定参数的数据类型,而命名访问则可以。如果这是正确的,那么您就会遇到麻烦,因为您通过 Variant 类型传递所有值,该类型必须在执行查询之前转换为正确的值格式。但所有这些都只是我的猜测 - 我根本不了解 AnyDAC!

AsType 值访问:

我发布此内容只是因为我不喜欢对参数的 Value 访问被称为专业:-)
最好使用 AsType 类型转换,至少是因为:

  • 它更快,因为您直接说出要传递给某个参数的类型,因此查询参数引擎不需要确定这一点,并且与 Value 访问相比,不需要转换Variant类型

  • 这对您来说更安全,因为您无法通过,例如AsDateTime 访问参数的字符串值,因此您可以针对参数不匹配提供额外的保护

在你的例子中我推荐的是使用索引访问参数,而不是常用的命名,后者需要在访问之前搜索参数列表,而且速度较慢。

关于delphi - 为参数化查询的参数赋值时出现赋值错误,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12089359/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com