首先,我真的很抱歉,如果有人及時地指出我回答這個問題的帖子。我在篩選董事會方面並不擅長,但一直在尋找大約一週的時間。許多線程與我的問題類似,但沒有一個完全反映了我想要做的或我遇到的問題。我發現的最接近的是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
你在哪裏設置在語句'strSql =「UPDATE」&Dest_Table&strSql'中使用的變量'Dest_Table'? (據我所見,你不使用'strSql',所以它可能並不重要。) – YowE3K
我們需要實際的SQL,它在執行時給出錯誤。 [如何在VBA中調試動態SQL](http://stackoverflow.com/a/1099570/3820271) – Andre
謝謝YowE3K和Andre的回覆! Dest_Table在Load_Globals子例程中被設置爲「TESTTABLE」,但我使用statis strSQL =「...」stmt來進行調試。 –