EListError - 如何防止它

时间:2016-05-30 13:01:12

标签: delphi

我在表格的创建事件上打开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?

1 个答案:

答案 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 )。