sql函数中的VBA错误调用转义错误陷阱

时间:2015-12-22 20:06:06

标签: sql vba function ms-access error-handling

当sql查询调用vba函数并且该函数引发错误时,错误处理代码无法处理错误。

见下面的例子。执行Set rst = db.OpenRecordset(strSql)时,strSql中对GetId()的调用会生成错误。 On Error GoTo Err_Test错误处理程序不会处理此错误!

Public Function GetId() As Long
    Err.Raise 11     'Divide by zero error
End Function

Public Function Test() As String

    On Error GoTo Err_Test
    Dim db As DAO.Database
    Dim rst As DAO.Recordset
    Dim strSql As String

    Set db = CurrentDb()
    strSql = "Select * FROM MyTable WHERE MyTable.Id = GetId()"
    Set rst = db.OpenRecordset(strSql)
    Test = rst!name

Exit_Test:
    If Not rst Is Nothing Then
        rst.Close
        Set rst = Nothing
    End If
    Set db = Nothing
    Exit Function

Err_Test:
    MsgBox Error$
    Resume Exit_Test
End Function

为什么错误会逃避错误处理程序,并且当sql调用生成异常的vba函数时,是否有某种方法可以正常处理它?<​​/ p>

我知道从sql字符串中删除函数调用,如下所示,将使错误处理程序能够捕获错误。

Dim id as Long
id = GetId()
strSql = "Select * FROM MyTable WHERE MyTable.Id = " & id

这是唯一的方法吗?如果是这样,是否应该避免在sql查询字符串中使用函数调用以避免未处理的异常?

1 个答案:

答案 0 :(得分:1)

我对观察到的行为的看法是:

运行':'时,"Select * FROM MyTable WHERE MyTable.Id = GetId()"由查询引擎评估,而不是GetId()评估,因此Test()中的错误处理程序无法捕获运行时错误。它就像将SQL放入查询并运行它一样。

执行Test()"Select * FROM MyTable WHERE MyTable.Id = " & GetId() 由<{1}}进行评估。
这将是&#34;正常&#34;运行示例的方法(在VBA函数中打开记录集),IMO。

但您也可以在查询中使用GetId()等VBA函数。您只需要确保该函数足够简单以至于无法触发运行时错误,或者该函数有自己的错误处理程序。

如果函数只运行一次(在WHERE子句中),则可以接受MsgBox作为错误处理程序。如果为每一行运行该函数(即它在SELECT子句中的运行),这可能会带来真正可怕的用户体验。 :P
因此,请确保在这种情况下函数返回错误代码或NULL或任何适用的内容,例如vacip写的。