我有以下问题:
我在 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 的邮件(第一次找不到它们)。谈话是这样进行的:
- 首先,我发送了一封电子邮件,解释了发生了什么,包括截图(非常类似于这个 SO-question)
- 我收到一封电子邮件,他们询问我正在使用什么数据集,以及我是否可以在数据集本身上使用 MoveBy 指令。
- 我尝试了他们的要求,是的,如果我这样做了,我会得到同样的错误
adoquery.moveby($FFFFFFF)
- 他们说不清楚为什么我会收到这个错误,这是第一次有人报告这个问题。这就是他们说这是数据集本身的错误并且他们无能为力的地方。
我真的不知道如何解决这个问题......我仍然不明白为什么这只会在调试和记录数> 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 个