在这种情况下,我有一些代码在现有程序中没有问题,但是当我在新程序中使用它时抛出一个例外.
它可能不是最好的代码,但它每天都在使用......
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循环并继续前进,但我想了解出了什么问题......有人可以向我解释一下吗?谢谢
跳出来的第一件事是
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会得到一个索引越界错误.
你究竟想在这做什么?
| 归档时间: |
|
| 查看次数: |
2004 次 |
| 最近记录: |