TADOQuery包含空白行

时间:2019-07-18 09:53:13

标签: delphi tadoquery

在Microsoft Excel工作簿中使用“ while not TADOQuery.Eof”时,其中包括完全为空的行。有没有办法停止包含所有不需要的行,因为我不需要它们?

2 个答案:

答案 0 :(得分:1)

您可以在用于打开电子表格的SQL中排除空白行。如果第一行包含“ Column1”,“ Column2”等列标题,则以下SQL将不会返回第一列值为空白的行

select * from [sheet1$] 
where Column1 <> ''

很显然,对于您认为构成空白行的内容,SQL可能会更具体(就列值而言)。

您已经了解到,有多种方法可以处理列标题内容的变化,但正如其他答案所示,这些方法可能比仅跳过主体内部的空白行更为冗长主要的while not EOF循环读取表内容,因此我只跳过空白行就看不到没有这样做的任何好处。

顺便说一句,通过SQL可访问的Excel数据的行为就像查询被自动限制为Excel COM界面中的UsedRange范围一样。

答案 1 :(得分:1)

原始答案:

如果我对您的理解正确,并且希望在打开查询后排除空行,​​那么下一种方法可能会有所帮助(但我认为,应该使用SQL语句排除这些行,如@MartynA的回答)。在这里,空行是所有行,所有字段的值均为Null

procedure TForm1.btnDataClick(Sender: TObject);
var
   i: Integer;
   empty: Boolean;
begin

   qry.First;
   while not qry.Eof do begin
      // Check for empty row. Row is empty if all fields have NUull value.
      empty := True;
      for i := 0 to qry.FieldCount - 1 do begin
         if not qry.Fields[i].IsNull then begin
            empty := False;
            Break;
         end{if};
      end{for};
      // Read record data if record is not empty
      if not empty then begin
         // Your code here ...
      end{if};
      // Next record
      qry.Next;
   end{while};

end;

更新

这是尝试改善我的答案。如果表结构未知,则可以使用始终为假的WHERE子句查询表以获取此结构并动态生成SQL语句:

procedure TForm1.btnDataClick(Sender: TObject);
var
    i: Integer;
    where: string;
begin
    // Get column names
    qry.Close;
    qry.SQL.Clear;
    qry.SQL('SELECT * FROM [SheetName] WHERE 1 = 0');
    try
       qry.Open;
    except
       ShowMessage('Error');
    end{try};
    where := '';
    for i := 0 to qry.FieldCount - 1 do begin
        where := where + '(' + qry.Fields[i].FieldName + ' <> '''') AND ';
    end{for};
    where := 'WHERE ' + Copy(where, 1, Length(where) - 5);

    // Read data without "empty" rows
    qry.Close;
    qry.SQL.Clear;
    qry.SQL('SELECT * FROM [SheetName] ' + where);
    try
       qry.Open;
    except
       ShowMessage('Error');
    end{try};

end;