5

我将 Delphi XE2 与 AnyDac Components 和 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;

这最终导致异常:

异常 der Klasse EADSNativeException mit der Meldung '[AnyDAC][Phys][ADS] 错误 7200:AQE 错误:状态 = 22018;
本机错误 = 2112; [iAnywhere 解决方案][Adv​​antage SQL 引擎]分配错误'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;

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

4

1 回答 1

3

答案 - 只是一个猜测:

我会说对参数属性的索引写访问Value不能确定参数的数据类型,而命名访问却可以。如果这是正确的,那么您就有麻烦了,因为您通过Varianttype 传递所有值,在执行查询之前必须将其转换为正确的值格式。但这一切只是我的猜测——我根本不知道 AnyDAC!

AsType 值访问:

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

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

  • 它对你来说更安全,因为你不能将字符串值传递给AsDateTime访问的参数,所以你有一个额外的保护来防止参数不匹配

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

于 2012-08-23T11:21:03.030 回答