Delphi XE TClientDataSet.Next 上的未知 isc 错误 0

unknown isc error 0 on Delphi XE TClientDataSet.Next

我有一个连接到 Firebird 数据库的 DBXpress 数据结构。我在 ClientDataSet、DataSetProvider 和 SQLQuery 组合上添加数据分页。 它运行良好,但最近它在多次调用 Next 后开始提高 unknown isc error 0 exception

分页代码为:

if not ClientDataSet.Active then
    ClientDataSet.Open;
RecNo := ClientDataSet.RecNo; // Keep track of selected record
ClientDataSet.DisableControls;
LastRecNo := GetLastRecNo;
if LastRecNo > -1 then
begin
    ClientDataSet.RecNo := LastRecNo;
    ClientDataSet.Next;
    while (not ClientDataSet.Eof) and (Result < DATA_PAGE_SIZE) do
    begin
         ...
         ClientDataSet.Next; // The exception is raised here
         Inc(Result);
    end;
end;
ClientDataSet.RecNo := RecNo;
ClientDataSet.EnableControls;

间歇性引发的异常,这可能意味着连接问题,但数据库存储在本地,连接字符串类似于 localhost:C:\Path\Base.FDB

编辑: 当用户向下滚动鼠标、向下移动滚动条或导航到列表末尾旁边的项目时,将触发此代码。在最近的测试中,我发现只有在代码正常执行时才会引发异常。如果有断点,或者如果我在那里放置一些睡眠,它会正常执行。 我也确定我没有任何其他线程更改 ClientDataSet。

我发现我正在使用 FetchOnDemand = TruePacketRecords = 400。这可能是 TClientDataset 本身或按需获取记录的一些低级 Delphi 实现的并发问题。

如果您设置 FetchOnDemand = False,故障就会消失。我知道如果您拥有庞大的数据集,这不是解决方案,但我的情况并非如此。我更喜欢先简单地获取记录,然后对内存中已有的记录进行分页。