2012-12-10 69 views
4

我正在修復一個C#項目,該項目使用Excel工作表和數據定義來創建SQL Server中批量插入使用的.fmt文件。OLE調用到Excel與WHERE子句

我的問題是,Excel文件有時在底部有空白行,我正在處理的C#解析器會檢測超過實際行數的containsint數據定義的行數。

因此,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); 

我試圖WHERE子句添加到SQL代碼,只選擇一個非空「A」柱行,但這不能正常工作。

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

是有辦法的命令文本可以與一些SQL代碼只能提取其中一定的條件滿足了Excel的數據行來增強?

+0

你能顯示一些代碼嗎?你還讀了哪些數據?您可以使用DataReader逐行讀取並忽略那些爲空的。 – Derek

回答

4

如果您的電子表格包含標題(我不是指Excel的「A」,「B」等列標題),那麼您可以在條件中使用這些標題。當你實例化你的OleDbConnection時,你需要在連接字符串中指定它。

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

然後,你可以沿着

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

行執行SQL如果電子表格沒有你仍然可以使用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] <> ''" 
+0

不幸的是,我在發佈之前就已經嘗試了這個確切的語法,並且它不起作用。 – NicVerAZ

+0

@NicVerAZ或許您可以嘗試閱讀所有數據並在DataTable中對其進行操作,正如Derek所建議的那樣。 –

+0

我設法通過確保電子表格包含標題來使其工作。不幸的是,它不會採用通用列名稱。 – NicVerAZ