2013-08-22 50 views
0

我正在嘗試更新Excel工作表的單個單元格。請注意,在我下面的示例代碼中,我使用了列和行的變量,因爲這將根據我的程序的其他部分進行更改,但出於調試目的,我已分別將它們設置爲A和1。使用OleDb更新Excel工作表

現在我得到一個錯誤說:「語法錯誤(缺少操作員)在查詢表達式'06:31 PM」

請不要簡單地提示我參數,因爲我知道這不會解決我的問題我不是事先大家擔心注射

感謝

 string newColumn = "A"; 
     string newRow = "1"; 
     string worksheet2 = strMonth; 

     var cnnStr2 = String.Format("Provider=Microsoft.Jet.OLEDB.4.0;Data Source={0};Extended Properties=\"Excel 8.0;IMEX=1;HDR=NO\"", textBox1.Text); 
     var cnn2 = new OleDbConnection(cnnStr2); 

     cnn2.Open(); 

     string sql2 = String.Format("UPDATE [{0}$] SET {1}{2}={3}", worksheet2, newColumn, newRow, dtpTime.Text.Substring(0, 8)); 
     OleDbCommand objCmdSelect = new OleDbCommand(sql2, cnn2); 
     objCmdSelect.ExecuteNonQuery(); 

     cnn2.Close(); 

編輯:基於格哈德建議的鏈接,我已經改變了我的命令文本如下:

string sql2 = String.Format("UPDATE [{0}${1}{2}:{1}{2}] SET F1='{3}'", worksheet2, newColumn, newRow, dtpTime.Text.Substring(0, 8)); 

這現在產生錯誤「操作必須使用可更新的查詢。」不知道現在該做什麼。 {1} {2}:{1} {2}給出工作表{0} $上的單個單元格範圍,如果沒有列名,我在連接字符串中指定了F1,沒有。最後,{3}是我用來更新單元格的子字符串,並且只用單引號,因爲每個人似乎都這樣做。如果我刪除單引號,它只會產生一個不同的錯誤。

+0

是的。然後錯誤更改爲「沒有給出一個或多個所需參數的值」。 –

+2

也許這將有助於:http://forums.asp.net/t/1214491.aspx/1 –

+0

或此(教程):http://yoursandmyideas.wordpress.com/2011/02/05/how-to-讀或寫 - 使用excel-file-using-ace-oledb-data-provider/ –

回答

1

我編輯的命令字符串是正確的。但是爲了擺脫新的錯誤,我必須在連接字符串中取出「IMEX = 1」。不是100%確定爲什麼這使它工作,但它確實如此。

我在查找使用oledb命令時注意到的一件事情是,像我一樣,每個人似乎都對命令的每個部分都在做什麼感到困惑。我仍然不完全瞭解可以添加到「WHERE」中的一些特殊功能,但我想在此添加一些信息以幫助任何發現此問題並存在類似問題的人。

在SELECT語句中,如果你想選擇一個單元格,可以使用這樣的事情:

string commandString = String.Format("SELECT * FROM [{0}${1}{2}:{1}{2}]", worksheetName, column, row); 

「SELECT * FROM」 將從 「worksheetName」 選擇一切。然後,您必須使用「$」跟蹤工作表的名稱。接下來,「{1} {2}:{1} {2}」是您正在選擇的單元格的範圍。在這裏,通過使冒號兩邊的列和行相同,您可以選擇單個單元格的範圍。例如,「E3:E3」只會選擇單元格E3中的內容。

在UPDATE語句中,如果你想更新某一個單元,你可以使用類似:

string commandString = String.Format("UPDATE [{0}${1}{2}:{1}{2}] SET F1='{3}'",worksheetName, column, row, data); 

這裏要注意的唯一區別是「SET F1 =‘{3}’」。這會將您在範圍中指定的單元格設置爲數據變量中的內容。注意使用「F1」。這只是在連接字符串中指定「HDR = NO」時使用的默認值,換句話說,不存在列標題或名稱。如果你有列標題,你可以使用它來代替F1。這裏很重要的一點是,F1不以任何方式與F1單元相對應。

0

我在這個問題上度過了一個週末。最後,我可以解決。我將連接字符串更改爲:

Microsoft.Jet.OLEDB.4.0; Data Source ='文件路徑';擴展屬性='Excel 8。0'

WITH OUT IMEX或HDR選項。 以前,我檢查並更改了excel文件中的cellprotection檢查。我希望這可以幫助別人。

相關問題