我正在将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;
我错过了什么吗?谢谢你的帮助!
答案 0 :(得分:3)
回答 - 只是一个猜测:
我想说参数的Value
属性的索引写访问权限并不确定参数的数据类型。如果这是正确的,那么你就会遇到麻烦,因为你通过Variant
类型传递了所有值,这些值必须在执行查询之前转换为正确的值格式。但所有这些只是我的猜测 - 我根本不知道AnyDAC!
AsType值访问权限:
我发布这个只是因为我不喜欢Value
访问要称为professional的参数:-)
最好使用AsType
类型转换,至少因为:
它更快,因为你直接说出你传递给某个参数的类型,因此查询参数引擎不需要确定这一点,并且与Value
访问相比,它不会我需要转换Variant
类型
对你来说更安全,因为你无法通过,例如字符串值为AsDateTime
访问参数,因此您可以获得额外的参数不匹配保护
我在你的例子中推荐的是使用索引访问参数,而不是常用的名称,需要在访问之前搜索参数列表,哪个更慢。