为参数化查询的参数赋值时的赋值错误

use*_*275 5 delphi parameters advantage-database-server delphi-xe2 anydac

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

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;
Run Code Online (Sandbox Code Playgroud)

这最终会出现异常:

Exception der Klasse EADSNativeException mit der Meldung'[AnyDAC] [Phys] [ADS] Error 7200:AQE Error:State = 22018;
NativeError = 2112; [iAnywhere Solutions] [Advantage SQL Engine]分配错误'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;
Run Code Online (Sandbox Code Playgroud)

-

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;
Run Code Online (Sandbox Code Playgroud)

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

TLa*_*ama 3

答案 - 只是猜测:

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

AsType值访问:

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

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

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

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

  • @Arioch'The:请停止重复,因为这是错误的。打开 IDE,连接数据库连接,然后自行测试。另外,您没有必要对这里的每一篇帖子展开激烈的讨论 - 这不是聊天室。 (3认同)