2017-04-24 43 views
1

首先,我真的很抱歉,如果有人及時地指出我回答這個問題的帖子。我在篩選董事會方面並不擅長,但一直在尋找大約一週的時間。許多線程與我的問題類似,但沒有一個完全反映了我想要做的或我遇到的問題。我發現的最接近的是here。到達那裏的解決方案並沒有解決我的問題。從ADODB命令/記錄集更新ACCESS時出錯

我想從使用VBA的更新Excel工作表中更新ACCESS 2007數據庫中的記錄。我已經完成從ACCESS獲取信息到Excel,並從Excel到我的記錄集。現在,我需要用填充的記錄集更新ACCESS。

Public Sub Read_Spreadsheet() 
    Dim strSql As String, target_fields As String 
    Dim fuel_table As String, new_values As String 
    Dim roww As Integer, coll As Integer 
    Dim i As Integer, n As Integer, mbrs(32) As Integer 
    Call Load_Globals 

' Configure ADODB connection, command, recordset objects 
    With cn1 
     .Provider = "Microsoft.JET.OLEDB.4.0" 
     .ConnectionString = "Data Source = " & Src_WB_nm & "; " & _ 
      "Extended Properties='Excel 8.0;HDR=Yes;IMEX=1'" 
     .Open 
    End With 
    Set cmd1.ActiveConnection = cn1 
    cmd1.CommandType = adCmdText 
    cmd1.CommandText = "SELECT * FROM [" & Src_WS_nm & "$]" 
    With rs1 
     .CursorLocation = adUseClient ' used 3 previously 
     .CursorType = adOpenDynamic  ' used 1 previously 
     .LockType = adLockOptimistic 
     .Open cmd1 
    End With 
    Debug.Print "Excel Connection established; recordset created." 

    Debug.Print "Fields: " & rs1.Fields.count 
    Debug.Print rs1.Fields(0).name 
    Debug.Print rs1.Fields(1).name 

'-------------------------------------------------------------------------- 
    With cn2 
     .Provider = "Microsoft.ACE.OLEDB.12.0" 
     .ConnectionString = "Data Source = " & Dest_DB 
     .Open 
    End With 
    With rs2 
     .CursorLocation = adUseClient ' used 3 previously 
     .CursorType = adOpenDynamic  ' used 1 previously 
     .LockType = adLockOptimistic 
    End With 
    Debug.Print "Access connection established." 

'-------------------------------------------------------------------------- 
' NOTE to S.O. readers, Two nested loops are commented out below 
' These will eventually loop through an uncertain number of fields 
' (~10) and records (~2000) to make all the SQL updates. For debugging, 
' I'm just trying to get 1 pass to be successful. 
' 
' For n = 1 To rs1.RecordCount 
' strSql = "SELECT ID, FSERIAL FROM TESTTABLE WHERE ID = 1" 
     strSql = "" 
     i = 1 
'  For i = 1 To rs1.Fields.count - 1 
      If i <> 1 Then strSql = strSql & ", " 
      strSql = strSql & " SET [" & rs1.Fields(i).name & "] = " & Chr(39) & rs1.Fields(i).Value & Chr(39) 
'  Next i 
     strSql = "UPDATE " & Dest_Table & strSql & " WHERE [ID] = " & rs1.Fields(0).Value 
     strSql = "UPDATE TESTTABLE SET BATCH = 'B' WHERE ID = 11" 

     Debug.Print strSql 
     Set cmd2 = New ADODB.Command 
     With cmd2 
      .ActiveConnection = cn2 
      .CommandType = adCmdText 
      .CommandText = strSql 
      .Execute , , adCmdText + adExecuteNoRecords 
     End With 
    '  CP.Cells(27 + n, 4) = rs1(0) 
    '  CP.Cells(27 + n, 5) = rs1(1) 
     rs1.MoveNext 
     Set cmd2 = Nothing 

' Next n 

' cmd2.CommandText = "SELECT ID, FSERIAL FROM TESTTABLE WHERE ID = 1" 
' cmd2.CommandText = "UPDATE TESTTABLE SET BATCH = B WHERE ID = 1" 
' Debug.Print cmd2.CommandText 
' rs2.Open cmd2 
' CP.Cells(28, 4).CopyFromRecordset rs2 

    Call Close_Connections 
End Sub 

這兩個訪問& Excel是2007年,我在Windows 7,32位操作系統。我正在使用以下VBA引用:MS ADO Ext。 6.0爲DDL和安全,MS ActiveX數據Ojects Recordset 6.0 Lib,MS ActiveX對象6.1 Lib,MS Access 12.0對象Lib,OLE自動化。 (抱歉,我還沒有發佈圖像)

一切正常,直到cmd2.execute命令(這是由調試器突出顯示的行)。如果我用一個簡單的靜態SELECT替換SQL查詢並將它轉儲到rs2中,它就能正常工作。這是當我嘗試只更新我遇到問題時。

的debug.print STRSQL命令產量「'UPDATE SET TestTable的BATCH = 'B' WHERE ID = 11"

我還試圖「UPDATE SET TestTable的[BATCH] = 'B' WHERE [ID] = 11「等排列,沒有成功。

錯誤是:「運行時錯誤'-2147217904(80040e10)':沒有給出一個或多個必需參數的值。」

謝謝你的幫助!我非常感謝,並且一定會對解決方案進行排名/標記。

,Mike Shanahan

+0

你在哪裏設置在語句'strSql =「UPDATE」&Dest_Table&strSql'中使用的變量'Dest_Table'? (據我所見,你不使用'strSql',所以它可能並不重要。) – YowE3K

+1

我們需要實際的SQL,它在執行時給出錯誤。 [如何在VBA中調試動態SQL](http://stackoverflow.com/a/1099570/3820271) – Andre

+0

謝謝YowE3K和Andre的回覆! Dest_Table在Load_Globals子例程中被設置爲「TESTTABLE」,但我使用statis strSQL =「...」stmt來進行調試。 –

回答

2

您的查詢結果不合格。我想你想要的是:

For i = 1 To rs1.Fields.count - 1 
    if i<>1 Then strsql = strsql & ", " 
    strSql = strSql & "[" & rs1.Fields(i).name & "] = " & rs1.Fields(i).Value 
Next i 

strsql = "UPDATE " & Dest_Table & " SET " & strSql & " WHERE [ID] = " & rs1.Fields(0).Value 

但是,這假設所有值都是數字。您仍然需要解決這個問題,以便與單個引號括起來的字符串相對應。例如,你的測試查詢應該是:

.CommandText = "UPDATE TESTTABLE SET BATCH = 'B' WHERE ID = 1" 
'           ^^^ 

正如評論所說,一個簡單的Debug.Print strsql非常helful調試查詢。

+0

感謝您糾正我的查詢一代;那肯定會成爲一個問題! –

+0

不幸的是,它並沒有解決眼前的問題。我已根據您的建議修改了代碼,將測試查詢語句移到了真正的查詢語句的下面,然後我移除了循環,以便測試例程的單次迭代。還是行不通。我已經用我的VBA屏幕的新代碼和屏幕截圖編輯了我的帖子。 –

+1

備份舞臺教練!我的問題現在已經解決了。我忽略了第一次重新啓動我的程序,有時我的數據庫連接似乎在經過長時間的調試後崩潰。無論如何,我現在正在運行! 非常感謝您的幫助和時間A.S.H.! –