从 VB Access 调用 UDF(Sql server)“表达式中的未定义函数 <函数名>”
Posted
技术标签:
【中文标题】从 VB Access 调用 UDF(Sql server)“表达式中的未定义函数 <函数名>”【英文标题】:Calling a UDF (Sql server) from VB Access "Undefined function <function name> in expression" 【发布时间】:2015-04-01 10:50:00 【问题描述】:我正在尝试从访问中的 Vb 代码调用 udf(SQL 服务器)。与数据库的连接成功,我能够在 SQL 服务器表上运行查询。但是,当我尝试调用 UDF 时,它会抛出一个错误,提示 undefined function。
请看下面的代码:
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")
有人可以看看我是否在这里遗漏了什么。
【问题讨论】:
架构名称是否应该在函数名称之前加上前缀,即。 dbo.fn_validate_user 我尝试了使用和不使用模式名称,但它没有帮助。我还尝试在架构名称之上添加数据库名称,但没有成功 【参考方案1】:当您在 Access 中运行标准查询时,它首先由 Access 数据库引擎处理,即使该查询引用 ODBC 链接表。 Access 可以识别 Access 用户定义的函数(使用 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
【讨论】:
以上是关于从 VB Access 调用 UDF(Sql server)“表达式中的未定义函数 <函数名>”的主要内容,如果未能解决你的问题,请参考以下文章
VB6/Microsoft Access/DAO 到 VB.NET/SQL Server... 有建议吗?
Spark SQL:如何使用 JAVA 从 DataFrame 操作中调用 UDF