我正在修复一个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中提取数据行?
答案 0 :(得分:7)
如果您的电子表格包含标题(我不是指Excel的“A”,“B”等列标题),那么您可以在条件中使用这些标题。在实例化OleDbConnection
时,您需要在连接字符串中指定它。
string connectionString = "Provider=Microsoft.Jet.OLEDB.4.0;Data Source=" + filename + ";Extended Properties=\"Excel 8.0;HDR=YES;\"";
然后你可以按照
的顺序执行SQLstring 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] <> ''"