我在表格的创建事件上打开ACRTable。
这是我滚动表格后的内容:
procedure TForm1.ACRTable1AfterScroll(DataSet: TDataSet);
begin
if ACRTable1.FieldByName('COMPANY_ID').AsString <> '' then
begin
ACRQuery1.SQL.Text:= 'select * from MEMBERS where COMPANY_ID = ' +
ACRTable1.FieldByName('COMPANY_ID').AsString;
ACRQuery1.Open;
end;
end;
但是如果ACRQuery1没有任何记录,我会得到数据库EListError。 我试过了:
procedure TForm1.ACRQuery1BeforeOpen(DataSet: TDataSet);
begin
if ACRQuery1.RecordCount =0 then
label1.Caption:='No records found'
else label1.Caption:='';
end;
但仍然是同样的错误。 我究竟做错了什么 ?如何防止此EListError?
答案 0 :(得分:1)
我不确定你的ACRQuery1是哪种TDataSet-descendant类型,但是在猜测时,它会从TList或类似的计算它的RecordCount(例如通过读取它的Count属性),除非数据集是打开的,否则它实际上不存在。所以,我要尝试的第一件事是避免尝试读取它的RecordCount,除非它是开放的:
procedure TForm1.ACRQuery1AfterOpen(DataSet: TDataSet);
begin
// Following is how I would have structured it
// Make sure you remove your BeforeOpen handler
if ACRQuery1.Active then begin
if (ACRQuery1.RecordCount = 0) then
label1.Caption := 'No records'
else
label1.Caption := IntToStr(ACRQuery1.RecordCount);
end
else begin
label1.Caption:='No records found';
end;
将代码移动到AfterOpen事件后,对Exetive数据集的检查实际上并不是必需的,因为事件不会被调用 - 否则将RecordCount上的检查移到AfterOpen事件中应该避免它被读取数据集实现不能为它返回值,但我在代码中包含了对它的测试,以防您尝试在其他地方使用该代码。
顺便说一下,如果你仍然使用上面的代码得到EListError,我会说原因是TACRQuery实现中的一个错误,而不是你做的任何“错误”,你应该把它报告给作者(s )。