OLE CALL to Excel with WHERE clause



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

我的问题是,Excel文件的底部有时有空行,我正在开发的C#解析器会检测到比包含int数据定义的实际行数更多的行数。

因此,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中提取数据行?

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

最新更新