【问题标题】: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),因为没有返回任何数据,因此将其设置为空就足够了。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2011-11-17
        • 2020-05-25
        相关资源
        最近更新 更多