5

我正在修复一个 C# 项目,该项目使用带有数据定义的 Excel 工作表来创建 SQL Server 中的批量插入使用的 .fmt 文件。

我的问题是 Excel 文件有时在底部有空白行,而我正在处理的 C# 解析器将检测到比包含数据定义的实际行数更高的行数。

因此,fmt 文件在其第二行上有更多的行,并且批量插入在到达底部并尝试继续读取时会引发异常。

例如,只有 50 行数据和 50 个空白行。fmt 文件的第二行将有一个 100(第一行是 SQL Server 版本)。第 3 到 52 行是 50 行数据定义。当批量插入尝试到达第 53 行时,它会返回一些列异常。

C# 解析器使用 Ace OleDB 12 连接到 Excel 97 格式文件。

SQL 是:

var commandText = string.Format("SELECT * FROM [{0}$]", SpreadSheetName);

我试图在 SQL 代码中添加 WHERE 子句,以仅选择具有非空“A”列的行,但这不起作用。

SELECT * FROM [{0}$] WHERE [A] <> ''

有没有一种方法可以使用一些 SQL 代码来增强命令文本,以便仅从满足特定条件的 Excel 中提取数据行?

4

1 回答 1

8

如果您的电子表格有标题(我不是指 Excel 的“A”、“B”等列标题),那么您可以在条件中使用这些标题。实例化OleDbConnection.

string connectionString = "Provider=Microsoft.Jet.OLEDB.4.0;Data Source=" + filename + ";Extended Properties=\"Excel 8.0;HDR=YES;\"";

然后您可以按照以下方式执行SQL

string SQL = "SELECT * FROM [Sheet1$] WHERE [Name] <> ''";

如果您的电子表格没有标题,您仍然可以使用 WHERE 子句,但您必须通过“F1”、“F2”等引用列,并将连接字符串设置为不使用标题

string connectionString = "Provider=Microsoft.Jet.OLEDB.4.0;Data Source=" + filename + ";Extended Properties=\"Excel 8.0;HDR=NO;\"";
string SQL = "SELECT * FROM [Sheet1$] WHERE [F1] <> ''"
于 2012-12-10T22:00:25.173 回答