从 VBA 中的函数调用 SQL 服务器过程
Calling a SQL server procedure from a function in VBA
我正在尝试调用 SQL 服务器过程以通过 VBA 中的函数验证用户。
请看下面的代码:
proc_validate_user 接受 userId 和密码作为输入参数和 returns 位值 0 或 1
调用此过程的函数如下:
Public Function ExecUDF(userId As Integer, pwd As String)
Dim cmd As DAO.Command
Dim par As DAO.Parameter
Dim ret As Variant
Set cmd = New DAO.Command
cmd.ActiveConnection = CurrentDb.Connection
cmd.CommandText = "proc_validate_user"
cmd.CommandType = adCmdStoredProc
'Define the input and output variables and append them to the collection
Set par = cmd.CreateParameter("@userID")
cmd.Parameters.Append par
Set par = cmd.CreateParameter("@pwd")
cmd.Parameters.Append par
Set par = cmd.CreateParameter("@isValid", adParamOutput)
cmd.Parameters.Append par
cmd.Parameters("@userID") = userId
cmd.Parameters("@pwd") = pwd
cmd.Execute
'and then assign the stored procedure return value to the access variable
ret = cmd.Parameters("@isValid").Value
End Function
我收到一个编译错误,提示未在 "Dim cmd As DAO.Command"
处定义用户定义的类型
您混淆了 DAO 和 ADO 对象模型。 DAO 是一个完全不同的模型,而不是 "subset of ADO"。没有 DAO.Command
对象。
SQL 生成输出参数的服务器存储过程对于使用 DAO 来说可能会很麻烦。 ADO 模型更适合 SQL 服务器,所以我建议使用这样的代码:
Public Function ExecUDF(userId As Integer, pwd As String) As Boolean
Dim con As ADODB.Connection, cmd As ADODB.Command, connStr As String, isValid As Boolean
' remove "ODBC;" prefix from the .Connect property of an existing ODBC linked table
connStr = Mid(CurrentDb.TableDefs("dbo_my_table").Connect, 6)
Set con = New ADODB.Connection
con.Open connStr
Set cmd = New ADODB.Command
cmd.ActiveConnection = con
cmd.CommandType = adCmdStoredProc
cmd.CommandText = "proc_validate_user"
cmd.Parameters.Append cmd.CreateParameter("@userID", adInteger, adParamInput, , userId)
cmd.Parameters.Append cmd.CreateParameter("@pwd", adVarWChar, adParamInput, 50, pwd)
cmd.Parameters.Append cmd.CreateParameter("@isValid", adBoolean, adParamOutput)
cmd.Execute
isValid = cmd.Parameters("@isValid").Value
Set cmd = Nothing
con.Close
Set con = Nothing
ExecUDF = isValid ' return the value
End Function
我正在尝试调用 SQL 服务器过程以通过 VBA 中的函数验证用户。
请看下面的代码:
proc_validate_user 接受 userId 和密码作为输入参数和 returns 位值 0 或 1
调用此过程的函数如下:
Public Function ExecUDF(userId As Integer, pwd As String)
Dim cmd As DAO.Command
Dim par As DAO.Parameter
Dim ret As Variant
Set cmd = New DAO.Command
cmd.ActiveConnection = CurrentDb.Connection
cmd.CommandText = "proc_validate_user"
cmd.CommandType = adCmdStoredProc
'Define the input and output variables and append them to the collection
Set par = cmd.CreateParameter("@userID")
cmd.Parameters.Append par
Set par = cmd.CreateParameter("@pwd")
cmd.Parameters.Append par
Set par = cmd.CreateParameter("@isValid", adParamOutput)
cmd.Parameters.Append par
cmd.Parameters("@userID") = userId
cmd.Parameters("@pwd") = pwd
cmd.Execute
'and then assign the stored procedure return value to the access variable
ret = cmd.Parameters("@isValid").Value
End Function
我收到一个编译错误,提示未在 "Dim cmd As DAO.Command"
处定义用户定义的类型您混淆了 DAO 和 ADO 对象模型。 DAO 是一个完全不同的模型,而不是 "subset of ADO"。没有 DAO.Command
对象。
SQL 生成输出参数的服务器存储过程对于使用 DAO 来说可能会很麻烦。 ADO 模型更适合 SQL 服务器,所以我建议使用这样的代码:
Public Function ExecUDF(userId As Integer, pwd As String) As Boolean
Dim con As ADODB.Connection, cmd As ADODB.Command, connStr As String, isValid As Boolean
' remove "ODBC;" prefix from the .Connect property of an existing ODBC linked table
connStr = Mid(CurrentDb.TableDefs("dbo_my_table").Connect, 6)
Set con = New ADODB.Connection
con.Open connStr
Set cmd = New ADODB.Command
cmd.ActiveConnection = con
cmd.CommandType = adCmdStoredProc
cmd.CommandText = "proc_validate_user"
cmd.Parameters.Append cmd.CreateParameter("@userID", adInteger, adParamInput, , userId)
cmd.Parameters.Append cmd.CreateParameter("@pwd", adVarWChar, adParamInput, 50, pwd)
cmd.Parameters.Append cmd.CreateParameter("@isValid", adBoolean, adParamOutput)
cmd.Execute
isValid = cmd.Parameters("@isValid").Value
Set cmd = Nothing
con.Close
Set con = Nothing
ExecUDF = isValid ' return the value
End Function