【问题标题】:Calling a SQL server procedure from a function in VBA从 VBA 中的函数调用 SQL Server 过程
【发布时间】:2015-06-07 05:27:42
【问题描述】:

我正在尝试调用 SQL Server 过程以通过 VBA 中的函数验证用户。

请看下面的代码:

proc_validate_user 接受 userId 和 password 作为输入参数并返回一个位值 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? ||你有一个错字,没有关闭你的功能。
  • DAO 代表数据访问对象,是 ADO 的子集。它非常常用,我在代码的其他部分使用它,它工作得很好。例如:DAO.Recordset
  • 是的...但它是否包含/在范围内?该错误消息似乎表明编译器不知道DAO.Command 是什么。
  • DAO.Recordset 工作正常,当我查看如何从 VB 调用 sql server 过程的帮助时,我开始了解这些命令 ADODB.command 和 CreateParameter 函数等。我尝试编写带有 ADODB 和 DAO 的代码都给了我同样的错误。
  • 两者都给出了 DAO.Command 类型的相同错误未定义?

标签: vba ms-access stored-procedures sql-server-2008-r2 ms-access-2010


【解决方案1】:

您正在混淆 DAO 和 ADO 对象模型。 DAO 是一个完全不同的模型,而不是“ADO 的子集”。没有DAO.Command 对象。

产生输出参数的 SQL Server 存储过程在使用 DAO 时可能会很麻烦。 ADO 模型与 SQL Server 更一致,因此我建议使用如下代码:

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

【讨论】:

  • 谢谢戈德,正如我所提到的,我已经弄清楚了。然而,我坚持使用我刚刚在 cmd_Login_Click() 例程中创建的函数。我将它分配给值:PasswordValid = ExecUDF(userId, pwd),它给我一个错误,说“这种类型的对象不支持 3251 操作”。非常感谢您的帮助。
  • 如果只是从 VBA 函数中取回值,那么看看我更新的代码。
  • 嗨,戈德,根据您的建议修改代码后,我得到“过程或函数的参数太多”。我的数据库过程看起来像这样CREATE PROCEDURE dbo.proc_validate_user (@userID int, @hashPassword varchar(MAX), @isValid bit output) AS DECLARE @ret bit if EXISTS(select * from TBL_User_Login where userID = @userID and password = @hashPassword) SET @ret = 1 else SET @ret = 0 SELECT @isValid =@ret GO
  • 对了,我已经把代码cmd.Parameters.Append cmd.CreateParameter("@pwd", adVarWChar, adParamInput, 50, pwd)改成了cmd.Parameters.Append cmd.CreateParameter("@hashPassword", adVarWChar, adParamInput, 50, pwd)
  • 通过更改 SQL Server 中的 proc 定义解决了这个问题。谢谢你,戈德
猜你喜欢
  • 1970-01-01
  • 2012-09-06
  • 2016-10-13
  • 2020-02-24
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-07-16
  • 2014-03-30
相关资源
最近更新 更多