2011-02-08 35 views
0

我得到當我試圖寫入使用2005 VB.net Excel工作表錯誤寫用vb.net

操作必須使用一個可更新的查詢錯誤消息的Excel工作表時

我已經通過S/O搜索結果
https://stackoverflow.com/search?q=Operation+must+use+an+updateable+query,
但沒有響應解決我的問題。

我的代碼是:

Dim strXLScn As String = "Provider=Microsoft.Jet.OLEDB.4.0;Data Source=" & xlsFilePath.Text & ";Extended Properties=""Excel 8.0;HDR=Yes;IMEX=1""" 

     Dim XLConn As New OleDb.OleDbConnection(strXLSconn) 
     Dim XLcmd As New System.Data.OleDb.OleDbCommand 
     Dim sSQLWriteToExcel As String 

     strExcel = "INSERT INTO [Sheet1$A1:A1] Values ('" & sCity & "')" 

     Dim oleCMD As New OleDb.OleDbCommand(strExcel, XLConn) 
     Dim oleDA As New OleDb.OleDbDataAdapter(oleCMD) 

     XLConn.Open() 
     XLcmd.Connection = XLConn 

     XLcmd.CommandText = strExcel 
     XLcmd.ExecuteNonQuery() 
     XLConn.Close() 

任何想法?

+0

下一次,也許你想先搜索,如果c#適合。 – Fionnuala 2011-02-09 15:53:25

回答

1

首先要做的第一件事,確保您有Option Explicit ON,這將有助於您嘗試使用的變量,而您從未聲明過。其次,從連接字符串的末尾刪除IMEX = 1。第三,確保你的excel文件有一個標題行。此代碼爲我工作:

 Dim strXLScn As String = "Provider=Microsoft.Jet.OLEDB.4.0;Data Source=""C:\Temp\test.xls"";Extended Properties=""Excel 8.0;HDR=Yes""" 

    Dim XLConn As New OleDb.OleDbConnection(strXLScn) 
    Dim XLcmd As New System.Data.OleDb.OleDbCommand 
    Dim strExcel As String 
    Dim sCity As String = "Sydney" 
    strExcel = "INSERT INTO [Sheet1$] Values ('" & sCity & "')" 

    Dim oleCMD As New OleDb.OleDbCommand(strExcel, XLConn) 
    Dim oleDA As New OleDb.OleDbDataAdapter(oleCMD) 

    XLConn.Open() 
    XLcmd.Connection = XLConn 

    XLcmd.CommandText = strExcel 
    XLcmd.ExecuteNonQuery() 
    XLConn.Close() 
+0

是否可以確保正在啓用ReadWrite啓用?我感覺文件的實例處於ReadOnly模式。 – user279521 2011-02-09 21:10:15

0

(Appoligies這不是VB,而C#,但我認爲這是簡單的和足夠短,一個人應該能夠很容易地轉換成VB。)

我發現這篇文章和其他一些文章很有用。這是我想出來的。它在VS2010中工作。

請注意Excel工作表具有標題。因此,連接字符串中的「HDR = Yes」。

這裏是我將如何格式化C#中的字符串。它使用字符串變量(代理)和結構(地址):

「INSERT INTO [代理商列表$]([Agency],[Street1],[Street2],[City],[Postal Code], [國家代碼])VALUES(''+ agency +'','「+ Address.Street1.Replace(」'「,」''「)+」','「+ Address.Street2.Replace(」'「, 「''」)+「','」+ Address.City.Replace(「'」,「''」)+「','」+ Address.PostalCode.Replace(「'」,「''」)+ 「','」+ Address.Country.Replace(「'」,「''」)+「')」

請注意,表格被調出(「代理商名單」),每個字段/標題例如「[Agency]」)被括起來,並且String.Replace方法用於處理嵌入的單引號(tick)標記。

乾杯!

public void InsertExcelData(String fileName, String sqlString) 
{ 
    string connectionString = "Provider=Microsoft.ACE.OLEDB.12.0;Data Source=" + fileName + ";Extended Properties=\"Excel 12.0;HDR=Yes;\";"; 

    OleDbConnection connection = new OleDbConnection(connectionString); 

    OleDbCommand command = new OleDbCommand(connectionString, connection); 

    command.CommandText = sqlString; 

    // Connect to the worksheet 
    connection.Open(); 

    // Do the Insert 
    command.ExecuteNonQuery(); 

    // Clean up 
    connection.Close(); 
    connection.Dispose(); 
}