0

我有以下问题:

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

第一次机会例外,$75CCC42D。带有消息“发生未知错误”的异常类 EOleException。

当我单击“中断”时,指针停在以下代码中:

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 并进入带有网格的表单时,完全没有问题。它也只发生在我的PC上,我的同事没有这个问题。

更新 TMS 没有帮助。

我已经邮寄给 TMS,但他们说这是 Delphi 本身的问题,他们无法帮助我。他们是对的吗?

在我启动 exe 的那一刻,加载网格,将 Delphi 附加到进程并调试我想要的那段代码。不是很方便,但总比没有好。

我能做些什么?

我们希望在不久的将来升级到 XE7 甚至 10 Seattle,但希望这可以很快得到解决

编辑 - 一些额外的信息

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

我搜索并找到了我当天发回 TMS 的邮件(第一次找不到它们)。谈话是这样进行的:

  1. 首先,我发送了一封电子邮件,解释了发生了什么,包括截图(非常类似于这个 SO-question)
  2. 我收到一封电子邮件,他们询问我正在使用什么数据集,以及我是否可以在数据集本身上使用 MoveBy 指令。
  3. 我尝试了他们的要求,是的,如果我这样做了,我会得到同样的错误adoquery.moveby($FFFFFFF)
  4. 他们说不清楚为什么我会收到这个错误,这是第一次有人报告这个问题。这就是他们说这是数据集本身的错误并且他们无能为力的地方。

我真的不知道如何解决这个问题......我仍然不明白为什么这只会在调试和记录数> 1000时发生。这可能是分页的问题吗?

@科比克:

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 个

4

0 回答 0