我在查询返回的数据中遇到了问题。我使用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。希望有人可以提供帮助
由于 本
答案 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;