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



我使用的是带有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;

这会导致一个异常:

Klasse EADSNativeException mit der Meldung'[AnyDAC][Phys][ADS]错误7200:AQE错误:状态=22018
NativeError=2112;[iAnywhere解决方案][Advantage SQLEngine]分配错误'aufgetreten。

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

有趣的是,这两种变体起作用:

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访问的参数,所以您有一个额外的保护来防止参数不匹配

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

最新更新