【问题标题】:Return value indicating update success/failure of SQL Server stored procedure via ADO/VBA返回值指示通过 ADO/VBA 更新 SQL Server 存储过程的成功/失败
【发布时间】:2010-07-16 21:10:02
【问题描述】:

我有一个更新表中值的 SQL Server 2008 存储过程。我想让存储过程返回一个整数值,指示更新成功(返回 0)或不成功(返回错误号)。通过 ADO 和 VBA 完成此任务的最佳方法是什么?这里我的一些简化形式的代码执行更新......我只是不确定如何取回存储过程的返回值

Public Function DoUpdate(employeeID as integer, firstName as string, lastname as string) as integer

  Dim cnn As ADODB.Connection
  Dim cmd As ADODB.Command
  Dim activeConnectionString As String

  activeConnectionString = GetActiveConnectionString()

  Set cnn = New ADODB.Connection
  cnn.ConnectionString = activeConnectionString
  cnn.CursorLocation = adUseClient
  cnn.Open

  Set cmd = New ADODB.Command
  cmd.ActiveConnection = cnn
  cmd.CommandType = adCmdStoredProc
  cmd.CommandText = "uspUpdateEmployeeName"
  cmd.NamedParameters = True

  cmd.Parameters("@EmployeeID").Value = employeeID 
  cmd.Parameters("@FirstName").Value = firstName
  cmd.Parameters("@LastName").Value = lastName

  cmd.Execute

  'Unsure of how to get back return value here
  'DoUpdate = returnValue

  Set cnn = Nothing

End Function

【问题讨论】:

    标签: vba stored-procedures ado return-value


    【解决方案1】:

    注意:return_value 必须是第一个参数!

    订单很重要。

    当我最后指定 return_value 参数而不是第一个参数时,我收到错误消息指出我的查询 "had too many arguments"

    参数的顺序是我出错的原因。

    【讨论】:

      【解决方案2】:

      如果你使用

      Dim lngRecs As Long
      
      cmd.Execute lngRecs
      

      lngRecs 应该包含受影响的记录。

      【讨论】:

        【解决方案3】:

        我似乎记得您需要提供一个类型为“adParamReturnValue”的额外参数,如下所示:

        Dim lRetVal as Long
        
        Set cmd = New ADODB.Command
        cmd.Parameters.Append .CreateParameter("returnvalue", adInteger, adParamReturnValue)
        
        cmd.Execute
        
        'Now check the return value of the procedure
        lRetVal = cmd.Parameters("returnvalue")
        
        If lRetVal > 0 then
        

        【讨论】:

          【解决方案4】:

          有几种方法可以使用 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 Library。

          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
          

          【讨论】:

          • Set RS = ACmd.Execute(RecordsAffected:=RecordsAffected) 就像一个魅力!
          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2010-11-23
          • 2011-11-09
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多