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

标签 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函数时,错误会逃避错误处理程序,并且有某种方法可以优雅地处理它?

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

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

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

最佳答案

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

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

执行"Select * FROM MyTable WHERE MyTable.Id = " & GetId()时,GetId()将评估Test()
这将是IMO运行示例(在VBA函数中打开记录集)的“常规”方式。

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

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

关于sql - sql函数调用中的VBA错误转义错误陷阱,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34423662/

相关文章:

mysql - 创建表时出错(#1064 - 你的 sql 语法有错误)

java - 在访问游标中的数据之前,请确保游标已正确初始化。 sql 安卓

excel - VBA 复制具有匹配 ID 的所有行

c++ - 汉明距离 : Incorrect Count

javascript - 更改具有类的所有元素的 id

JavaScript 变量声明前后?

sql - 合并 SQL 语句

mysql - Sql join 4个表计数行数

vba - 使用 Excel 宏中的 Word Selection 对象

vba - 识别公式中的当前单元格