这段代码出了什么问题?

Maw*_*awg -3 delphi

在这种情况下,我有一些代码在现有程序中没有问题,但是当我在新程序中使用它时抛出一个例外.

它可能不是最好的代码,但它每天都在使用......

Function  DoSQlCommandWithResultSet(const command : String; 
                                    AdoConnection : TADOConnection; 
                                    resultSet : TStringList): Boolean;
  var i : Integer;
      AdoQuery : TADOQuery;
begin
  Result := True;
  resultSet.Clear();

  AdoQuery := TADOQuery.Create(nil);
  try
    AdoQuery.Connection := AdoConnection;
    AdoQuery.SQL.Add(command);
    AdoQuery.Open();

    i := 0;
    while not AdoQuery.eof do
    begin
      resultSet.Add(ADOQuery.Fields[i].Value);
      AdoQuery.Next;
      Inc(i);
    end;

  finally
    AdoQuery.Free();
  end;
end;
Run Code Online (Sandbox Code Playgroud)

是的,它可能需要一个try/catch并且不使用布尔结果,但是它可以工作......

....在之前的程序中,但是在一个新的程序中它会在调用时产生异常......

procedure TForm1.FormCreate(Sender: TObject);
   var my_stringlist : TStringList;
       i : integer;
begin
   AdoConnection := TADOConnection.Create(nil);

   if ConnectToDefaultDatabase(AdoConnection) = False then
      MessageDlg('Agh !', mtError, [mbOK], 0);

   my_stringlist := TStringList.Create();
   if DoSQlCommandWithResultSet('show databases', AdoConnection, my_stringlist) = False then
      MessageDlg('Urk !', mtError, [mbOK], 0);

   for i := 0 to Pred(my_stringlist.Count) do
      memo1.Lines.Add(my_stringlist.Strings[i]);
end;  // FormCreate()
Run Code Online (Sandbox Code Playgroud)

现在,这是有趣的部分...它抛出异常Inc(i),如果我用for循环替换while循环...

    for i := 0 to Pred(ADOQuery.Fields.count) do
      resultSet.Add(ADOQuery.Fields[i].Value);
Run Code Online (Sandbox Code Playgroud)

它工作得很好.

我想我可以使用for循环并继续前进,但我想了解出了什么问题......有人可以向我解释一下吗?谢谢

Mas*_*ler 6

跳出来的第一件事是

i := 0;
while not AdoQuery.eof do
begin
  resultSet.Add(ADOQuery.Fields[i].Value);
  AdoQuery.Next;
  Inc(i);
end;
Run Code Online (Sandbox Code Playgroud)

for i := 0 to Pred(ADOQuery.Fields.count) do
  resultSet.Add(ADOQuery.Fields[i].Value);
Run Code Online (Sandbox Code Playgroud)

在语义上等同!当您致电时Next,您正在推进数据集中的当前记录.直到您点击的循环EOF将遍历数据集中的每个记录一次.但是第二个循环从不调用Next并且不检查EOF; 它抓住了一条记录中的所有字段.

如果我不得不猜测在第一个循环中导致异常的原因,我会说你的数据集中有更多的记录(行)而不是字段(列),因此经过足够的迭代后,i最终ADOQuery.Fields.Count会得到一个索引越界错误.

你究竟想在这做什么?