【问题标题】:Access VBA - Runtime error in Update MacroAccess VBA - 更新宏中的运行时错误
【发布时间】:2013-02-14 14:04:53
【问题描述】:

我对 vba (以及这个网站 - 如果我发布不正确,请致歉),以前是 SQL 开发人员,但不幸的是,我的新工作只涉及在 access 2010 中工作。我正在尝试构建一个将运行各种更新语句的 vba 宏。我已经在访问中构建了查询,我正在尝试在 vba 中调用查询。我曾尝试使用一个访问查询来执行此操作,但我遇到了运行时错误 - UPDATE 语句中的语法错误。查询在访问中运行良好,但 vba 函数因运行时错误而失败。

以下是我的vba函数:

Public Function TestUpdate1()
Dim cmdT As ADODB.Command
Dim cnn As ADODB.Connection
Dim prmT As ADODB.Parameter

Set cnn = Application.CurrentProject.Connection
Set cmdT = New ADODB.Command
Set cmdT.ActiveConnection = cnn
cmdT.CommandText = "Update Table 1"
cmdT.CommandType = adCmdText

'Set prmT = cmdT.Parameters("Acc_Date")
'prmT.Value = #12/31/2012#
cmdT.Execute

'Set cmdT = Nothing
'
'If Err <> 0 Then
' cmdT.ActiveConnection.RollbackTrans
'Else
' cmdT.ActiveConnection.CommitTrans
'End If
End Function

当我调试函数时,错误发生在 cmdt.Execute 行。

它正在执行的sql查询(更新表1)如下:

UPDATE Table_1 SET Product = IIf(Contract Like "*budget*amt*","BUDGET Annual",
IIf(Contract Like "*CLASSIC*AMT*","CLASSIC Annual",
IIf(Contract Like "*essential*AMT*","ESSENTIAL Annual",
IIf(Contract Like "*P*PLUS*AMT*","Premier Plus Annual",
IIf(Contract Like "*SELECT*AMT*","SELECT Annual",
IIf(Contract Like "*prestige*AMT*","PRESTIGE Annual",
IIf(Contract Like "*GAP*","GAP Productl",
IIf(Contract Like "*SINGLE*TRIP*","SINGLE TRIP",
IIf(Contract Like "*premier*","PREMIER Annual",
IIf(Contract Like "*standard*","STANDARD Annual",
IIf(Contract Like "*EVAC*","European VAC","???"))))))))))), End_Date =  Depart_Date+Days;

您可以就上述问题提供任何帮助,我们将不胜感激。

非常感谢

【问题讨论】:

    标签: vba


    【解决方案1】:

    此代码正在尝试执行 SQL 语句:更新表 1

    cmdT.CommandText = "Update Table 1"
    cmdT.CommandType = adCmdText
    cmdT.Execute
    

    要执行名为更新表1查询,您需要以下代码:

    Docmd.OpenQuery "Update Table 1" 
    

    如果您不想收到关于即将更新的行数的警告,

    With DoCmd
         .SetWarnings False
         .OpenQuery "Update Table 1"
         .SetWarnings True
    End With  
    

    这是我使用访问项目和 ADODB 运行参数化查询的代码

    Dim cmdl As ADODB.Command
    Dim StrCon As New ADODB.Connection
    Dim rsRecSet As New ADODB.Recordset
    
    StrCon.Open CurrentProject.Connection
    
    'Set CONNECTION timeout property
    StrCon.CommandTimeout = 0
    
    'Create a new command object to process the stored proc
    Set cmdl = New ADODB.Command
    
    With cmdl
        .ActiveConnection = StrCon
        'set COMMAND timeout property - query can time out on either the connection OR the command
        .CommandTimeout = 0
        .CommandText = "spCrossTabRun"
        .CommandType = adCmdStoredProc
        .Parameters.Refresh
        .Parameters(1).value = "MyValue1"
        .Parameters(2).value = "MyValue2"
        .Parameters(3).value = "MyValue3"
        Set rsRecSet = .Execute()
    End With
    

    【讨论】:

    • 嗨,肖恩,感谢您的回复。我打算走 DoCmd 路线,但这是几个更新中的第一个。我的其他更新之一有参数,所以我决定改用 ADODB,因为我不确定你是否可以使用 DoCmd 传递参数。您可以使用 ADODB 执行 Access 查询还是仅使用 SQL Server?抱歉,我只提到了 VBA 的初学者
    • @GraemeWilson,添加了 ADODB 的示例。使用 Access 项目(我假设使用 ADODB 连接),您不能将任何查询存储在数据库本身中。所有视图和过程都将在 SQL 服务器上
    【解决方案2】:

    我有几个集中的函数来返回对 adodb 记录集的只读或读/写访问权限。喜欢:

    Public Function dbWrite(SQLQuery As String, Optional blDynamic As Boolean) As ADODB.Recordset
    'Centralized function to read data from db, return a EDITABLE recordset
    Dim r As New ADODB.Recordset
    
    If blDynamic = True Then
        r.Open SQLQuery, CurrentProject.Connection, adOpenDynamic, adLockOptimistic, dbSQLPassThrough
    Else
        r.Open SQLQuery, CurrentProject.Connection, adOpenForwardOnly, adLockOptimistic, dbSQLPassThrough
    End If
    
    Set dbWrite = r
    
    Exit Function
    End function
    

    所以在一个新函数中调用它:

    Public Function SomeFunction
    Dim r As New ADODB.Recordset
    Dim s As String
    set r = dbwrite("SELECT * FROM TABLE;")
    s = "My Parameterized Value"
    r.AddNew
         r![Fieldname] = s
         r.Update
    r.Close
    set r = nothing
    End function
    

    拥有 dbWrite 函数让事情变得简单,并且一次解析出一个字段名使得调用另一个函数、简单的 IF 或诸如此类变得容易。

    【讨论】:

      猜你喜欢
      • 2017-04-06
      • 1970-01-01
      • 1970-01-01
      • 2020-05-09
      • 1970-01-01
      • 1970-01-01
      • 2012-12-13
      • 2016-12-08
      • 2017-12-01
      相关资源
      最近更新 更多