Delphi 什么';这个密码怎么了?

Delphi 什么';这个密码怎么了?,delphi,Delphi,在本例中,我有一些代码在现有程序中正常工作,但在新程序中使用时抛出一个EXECCPION 它可能不是最好的代码,但它在日常使用中起作用 Function DoSQlCommandWithResultSet(const command : String; AdoConnection : TADOConnection; resultSet : TStr

在本例中,我有一些代码在现有程序中正常工作,但在新程序中使用时抛出一个EXECCPION

它可能不是最好的代码,但它在日常使用中起作用

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;
是的,它可能需要一个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()
现在,这里是有趣的部分。。。它在
Inc(i)
上抛出异常,如果我用for循环替换while循环

    for i := 0 to Pred(ADOQuery.Fields.count) do
      resultSet.Add(ADOQuery.Fields[i].Value);
它很好用


我想我可以使用for循环&继续,但我想了解出了什么问题。。。。有人能给我解释一下吗?谢谢

在while循环中,只要有记录,您就可以循环

while not AdoQuery.eof do
但是你进入了这个领域

ADOQuery.Fields[i]
i
表示当前的“记录编号”

这将在任何程序中崩溃,这仅取决于查询的记录计数与查询的字段计数之间的关系。。。一旦记录计数高于字段计数,它就会崩溃

for循环是修复此问题的一部分


但是,由于您没有提供信息,无论您是需要一条记录的所有字段,还是需要所有记录的所有字段作为
resultset
,因此很难提供固定的代码…

我首先想到的是

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

在语义上是不等价的!调用
Next
时,您正在推进数据集中的当前记录。在点击
EOF
之前的循环将在数据集中的每条记录中运行一次。但是第二个循环从不调用
Next
,也不检查EOF;它从一个记录中获取所有字段

如果我必须猜测是什么导致了第一个循环中的异常,我会说数据集中的记录(行)比字段(列)多,因此经过足够多的迭代后,
I
最终出现在
adokery.fields.Count
处,就会出现索引越界错误


你到底想在这里做什么?

嗯,没有评论,没有答案,只有一张反对票。我想知道他为什么投了反对票。这让我想建议,在没有解释的情况下,不允许投否决票。你已经有了两个答案……不是在没有评论的情况下被否决的时候,我没有。我喜欢这个网站,但有时也会有被点击和被淘汰的投票者……它值得被淘汰,因为你不必费心解释什么是例外以及例外发生在哪里。所以你逼我们猜。请学会花更多的时间来描述问题。这样做也会帮助你独立解决问题。这样做也会帮助你解决问题。这样做也会帮助你独立解决问题。这样做也会帮助你独立解决问题。嘿,Mawg,David Heffernan在描述问题时有自己的观点。我发现当我写一个很棒的问题时,我常常自己找到答案。也许有一半的问题是我开始问的,所以从来没有被贴出来,因为在“谷歌搜索”的时候,问题越来越尖锐,我经常自己找到答案。+1同意,他们是不同的。哎呀,列/行。。。当然,你是对的。这看起来是个问题。我会重新编码,但是你能给我指出一些MySql访问的代码吗?显然,我需要it@Mawg:我对MySQL了解不多。再说一遍,你想做什么?你找到答案了!!我浏览了旧代码&该函数只有在使用quey调用时才会返回一行中的一列。当新项目想要返回多行(每个数据库一行)时,i和ADOQuery.Fields.Count的说法是正确的,再次感谢
for i := 0 to Pred(ADOQuery.Fields.count) do
  resultSet.Add(ADOQuery.Fields[i].Value);