sql-server - 如何从 SQL Server 存储过程返回值并在 Access VBA 中使用它们

标签 sql-server vba sql-server-2008 ms-access stored-procedures

我已经在 SQL Server 中设置了一个运行良好的存储过程。我现在可以从 VBA 调用它,但想返回一个值以了解是否存在任何错误等。我的 SP 中的最后一个参数设置为 OUTPUT:

@DataSetID int = 0,
@Destination char(1)='-',
@errStatusOK bit OUTPUT

我调用 SP 的 VBA 如下,但现在无法工作,添加新参数后,我不确定哪里出错了,我不断收到 3708 - 参数对象不正确定义的。提供的信息不一致或不完整。:

Set cnn = New adodb.Connection
cnn.ConnectionString = 
   "DRIVER=SQL Server;SERVER=SERVER\SERVER;DATABASE=a_db;Trusted_Connection=Yes"

cnn.Open cnn.ConnectionString

Set cmd = New adodb.Command
cmd.ActiveConnection = cnn
cmd.CommandType = adCmdStoredProc
cmd.CommandText = "stprMoveDataSet"

Set param = cmd.CreateParameter
               ("@DataSetID", adInteger, adParamInput, , stDataSet)
cmd.Parameters.Append param
Set param = cmd.CreateParameter
               ("@Destination", adChar, adParamInput, 1, stDestination)
cmd.Parameters.Append param
Set param = cmd.CreateParameter
               ("@errStatusOK", adBit, adParamReturnValue)
cmd.Parameters.Append param

rs.CursorType = adOpenStatic
rs.CursorLocation = adUseClient
rs.LockType = adLockOptimistic
rs.Open cmd

如何让 vba 使用 OUTPUT 参数并使返回值可由 vba“读取”。

编辑 - 我已将问题更改为更具体地涉及返回值,而不仅仅是使用输出参数。

最佳答案

使用 VBA 可以通过多种方式取回值。

  1. 记录集
  2. 受影响的记录数(仅适用于插入/更新/删除,否则 -1)
  3. 输出参数
  4. 返回值

我的代码演示了所有四个。这是一个返回值的存储过程:

Create PROCEDURE CheckExpedite
    @InputX  varchar(10),
    @InputY int,
    @HasExpedite int out
AS
BEGIN
    Select @HasExpedite = 9 from <Table>
    where Column2 = @InputX and Column3 = @InputY

    If @HasExpedite = 9
        Return 2
    Else
        Return 3
End

这是我在 Excel VBA 中使用的子程序。您需要引用 Microsoft ActiveX Data Objects 2.8 库。

Sub CheckValue()

    Dim InputX As String: InputX = "6000"
    Dim InputY As Integer: InputY = 2014

    'open connnection
    Dim ACon As New Connection
    'ACon.Open ("Provider=SQLOLEDB;Data Source=<SqlServer>;" & _
    '    "Initial Catalog=<Table>;Integrated Security=SSPI")

    'set command
    Dim ACmd As New Command
    Set ACmd.ActiveConnection = ACon
    ACmd.CommandText = "CheckExpedite"
    ACmd.CommandType = adCmdStoredProc

    'Return value must be first parameter else you'll get error from too many parameters
    'Procedure or function "Name" has too many arguments specified.
    ACmd.Parameters.Append ACmd.CreateParameter("ReturnValue", adInteger, adParamReturnValue)
    ACmd.Parameters.Append ACmd.CreateParameter("InputX", adVarChar, adParamInput, 10, InputX)
    ACmd.Parameters.Append ACmd.CreateParameter("InputY", adInteger, adParamInput, 6, InputY)
    ACmd.Parameters.Append ACmd.CreateParameter("HasExpedite", adInteger, adParamOutput)

    Dim RS As Recordset
    Dim RecordsAffected As Long

    'execute query that returns value
    Call ACmd.Execute(RecordsAffected:=RecordsAffected, Options:=adExecuteNoRecords)

    'execute query that returns recordset
    'Set RS = ACmd.Execute(RecordsAffected:=RecordsAffected)

    'get records affected, return value and output parameter
    Debug.Print "Records affected: " & RecordsAffected
    Debug.Print "Return value: " & ACmd.Parameters("ReturnValue")
    Debug.Print "Output param: " & ACmd.Parameters("HasExpedite")

    'use record set here
    '...

    'close
    If Not RS Is Nothing Then RS.Close
    ACon.Close

End Sub

关于sql-server - 如何从 SQL Server 存储过程返回值并在 Access VBA 中使用它们,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12407389/

相关文章:

Excel VBA,使用评估(MAX(IF))条件的自定义搜索 - 不匹配错误

sql-server - 在 sql 函数中使用设置语言

SQL IF NULL 来自 SELECT 语句

sql - 如何授予用户访问 SQL Server 中的 sys.master_files 的权限?

sql-server - 从 ntext 转移到 nvarchar(max) 有什么问题吗

ms-access - Excel - VBA - 将数据保存到 Access 数据库

visual-studio-2010 - 数据库模式不明确索引提示问题

sql-server - 从列值返回多行

sql - 表中列的位置

excel - 如何从 Excel vba 将日文字符插入 ECC