【发布时间】:2012-08-18 20:02:19
【问题描述】:
我正在使用带有 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;
这会导致异常:
异常 der Klasse EADSNativeException mit der Meldung '[AnyDAC][Phys][ADS] 错误 7200:AQE 错误:状态 = 22018;
本机错误 = 2112; [iAnywhere 解决方案][优势 SQL Engine]Assignment error' 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;
我错过了什么吗?感谢您的帮助!
【问题讨论】:
-
那么为什么不使用
AsType转换呢?它的可读性更好,您可以确定查询参数构建器的内部机制将正确处理这些值。我不知道 AnyDAC,但是如果他们从 Delphi 那里得到这个,那么Value的类型是Variant在我看来不会给你带来任何安全...... -
努力+1 但
q来自哪里?你的最后一个变体使用dm1.qCustom,你的另外两个使用q。q是如何声明的?您能否向我们展示这两个参数的声明。当您说它是有效的日期时间时,据我们所知,AStartDateTime 被声明为字符串,其值为“01-01-2012”。为什么将:0作为参数更改为:SomeDate? -
对那个 dm1.qCustom 感到抱歉 - 我将它替换为 'q' 只是为了缩短代码-sn-p 并忘记了一些...AStartDate 被声明为 TDateTime,而不是字符串。我将 :0 更改为 :SomeDate 只是为了显示命名参数的使用。
-
是的,它没有解释为什么。无论如何,Delphi 不负责确定正确的数据类型,也不知道如何将通过
Variant类型传递的日期时间戳转换为查询。对参数的索引访问也可能发生同样的情况,因为我认为它不会在内部确定参数的数据类型,而命名访问却可以。而且,在这种情况下,我看不到任何使用Value的专业人士,使用索引方式是(因为它更快),但在Variant之前使用直接AsType类型转换总是对我有利(你不能不匹配参数) . -
.AsDateTime 是快速代码,.Value 是惰性代码 :-)
标签: delphi parameters delphi-xe2 advantage-database-server anydac