代码之家  ›  专栏  ›  技术社区  ›  Kunal

从VB Access“表达式中未定义的函数<函数名>”调用UDF(Sql服务器)

  •  2
  • Kunal  · 技术社区  · 10 年前

    我试图从访问中的Vb代码调用udf(SQL服务器)。连接到数据库成功,我能够在SQL server表上运行查询。然而,当我尝试调用UDF时,它会向我抛出一个错误: 未定义函数 .

    请参见以下代码:

    Private Sub cmd_Login_Click()
        ' some code here
        Set db = CurrentDb()
    
        sSQL = "SELECT UserID FROM TBL_User_Login WHERE UserName = '" & cbo_User & "' AND Status = 0"
        Set recset = db.OpenRecordset(sSQL)
    
    
        recset.Close
        Set rectset = Nothing
    
        sSQL = "SELECT fn_validate_user(" & gb_UserId & ",'" & Hash(Me.txt_Password + cbo_User) & "') AS PasswordValid"
        Set recset = db.OpenRecordset(sSQL)  ' this is where i get error for undefined function fn_validate_user
        PasswordValid = recset("PasswordValid")
    

    有人能看看我是不是遗漏了什么吗。

    1 回复  |  直到 4 年前
        1
  •  2
  •   Gord Thompson    10 年前

    在Access中运行标准查询时,它首先由Access数据库引擎处理,即使该查询引用ODBC链接表。访问可以识别 通道 用户定义函数(使用VBA创建),但它不知道SQL Server用户定义函数。

    为了使用SQL Server用户定义的函数,需要使用传递查询。顾名思义,它绕过Access数据库引擎,将查询直接发送到远程数据库(通过ODBC)。要执行此操作的VBA代码如下所示:

    Dim db As DAO.Database, qdf As DAO.QueryDef, recset As DAO.Recordset
    Dim sSQL As String, PasswordValid As Boolean
    Set db = CurrentDb
    sSQL = "SELECT fn_validate_user(" & gb_UserId & ",'" & Hash(Me.txt_Password + cbo_User) & "') AS PasswordValid"
    Set qdf = db.CreateQueryDef("")
    ' get .Connect property from existing ODBC linked table
    qdf.Connect = db.TableDefs("TBL_User_Login").Connect
    qdf.ReturnsRecords = True
    qdf.SQL = sSQL
    Set recset = qdf.OpenRecordset(dbOpenSnapshot)
    PasswordValid = recset.Fields("PasswordValid").Value
    recset.Close
    Set recset = Nothing
    Set qdf = Nothing