none
執行階段錯誤 '-2147467259(80004005)' RRS feed

  • 問題

  • 我用以下的方式來執行 Sheet 的insert 動作

    Sub XXXXX()
      For i = 1 To 3
        shName = "temp3"
        cpnr = "CH51002K996"
        yyyymm01 = 20060110
        qty = 100
        Call insert2temp3_do(shName, cpnr, yyyymm01, qty)      '實做 寫到 temp3
      Next
     
    End Sub

    Function insert2temp3_do(shName As Variant, cpnr As Variant, yyyymm01 As Variant, qty As Variant)   '實做 寫到 temp3
       

       Dim conn2 As New ADODB.Connection
      
       conn2.Open "Provider=Microsoft.Jet.OLEDB.4.0;" & _
          "Data Source=" & ThisWorkbook.Path & "\" & ThisWorkbook.Name & ";Extended Properties=Excel 8.0;"
          

                   
       ' sqlx = "Insert into [" & shName & "$] (CPNR,YYYYMM01,QTY) VALUES('" & cpnr & "'," & yyyymm01 & "," & qty & ")"
       sqlx = "insert into  [" & shName & "$]  (CPNR)  values('" & cpnr & "')"
                   
       'sqlx = "insert into [temp3$] (CPNR)  values('1')"
         
       
    Debug.Print "sqlX--->" & sqlx
        
       conn2.Execute sqlx
         
       conn2.Close
       
       
    End Function

    --------------------------------------------------------以這樣跑是可以執行的

    但是 用 以下的

    sun main

    filename = ThisWorkbook.Name
       
        myCnc = "Driver={Microsoft Excel Driver (*.xls)};" & _
                "DBQ=" & ThisWorkbook.Path & "\" & filename & ";"
       
        myCmd = " select cpnr," & m1 & "/" & m1_c_out & "," & m2 & "/" & m2_c_out & " from [temp2$] where cpnr is not null and " & m1 & " is not null and " & m2 & " is not null "
     
       
        Debug.Print myCmd
           
        myCon.Open "Provider=MSDASQL;" & myCnc
       
        With myRst
            .ActiveConnection = myCon
     
            .Source = myCmd
           
            .CursorType = adOpenStatic  '必須用adOpenStatic 才能得到RCount
            .Open
        End With
      
    'Debug.Print myRst.RecordCount '有幾筆
      
      
         Dim x As String
      
        
         If myRst.RecordCount > 0 Then
           
            Do Until myRst.EOF = True
           
                cpnr = myRst.Fields(0)
                c1 = myRst.Fields(1)
                c2 = myRst.Fields(2)
               
                'Debug.Print cpnr & "<-->" & c1 & "<---->" & c2
               
    '-----分別寫到 temp3
               
               ' Call insert2temp3(shName_3, cpnr, yyyymm01_m1, yyyymm01_m2, c1, c2)  '寫到 temp3
                       
                Call insert2temp3_do(shName_3, cpnr, yyyymm01_m1, c1)      '實做 寫到 temp3
               
                myRst.MoveNext        '移動目前記錄
            Loop
      
         End If
      
         myRst.Close
         Set myRst = Nothing                     '物件的釋放
       
         myCon.Close
         Set myCon = Nothing
       

    end sub

     

    就會出現 於   conn2.Execute sqlx         ERROR

    ====

    執行階段錯誤 '-2147467259(80004005)'

    運作必須使用更新查詢

    ====

     

    請問 這該如何解決

    2006年10月11日 上午 03:27

解答

  • 建議你只使用 OleDb 寫入 Excel 。

    ADO 2.5 以前的 ODBC 不能寫入 Excel ,只能唯獨,之後我就沒試了。有聽網友說過 2.7 以後可以寫入,不過沒試過不確定。

    2006年10月11日 上午 06:05
    版主

所有回覆

  • 建議你只使用 OleDb 寫入 Excel 。

    ADO 2.5 以前的 ODBC 不能寫入 Excel ,只能唯獨,之後我就沒試了。有聽網友說過 2.7 以後可以寫入,不過沒試過不確定。

    2006年10月11日 上午 06:05
    版主
  • 謝謝您!

    不過 我應該是用 Provider=Microsoft.Jet.OLEDB.4.0 來寫入吧

    目前 我若只單存 用 .cells() 的方法來讀取資料 ,再來做 insert 的動作 是沒有問題

    但是 當我 將 .cells() 的方法 改用 另一個 SQL 的rs 來讀取一筆一筆資料後, 再利用 insert 來寫入

    就發生問題了!??

     

    2006年10月11日 上午 06:20
  • ?

    你說不能跑的那段是用:

     myCnc = "Driver={Microsoft Excel Driver (*.xls)};" & _
                "DBQ=" & ThisWorkbook.Path & "\" & filename & ";"

    用 Driver=xxxx 這種連線字串屬於 ODBC 連線字串。

    另外 .Cells 屬性應該是 Automation 方式才能用吧? (Excel.Application)

    2006年10月11日 上午 06:28
    版主
  • 不好意思!

    我'上面的 3個程式分別為

    Sub XXXXX()

    Function insert2temp3_do(shName As Variant, cpnr As Variant, yyyymm01 As Variant, qty As Variant)   '實做 寫到 temp3

    sun main

    皆可獨立 run

    -----------

    若是 我用   sub XXXXX () 裡面 再加上 Function insert2temp3_do 也可以正常run

    但是  sun main 裡面 加上 Function insert2temp3_do  就出現 EXCEPTION 了

     

     

    2006年10月12日 上午 12:26
  • 建議你重整你的問題。你的問題有點混亂,不是很容易了解。

    Excel 不適合當資料庫還有一個重大原因,就是最多只能有一人同時存取,你所描述的第二部份,重看的結果,並未看到你把 odbc 連線關閉,你就再用 OleDb 連線開啟,80004005 常常是沒有更新權限的問題,這樣就判斷成你的 Excel 遭受鎖定,無法寫入。

    2006年10月12日 上午 12:39
    版主
  • 謝謝 您的回覆:

    不過想請問的是, 一定 要關掉 odbc 連線關閉 ,才可以再使用  OleDb 連線 嗎?

    因為 比如 我撈出10筆資料, 我想用每一筆資料 ,去 比對 其他資料 或是 將撈出的資料 整理後 寫到 Sheet中

    這樣 就不可以嗎 ???

    另外 ,80004005 常常是沒有更新權限的問題 ,可是 我只單獨 使用 Function insert...這一個來做 insert 的動作 他卻可以跑的

    但 未關掉 odbc 連線 , 來使用 Function insert...  來RUN( 即 odbc 的每一筆rescordSet 做一次 呼叫 insert 的動作 ) ,就會沒有權限嗎 ???

    麻煩您了!

    謝謝!

     

     

     

    2006年10月14日 上午 12:22
  • 我印象中不管用 odbc 還是 Oledb 開 Excel ,都會用獨占權限開啟,所以只能有一個人用。

    這就是 Excel 基本上就不適合當資料庫的重要原因之一,其次是沒有強型別。

    我自己很久不用 Excel 當資料庫,MDAC 2.6 以後有沒有變更我不確定。

    更多細節你可以去 http://support.microsoft.com/ 以 ADO Excel 為關鍵字找看看。

    2006年10月14日 上午 06:16
    版主
  • 這篇有寫到:

    http://support.microsoft.com/kb/257819/zh-tw

    使用 Microsoft OLE DB Provider for ODBC Drivers

    ODBC 驅動程式的提供者 (在本文中簡稱為「ODBC 提供者」) 也需要兩種資訊,來連線至 Excel 資料來源:驅動程式名稱,以及活頁簿路徑和檔案名稱。

    重要:依預設,ODBC 與 Excel 的連線是唯讀的。您的 ADO 資料錄集 LockType 屬性設定不會覆寫這個連線層級的設定。如果您要編輯資料,必須在連接字串或 DSN 設定中將 ReadOnly 設定為 False。否則,您會收到下列錯誤訊息:

    Operation must use an updateable query. (操作必須使用可更新的查詢)

    使用無 DSN 連接字串的 ODBC 提供者

    Dim cn as ADODB.Connection
    Set cn = New ADODB.Connection
    With cn
    	.Provider = "MSDASQL"
    	.ConnectionString = "Driver={Microsoft Excel Driver (*.xls)};" & _
    "DBQ=C:\MyFolder\MyWorkbook.xls; ReadOnly=False;"
    	.Open
    End With
    
    2006年10月28日 上午 02:22
    版主