使用参数时,我有这个简单的代码来检查,如果在一个表中存在记录,但它总是会返回一个运行时错误:错误ADOQuery
参数的错误类型,超出可接受范围,或者是 彼此冲突。
我的代码是这样的:
function TDataModuleMain.BarCodeExists(barCode: string): boolean;
begin
if ADOQuerySql.Active then
ADOQuerySql.Close;
ADOQuerySql.SQL.Clear;
ADOQuerySql.SQL.Text := 'select count(1) from Card where BarCode = (:TestBarcode)';
ADOQuerySql.Parameters.ParamByName('TestBarcode').Value := barCode;
ADOQuerySql.Open; // HERE THE RUNTIME ERROR APPEARS
Result := ADOQuerySql.Fields[0].AsInteger = 1;
ADOQuerySql.Close;
ADOQuerySql.Parameters.Clear;
end;
表卡领域条形码类型为nvarchar(100)
在调试我看到参数被创建,并获取与填充正确的价值。
在sql server management studio中运行查询也可以。
我还发现这个How to pass string parameters to an TADOQuery?并检查了我的代码与答案中的代码,但我没有看到任何问题在这里。
此外这AdoQuery Error using parameters没有帮助我。
毫无疑问,这将是非常简单的事情,我已经错过了,但我现在只是没有看到它。
编辑:事情我从建议试图在注释:但是
.ParamCheck := True (default)
.Parameters.ParamByName('TestBarcode').DataType := ftString
.Parameters.ParamByName('TestBarcode').DataType := ftWideString
这些都不奏效。
有帮助的是使用非共享的AdoQuery来做这件事,而且那个人没有任何错误地完成了这项工作。我现在正在使用它作为解决方案,但我仍然在寻找共享的AdoQuery,因为它确实存在问题。
编辑:找到问题的根源。
我使用MartinA提供的函数来检查动态创建的查询和共享的AdoQuery,我发现一个区别。
共享AdoQuery有此属性填充:
ExecuteOption := [eoExecuteNoRecords]
和动态创建的查询没有。
由于此属性未在设计时设置,因此我没有看到它。 将属性清除为[]后,共享的AdoQuery再次工作。
我将转而使用非共享AdoQuery来处理此类工作。
感谢大家的帮助。
看样子你打算重用这个查询其他东西。试着在'Close'后面将'Parameters.Clear'操作从底部移动到顶部。 –
@JerryDodge我刚刚尝试过,它没有帮助。我想你在哪里谈论Parameters.Clear; ? – GuidoG
@GuidoG是的,这就是我的意思,编辑。 –