DELPHI - 由具有+1000条记录的网格引起的EOleException

时间:2015-10-08 09:22:42

标签: delphi tms

我有以下问题:

我在DELPHI XE2中编程并使用TMS使用TDBAdvGrid。网格从SQL SERVER填充。我想一次加载+1000条记录时出现以下错误:

$ 75CCC42D的第一次机会异常。带有消息的异常类EOleException'发生了未知错误'。

当我点击' Break'时,指针停在以下代码中:

function TDBAdvGrid.GetRecordCount: integer;

  function RowsInDataset: Integer;
  var
    cb: TBookMark;
    iseof, isbof: Boolean;
  begin
    Result := -1;
    if not CheckDataSet then
      Exit;

    FDataLink.DataSet.DisableControls;

    iseof := FDataLink.DataSet.Eof;
    isbof := FDataLink.DataSet.Bof;

    if isbof and iseof then
    begin
      Result := 0;
  //FMaxRows := 0;
    end
    else
      with FDataLink.DataSet do
      begin
        cb := GetBookMark;
        First;
        if (csDesigning in ComponentState) then
          Result := MoveBy(100)
        else
          Result := MoveBy($7FFFFFFF) + 1; // <= programs breaks here!

        GotoBookMark(cb);
        FreeBookMark(cb);

    //FMaxRows := Result;
      end;

    if iseof then
      FDataLink.DataSet.Next;

    if isbof then
      FDataLink.DataSet.Prior;

    if FDataLink.DataSet.State = dsInsert then
      Result := Result + 1;

    FEmptyDataSet := Result = 0;
    FDataLink.DataSet.EnableControls;
  end;

//var
//  OldRecNo: integer;
begin
  Result := 0;
  if Assigned(FDataLink) then
    if Assigned(FDataLink.DataSet) then
      if FDataLink.DataSet.Active then
      begin
        FDoNotUpdateMe := true;

        if Assigned(FOnGetRecordCount) then
        begin
          FDataLink.DataSet.DisableControls;
          FOnGetRecordCount(self, Result);
          FEmptyDataSet := Result = 0;
          if (FloatingFooter.Visible) and PageMode and (FloatingFooter.FooterStyle = fsFixedLastRow) then
          begin
            if (Result = 0) then
              Inc(Result, 2)
            else
              Inc(Result);
          end;
          FDataLink.DataSet.EnableControls;
        end
        else
        begin
          Result := RowsInDataSet;
          if (FloatingFooter.Visible) and PageMode and (FloatingFooter.FooterStyle = fsFixedLastRow) then
          begin
            if (Result = 0) then
              Inc(Result, 2)
            else
              Inc(Result);
          end;
        end;
   { OldRecNo:= FDataLink.DataSet.RecNo;
    FDataLink.dataset.First;
    Result := FDataLink.dataset.MoveBy($FFFF);
    FDataLink.DataSet.RecNo:= OldRecNo; }
        FDoNotUpdateMe := false;
      end;
end;

//------------------------------------------------------------------------------

当我点击“继续”时,我会遇到此错误的无限循环。只有在我调试模式下,当在Delphi外部启动exe并转到带有网格的表单时,才会出现此错误,根本没有问题。 它也只发生在我的电脑上,我的同事们没有这个问题。

更新TMS没有帮助。

我已经邮寄给TMS了,但他们说这是德尔福本身的一个问题,他们无法帮助我。他们是对的吗?

目前我启动exe,加载网格,将Delphi附加到进程并调试我想要的那段代码。不是很方便,但仍然没有任何好处。

我该怎么办?

我们希望在不久的将来升级到XE7甚至10西雅图,但希望很快就能解决这个问题

编辑 - 一些额外信息

我们最近向DELPHI 10 SEATTLE迈出了一步,但问题仍然存在。我们还更新了所有TMS产品。

我搜索并发现我当天发回的邮件给TMS(无法找到他们的第一封邮件)。 对话就是这样的:

  1. 首先,我发了一封电子邮件,说明发生了什么,包括截图(非常类似于这个SO问题)
  2. 我收到一封电子邮件,询问我使用的数据集以及是否可以在数据集本身上使用MoveBy指令。
  3. 我尝试了他们的问题,是的,如果我adoquery.moveby($FFFFFFF)
  4. ,我会得到同样的错误
  5. 他们说不清楚为什么我会收到这个错误,这是有人第一次报道这个错误。他们说这是数据集本身的错误,他们无法帮助它。
  6. 我真的不知道如何解决这个问题......我仍然不明白为什么这只会在调试AND recordcount&gt;时发生。 1000.它可能是分页的东西吗?

    @ kobik:

    procedure TfrmGrondstoffen.MainDBGridGetRecordCount(Sender: TObject;
      var Count: Integer);
    begin
         ShowMessage(inttostr(MainDBGrid.DataSource.DataSet.RecordCount)); // gives the correct number
         ShowMessage(inttostr(qryGrondstoffen.RecordCount));  //gives the correct number
         ShowMessage(inttostr(Count)); // gives 0 all the time
    end;  
    

    还有点奇怪,我收到了12个留言箱,而不是3个

0 个答案:

没有答案