TADOQuery 包括空行
TADOQuery Including blank rows
将“while not TADOQuery.Eof
”与 Microsoft Excel 工作簿一起使用时,它包含完全为空的行。有没有办法停止包含完全空白的行,因为我不需要它们?
您可以排除用于打开电子表格的 SQL 中的空行。如果第一行包含 'Column1'、'Column2' 等列标题,则以下 SQL 将不会 return 行,其中第一列中的值为空白
select * from [sheet1$]
where Column1 <> ''
显然,SQL 可以更具体一些(就列值而言)您认为构成空白行的内容。
您会发现有多种方法可以处理列 headers 中的内容变化,但正如另一个答案所示,这些方法可能比简单地跳过空白要冗长得多主 while not EOF
循环的 body 内的行读取 table 内容,所以我真的看不到不通过跳过空白行不这样做有任何好处。
顺便说一句,通过 SQL 访问的 Excel 数据表现得好像查询自动限制在 Excel COM 接口中的 UsedRange
范围内。
原回答:
如果我理解正确并且您想在打开查询后排除空行,那么下一种方法可能会有所帮助(但我认为,您应该使用 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;
更新:
这是为了改进我的回答。如果不知道table结构,可以查询tablewith always false 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;
将“while not TADOQuery.Eof
”与 Microsoft Excel 工作簿一起使用时,它包含完全为空的行。有没有办法停止包含完全空白的行,因为我不需要它们?
您可以排除用于打开电子表格的 SQL 中的空行。如果第一行包含 'Column1'、'Column2' 等列标题,则以下 SQL 将不会 return 行,其中第一列中的值为空白
select * from [sheet1$]
where Column1 <> ''
显然,SQL 可以更具体一些(就列值而言)您认为构成空白行的内容。
您会发现有多种方法可以处理列 headers 中的内容变化,但正如另一个答案所示,这些方法可能比简单地跳过空白要冗长得多主 while not EOF
循环的 body 内的行读取 table 内容,所以我真的看不到不通过跳过空白行不这样做有任何好处。
顺便说一句,通过 SQL 访问的 Excel 数据表现得好像查询自动限制在 Excel COM 接口中的 UsedRange
范围内。
原回答:
如果我理解正确并且您想在打开查询后排除空行,那么下一种方法可能会有所帮助(但我认为,您应该使用 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;
更新:
这是为了改进我的回答。如果不知道table结构,可以查询tablewith always false 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;