gpt4 book ai didi

delphi - 在 ADOQuery 中使用参数时出错

转载 作者:行者123 更新时间:2023-12-03 15:53:55 25 4
gpt4 key购买 nike

我有这个简单的代码来检查表中是否存在记录,但它总是返回运行时错误:

Arguments are of the wrong type, are out of acceptable range, or are in conflict with one another.

我的代码是这样的:

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;

表Card中的字段BarCode的类型为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 来完成此类工作。

感谢大家的帮助。

最佳答案

以下内容并不是对您的问题的完整回答,而是为了跟进我的评论,即“您所要做的就是检查表单的 DFM 并将原始 ADoQuery 的属性与非共享的属性进行比较。答案应该在于差异”和您的回复,即非共享查询是动态创建的。

两个 ADOQuery 之间的行为差​​异不涉及“巫术”。这只是一个捕捉实际差异的问题。

因此,为了自己调试问题,您需要一些代码来比较两个组件的属性,即使其中一个或两个组件是动态创建的。在两个组件上使用以下例程将使您能够做到这一点:

function TForm1.ComponentToString(AComponent : TComponent) : String;
var
SS : TStringStream;
MS : TMemoryStream;
Writer : TWriter;
begin
// Note: There may be a more direct way of doing the following, without
// needing the intermediary TMemoryStream, MS
SS := TStringStream.Create('');
MS := TMemoryStream.Create;
Writer := TWriter.Create(MS, 4096);

try
Writer.Root := Self;
Writer.WriteSignature;
Writer.WriteComponent(AComponent);
Writer.FlushBuffer;
MS.Position := 0;
ObjectBinaryToText(MS, SS);
Result := SS.DataString;
finally
Writer.Free;
MS.Free;
SS.Free;
end;
end;

交给你了...

关于delphi - 在 ADOQuery 中使用参数时出错,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39110085/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com