首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Eof不触发

Eof不触发
EN

Stack Overflow用户
提问于 2016-02-05 21:26:20
回答 1查看 547关注 0票数 0

我有一个从DB获取数据的函数,我的测试数据集返回6500行(我从SQLText变量中提取格式化的SQL语句并作为测试运行它),但是当我运行以下代码时,Eof永远不会触发,而且我看到导入的行超过100 k。

代码语言:javascript
复制
ADOQuery := TADOQuery.Create(nil);
ADOQuery.ConnectionString := CONNECT_STRING;

// Build SQL Query 
SQLText :=   Format( 'Select  Temp.Serial, Temp.QCSample , Temp.Scrap , Temp.StationID , Temp.Defect , Temp.AddData , Temp2.Serial as Parent_Serial ' +
      'from TAB_ELEMENT as Temp ' + 

      'left join TAB_ELEMENT as Temp2 on  Temp.Parent_Id = Temp2.Element_Id ' + 
      'where Temp.Batch_ID = %d    and Temp.StationID = 0 ',[iSearchID]);

ADOQuery.SQL.Clear;   // Clear query of garbage values
ADOQuery.SQL.Text := SQLText; // Add query text to query module
ADOQuery.Open; 

// Handle Results
iIndexPos := 0; 
tDataImport.BeginUpdate;  

while not ADOQuery.Eof do
begin
    tDataImport.Items[iIndexPos].Serial := ADOQuery.FieldByName('Serial').AsString;
    tDataImport.Items[iIndexPos].QCStatus := ADOQuery.FieldByName('QCSample').AsBoolean;
    tDataImport.Items[iIndexPos].Scrap := ADOQuery.FieldByName('Scrap').AsInteger;
    tDataImport.Items[iIndexPos].StationID := ADOQuery.FieldByName('StationID').AsInteger;
    tDataImport.Items[iIndexPos].Defect := ADOQuery.FieldByName('Defect').AsBoolean;
    tDataImport.Items[iIndexPos].AddData := ADOQuery.FieldByName('AddData').AsString;
    tDataImport.Items[iIndexPos].ParentSerial := ADOQuery.FieldByName('Parent_Serial').AsString;

    inc(iIndexPos);
end;

因此,在使用这些参数运行此查询的总结中,我期望有6500行,当我运行这个查询时,即使在处理100k+行之后,它也永远不会结束。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2016-02-05 21:30:05

Open()将光标放在第一个记录上,并相应地设置Eof。您并不是调用Next()来将游标提前到下一条记录并更新Eof,因此您正在一次又一次地处理相同的记录:

代码语言:javascript
复制
ADOQuery.Open; 
while not ADOQuery.Eof do
begin
  //...
  ADOQuery.Next; // <-- add this!
end;

另外,您应该使用参数化查询,而不是格式化的SQL查询字符串。它在DB上更安全、更快、更高效:

代码语言:javascript
复制
ADOQuery := TADOQuery.Create(nil);
ADOQuery.ConnectionString := CONNECT_STRING;

ADOQuery.SQL.Text := 'Select  Temp.Serial, Temp.QCSample , Temp.Scrap , Temp.StationID , Temp.Defect , Temp.AddData , Temp2.Serial as Parent_Serial ' +
  'from TAB_ELEMENT as Temp ' + 
  'left join TAB_ELEMENT as Temp2 on  Temp.Parent_Id = Temp2.Element_Id ' + 
  'where Temp.Batch_ID = :iSearchID and Temp.StationID = 0 ';

with ADOQuery.Parameters.ParamByName('iSearchID') do
begin
  DataType := ftInteger;
  Value := iSearchID;
end;

ADOQuery.Open; 
try
  iIndexPos := 0; 
  tDataImport.BeginUpdate;  
  try
    while not ADOQuery.Eof do
    begin
      tDataImport.Items[iIndexPos].Serial := ADOQuery.FieldByName('Serial').AsString;
      tDataImport.Items[iIndexPos].QCStatus := ADOQuery.FieldByName('QCSample').AsBoolean;
      tDataImport.Items[iIndexPos].Scrap := ADOQuery.FieldByName('Scrap').AsInteger;
      tDataImport.Items[iIndexPos].StationID := ADOQuery.FieldByName('StationID').AsInteger;
      tDataImport.Items[iIndexPos].Defect := ADOQuery.FieldByName('Defect').AsBoolean;
      tDataImport.Items[iIndexPos].AddData := ADOQuery.FieldByName('AddData').AsString;
      tDataImport.Items[iIndexPos].ParentSerial := ADOQuery.FieldByName('Parent_Serial').AsString;
      inc(iIndexPos);
      ADOQuery.Next; 
    finally
      tDataImport.EndUpdate;  
    end;
  end;
finally
  ADOQuery.Close; 
end;
票数 8
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/35233810

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档