【问题标题】:OLE CALL to Excel with WHERE clause带有 WHERE 子句的 OLE CALL 到 Excel
【发布时间】:2012-12-10 17:24:13
【问题描述】:

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

我的问题是 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 中提取数据行?

【问题讨论】:

  • 你能显示一些代码吗?你也在什么对象中读取数据?您可以使用 DataReader 逐行读取并忽略那些为空的。

标签: c# .net excel ado.net oledb


【解决方案1】:

如果您的电子表格有标题(我不是指 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] <> ''"

【讨论】:

  • 不幸的是,我在发布之前确实尝试过这种确切的语法,但它不起作用。
  • @NicVerAZ 也许您可以尝试读取所有数据并在 DataTable 中对其进行操作,正如 Derek 建议的那样。
  • 我设法通过确保电子表格具有标题来使其工作。不幸的是,它不会采用通用列名。
猜你喜欢
  • 2011-07-23
  • 2011-08-02
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-11-20
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多