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

时间:2012-08-23 10:10:10

标签: delphi parameters delphi-xe2 advantage-database-server 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;

这最终会出现异常:

  

Exception der Klasse EADSNativeException mit der Meldung   '[AnyDAC] [Phys] [ADS]错误7200:AQE错误:状态= 22018;
  NativeError = 2112; [iAnywhere Solutions] [Advantage 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;

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

1 个答案:

答案 0 :(得分:3)

回答 - 只是一个猜测:

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

AsType值访问权限:

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

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

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

我在你的例子中推荐的是使用索引访问参数,而不是常用的名称,需要在访问之前搜索参数列表,哪个更慢。