0

次の問題があります。

私は 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 を起動し、グリッドでフォームに移動すると、まったく問題ありません。また、これは私の PC でのみ発生し、同僚にはこの問題はありません。

TMS を更新しても解決しませんでした。

TMS にメールしましたが、Delphi 自体の問題であり、私を助けることはできないとのことです。彼らは正しいですか?

現時点では、exe を開始し、グリッドをロードし、Delphi をプロセスにアタッチして、必要なコードをデバッグします。あまり便利ではありませんが、何もないよりはましです。

私に何ができる?

近い将来、XE7 または 10 シアトルにアップグレードすることを検討していますが、これはすぐに修正される可能性があります

編集 - 追加情報

私たちは最近 DELPHI 10 SEATTLE への一歩を踏み出しましたが、問題はまだ残っています。また、すべての TMS 製品を更新しました。

その日に TMS に送り返したメールを検索したところ、見つかりませんでした (最初のメールは見つかりませんでした)。会話の流れはこうです。

  1. 最初に、スクリーンショットを含む、何が起こっているかを説明する電子メールを送信しました(このSO-質問に非常に似ています)
  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;  

また、3 つではなく 12 のメッセージボックスを受け取ったのも少し奇妙です。

4

0 に答える 0