在编程时遇到一个奇怪的事情 代码如下:
function ExistRecord(age:integer):boolean;;
var AQ:Tadoquery;
begin
result:=false;
if not main.ADOConnection.Connected then exit;
AQ:=Tadoquery.Create(nil);
try
AQ.Connection:=main.ADOConnection;
AQ.Sql.text:='select * from mydatabase.dbo.mytable where age='+inttostr(age);
AQ.Open;
if AQ.RecordCount>0 then result:=true;
finally
AQ.Free;
end;
end;
可是,明明存在的记录偶尔就查不到,本函数是在一个线程中被执行的。
请高手指教,是不是 Delphi的错,或是 SqlServer 的错,或是代码的用法不对,
如果代码的用法不对,请具体解释。谢谢!
function ExistRecord(age:integer):boolean;;
var AQ:Tadoquery;
begin
result:=false;
if not main.ADOConnection.Connected then exit;
AQ:=Tadoquery.Create(nil);
try
AQ.Connection:=main.ADOConnection;
AQ.Sql.text:='select * from mydatabase.dbo.mytable where age='+inttostr(age);
AQ.Open;
if AQ.RecordCount>0 then result:=true;
finally
AQ.Free;
end;
end;
可是,明明存在的记录偶尔就查不到,本函数是在一个线程中被执行的。
请高手指教,是不是 Delphi的错,或是 SqlServer 的错,或是代码的用法不对,
如果代码的用法不对,请具体解释。谢谢!
var AQ:Tadoquery;
begin
result:=false;
if not main.ADOConnection.Connected then exit;
AQ:=Tadoquery.Create(nil);
try
AQ.Connection:=main.ADOConnection;
AQ.close;
AQ.sql.clear;
AQ.Sql.text:='select * from mydatabase.dbo.mytable where age='+inttostr(age);
AQ.Open;
if AQ.RecordCount>0 then result:=true;
finally
AQ.Free;
end;
end;
那么,到底问题出在那里呢?是 出自 sqlserver 吗,还是 Delphi 的 BUG.
将这句尝试修改为
result := not AQ.Eof;
试试。
线程FreeOnTerminate当然设为True了。
没有人遇到过此类问题吗?
result := not AQ.Eof;代替
AQ:=Tadoquery.Create(nil);
try
AQ.Connection:=main.ADOConnection;
AQ.close;
AQ.sql.clear;
AQ.Sql.text:='select * from mydatabase.dbo.mytable where age='+inttostr(age);
AQ.Open;
if AQ.RecordCount>0 then result:=true;
finally
AQ.Free;
end;
AQ:=Tadoquery.Create(nil);
try
AQ.Connection:=main.ADOConnection;
AQ.close;
AQ.sql.clear;
AQ.Sql.text:='select count(*) from mydatabase.dbo.mytable where age='+inttostr(age);
AQ.Open;
AQ.First;
if AQ.Fields[0].AsInteger>0 then result:=true;
finally
AQ.Free;
end;
试试
function TDataSet.GetRecordCount: Longint;
begin
Result := -1;
end;ADODB单元中ADOCustomDataSet重写(override)了该函数;如下:
function TCustomADODataSet.GetRecordCount: Longint;
begin
CheckActive;
Result := Recordset.RecordCount;
end;
//:CheckActive是判断数据集是否打开。Recordset.RecordCount他直接调用原生的ADO对象的函数Get_RecordCount: Integer;safecall;
因为TADOQuery是从TCustomADODataSet继承而来。所以,这就应该跟Delphi没有关系了,可能是ADO的哪个参数的设置问题或是Bug。