updatesql 时记录集关闭?
recordset close when updatesql?
我有一个 Excel VBA 来更新 Access 中的数据。我使用下面的脚本。
我只是有一个小问题。如果我用 rs.close 关闭记录集,我会收到消息 'operation is not allowed when the object is closed'。如果我不使用 rs.close 那么它就可以正常工作。
使用sql时真的需要rs.close吗?
我也试过用cn.execute更新sql。如何设置记录锁定属性?
Public Sub Upload_to_DB()
Call setparameters
' exports data from the worksheet to a table in an Access database
Dim cn As ADODB.Connection ws As Worksheet , updatesql As String, r_fld As Long, r_val As Long, c As Long, str As String, rs As ADODB.Recordset
Set cn = CreateObject("ADODB.Connection")
cn.mode = 16 + 3
cn.Open "Provider=Microsoft.ACE.OLEDB.12.0; " & _
"Data Source= " & Path & filename & ";"
cn.CursorLocation = adUseClient
Set rs = CreateObject("ADODB.Recordset")
Set ws = Sheets("Opportunity_down_and_upload")
With ws
r_fld = 13
r_val = 14
c = 3
str = Empty
str = .Cells(r_fld, c).Offset(0, -1).Value & " = " & .Cells(r_val, c).Offset(0, -1).Value
continue = True
Do
str = str & " , " & .Cells(r_fld, c).Value & " = " & .Cells(r_val, c).Value
c = c + 1
If IsEmpty(.Cells(r_fld, c)) Then continue = False
Loop Until continue = False
End With
'This part is important:'
updatesql = "UPDATE tbl_D_opp_prod_offer SET "
updatesql = updatesql & str
updatesql = updatesql & " WHERE [Opp_ID] = " & ws.Range("A10") & ";"
rs.Open updatesql, cn, , adLockOptimistic, adCmdText
cn.Close
Set rs = Nothing
Set cn = Nothing
End Sub
使用sql时真的需要rs.close吗?
没有。事实上,rs.close
根本不是必需的。 VBA 将在对象超出范围时自动删除对象,这意味着如果它们是在 sub 中定义的,它们将在它的末尾被删除。对于 ADODB,旧版本中存在一些错误导致其不可靠,这意味着旧代码通常包含 rs.close
或 connection.close
而它们并不是真正必要的
我也试过用cn.execute更新sql。如何设置记录锁定属性?
你不能。它并不真正适用于动作查询。记录锁定选项定义记录是否应该在开始编辑时锁定,在更新时锁定,或者根本不能锁定,因为它是只读的,并且由于您正在使用更新查询,因此在这些之间没有时间
我有一个 Excel VBA 来更新 Access 中的数据。我使用下面的脚本。 我只是有一个小问题。如果我用 rs.close 关闭记录集,我会收到消息 'operation is not allowed when the object is closed'。如果我不使用 rs.close 那么它就可以正常工作。
使用sql时真的需要rs.close吗?
我也试过用cn.execute更新sql。如何设置记录锁定属性?
Public Sub Upload_to_DB() Call setparameters ' exports data from the worksheet to a table in an Access database Dim cn As ADODB.Connection ws As Worksheet , updatesql As String, r_fld As Long, r_val As Long, c As Long, str As String, rs As ADODB.Recordset Set cn = CreateObject("ADODB.Connection") cn.mode = 16 + 3 cn.Open "Provider=Microsoft.ACE.OLEDB.12.0; " & _ "Data Source= " & Path & filename & ";" cn.CursorLocation = adUseClient Set rs = CreateObject("ADODB.Recordset") Set ws = Sheets("Opportunity_down_and_upload") With ws r_fld = 13 r_val = 14 c = 3 str = Empty str = .Cells(r_fld, c).Offset(0, -1).Value & " = " & .Cells(r_val, c).Offset(0, -1).Value continue = True Do str = str & " , " & .Cells(r_fld, c).Value & " = " & .Cells(r_val, c).Value c = c + 1 If IsEmpty(.Cells(r_fld, c)) Then continue = False Loop Until continue = False End With 'This part is important:' updatesql = "UPDATE tbl_D_opp_prod_offer SET " updatesql = updatesql & str updatesql = updatesql & " WHERE [Opp_ID] = " & ws.Range("A10") & ";" rs.Open updatesql, cn, , adLockOptimistic, adCmdText cn.Close Set rs = Nothing Set cn = Nothing End Sub
使用sql时真的需要rs.close吗?
没有。事实上,
rs.close
根本不是必需的。 VBA 将在对象超出范围时自动删除对象,这意味着如果它们是在 sub 中定义的,它们将在它的末尾被删除。对于 ADODB,旧版本中存在一些错误导致其不可靠,这意味着旧代码通常包含rs.close
或connection.close
而它们并不是真正必要的我也试过用cn.execute更新sql。如何设置记录锁定属性?
你不能。它并不真正适用于动作查询。记录锁定选项定义记录是否应该在开始编辑时锁定,在更新时锁定,或者根本不能锁定,因为它是只读的,并且由于您正在使用更新查询,因此在这些之间没有时间