While循环通过查询记录集的问题

时间:2014-07-17 16:21:54

标签: delphi ms-access delphi-xe2 ms-access-2013

我在查询返回的数据中遇到了问题。我使用Delphi XE2和MS Access作为DBMS。

我在尝试迭代记录集的每个游戏中都有问题,它只处理第一个记录然后跳过其余记录,查询是正确的,因为我使用RecCount函数并返回正确的记录数量但是While循环不会通过记录,它会迭代一次并继续。

以下是编码的部分内容:

DB : TADOQuery; //Where DB is this

//Only retrieves the OrderIDs belonging to that username as the Object searchs for its own information using the orderID
DB.Close;
DB.SQL.Text := 'SELECT OrderID FROM tblOrders WHERE Username = ' + '''' + pUsername + '''';
DB.ExecSQL;
DB.Open;

ShowMessage(IntToStr(DB.RecordCount));
fCount := 0;
while NOT(db.Eof) AND (fCount < 10) do
Begin
  Inc(fCount);

fArr[fCount] := TOrder.Create(DB.FieldByName('OrderID').AsInteger); //Creating of the object

DB.Next;
end;

DB.Close;

这就是代码,正如您所看到的,ShowMessage返回记录计数,它返回3(该用户名的正确记录数)。但循环只迭代一次,我不明白为什么。

由于 本

修改

似乎这段代码阻止了循环由于某种原因而迭代,没有它循环迭代并返回所有正确的值。在@Alexandre的帮助下

fArr[fCount] := TOrder.Create(DB.FieldByName('OrderID').AsInteger); <-- Error

要解决问题,这就是我的代码现在最终看起来的样子,它可以正常工作。

var
OrderArr : ARRAY[1..10] of Integer;
k, iIndex : Integer;
begin
opendb('DB.mdb');

//Only retrieves the OrderIDs belonging to that username as the Object searchs for its own information using the orderID
  DB.Close;
  DB.SQL.Text := 'SELECT OrderID FROM tblOrders WHERE Username = ' + '''' + pUsername + '''';
  DB.Open;
  DB.DisableControls;

  fCount := 0;
  try
   DB.First;
   while not DB.EOF do
   begin
    // do something here with each record
    Inc(fCount);

    OrderArr[fCount] := DB.FieldByName('OrderID').AsInteger;
    DB.Next;
   end;
  finally
    DB.EnableControls;
   end;

  for k := 1 to fCount do
  Begin

  fArr[k] := TOrder.Create(OrderArr[k]);

  End;

这似乎有效,我不知道它为什么不能在第一个循环中使用create。希望有人可以提供帮助

由于 本

1 个答案:

答案 0 :(得分:2)

请尝试这种模式。它必须按预期工作,否则您的代码中会出现问题。请注意,DB.ExecSQL在这里没有任何意义,一旦打算打开查询,就不执行其他语句,如INSERT,DELETE或UPDATE。 此外,如果您的DataSet(DB)未附加到可视控件,请考虑将循环包含在DisableControls和EnableControls调用中。当您在ADO DataSet中有许多记录时,这会对循环的速度产生巨大影响。

DB: TADOQuery;

DB.Close;
DB.SQL.Text := 'SELECT OrderID FROM tblOrders WHERE Username = ' + '''' + pUsername + '''';
DB.Open;
DB.DisableControls;
try
  DB.First;
  while not DB.EOF do
  begin
    // do something here with each record
    DB.Next;
  end;
finally
  DB.EnableControls;
end;