【问题标题】:VBA ODBC UpdateVBA ODBC 更新
【发布时间】:2010-05-24 20:14:46
【问题描述】:
这是我用来更新 SQL 数据库的代码:
Public Sub main()
Dim cnn As ADODB.Connection
Dim rst As ADODB.Recordset
Set cnn = New ADODB.Connection
Set rst = New ADODB.Recordset
cnn.Open "ConnectionName"
rst.ActiveConnection = cnn
rst.CursorLocation = adUseServer
rst.Source = "Update Table ..."
rst.Open
Set rst = Nothing
Set cnn = Nothing
End Sub
我想知道的是在打开第一个对象后是否以及如何处理它。我要关闭它吗?当我尝试执行 rst.Close 时,出现错误:“对象关闭时不允许操作”。如果没有 rst.Close,代码可以正常工作,我想知道不关闭对象是否有任何危险。
【问题讨论】:
标签:
sql
vba
odbc
sql-update
【解决方案1】:
UPDATE 操作不返回结果集。因此,如果使用Recordset 对象执行,它会导致一个空且关闭的记录集。无论如何它都无法关闭,因为它从未被打开过。
经验法则是:
if rst.State <> adStateClosed then rst.Close
但是,因为您正在执行一个无论如何都不会返回数据的命令,所以首选方式是:
dim cm as ADODB.Command
set cm = new adodb.command
set cm.activeconnection = cnn
cm.commandtype = adCmdText
cm.commandtext = "UPDATE ..."
cm.execute ,, adExecuteNoRecords
或者,如果你的 SQL 是一个没有参数的固定字符串,
cnn.execute "UPDATE ...",, adExecuteNoRecords
另外,请将rst.ActiveConnection = cnn 更改为Set rst.ActiveConnection = cnn。
【解决方案2】:
更新不返回任何行,因此无需打开记录集。
您可以使用以下命令直接执行该语句:
Connection.Execute "Update Table ...", [flags]
为了回答您的问题,在.Open 之后记录集被关闭(其.state 将是adStateClosed),因为没有返回任何数据,因此将其设置为空就足够了。