[AccessD] SPAM-LOW: Re: adodb returning error code from stored procedures - CODE

jwcolby jwcolby at colbyconsulting.com
Thu May 14 13:31:39 CDT 2009


James,

Thanks for this response.  I can definitely live with a simple return at least for the moment.  If I 
can get a simple error code being returned then I will be miles ahead of where I am now.

I'll be trying that today and will get back with my success. 8)

John W. Colby
www.ColbyConsulting.com


James Barash wrote:
> John:
> 
> If you just want to get a Return value, you need to add a ReturnParameter to
> your command object:
> 
> cmd.Parameters.Append cmd.CreateParameter("Return", adInteger,
> adParamReturnValue)
> 
> As I recall, it must be declared as the first parameter and must be an
> integer.  To retrieve the value, after the Execute method use:
> 
> cmd.Parameters("Return")
> 
> In your Stored Procedure, just add a value to the Return statement:
> 
> return 0
> 
> Or
> 
> return 1
> 
> Or
> 
> declare @ret int
> set @ret = 1
> 
> return @ret
> 
> Output parameters work similarly but adding that to a generic procedure
> would be more complicated. You'd probably have to pass 2 param arrays, one
> for input and one for output.
> 
> The output parameters are declared:
> 
> cmd.Parameters.Append cmd.CreateParameter("Total", adDouble, adParamOutput)
> 
> After the Execute method, the parameter value is available with
> 
> cmd.Parameters("Total")
> 
> 
> In your stored procedure, add OUTPUT to the parameter declaration:
> 
> Create Procedure [dbo].[sp_GetTotal]
> 	(
> 		@id int,
> 		@Total float OUTPUT
> 	)
> 
> That should do it.
> 
> Hope that helps.
> 
> James Barash
> 
> -----Original Message-----
> From: accessd-bounces at databaseadvisors.com
> [mailto:accessd-bounces at databaseadvisors.com] On Behalf Of jwcolby
> Sent: Thursday, May 14, 2009 11:08 AM
> To: Access Developers discussion and problem solving
> Subject: [AccessD] adodb returning error code from stored procedures - CODE
> 
> The following is the code I currently use for executing stored procedures.
> As I mentioned in the 
> previous email, it works, but it does not return any value from the SP.  I
> have played around trying 
> to make it do so but I think this is one of those cases where I could play
> for months and never get 
> results without help.
> 
> Any assistance is greatly appreciated.
> 
> '---------------------------------------------------------------------------
> ------------
> ' Procedure : CallADOStoredProc
> ' Author    : jwcolby
> ' Date      : 1/29/2009
> ' Purpose   : Calls a stored procedure passing in only "INPUT" parameters to
> the SP
> '               SPs can have INPUT parameters and OUTPUT parameters.
> Passing OUTPUT
> '               parameters requires a different syntax when creating the
> parameter.
> '               This function can only pass INPUT parameters.
> '
> '               I am leaving this function as is because much of the time
> that is all
> '               that is required.  I will build another function to handle
> calls to
> '               stored procedures that can handle both.
> '---------------------------------------------------------------------------
> ------------
> '
> Public Function CallADOStoredProcIn(strServerName As String, strDatabase As
> String, _
>                                      ByVal SPName As String, _
>                                      ParamArray Params() As Variant) As
> Boolean
>    'Created by Charlotte Foust 9/30/2000
>    'last modified 1/12/2001
>    'Calls a saved query or stored procedure
>    On Error GoTo Proc_err
>    Dim varValue As Variant
>    Dim strSQL As String
>    Dim intLoop As Integer
>    Dim varPrmType As Variant
>    Dim lngRecords As Long
> 
> 
>    Dim cnn As ADODB.Connection
>    Dim cmd As ADODB.Command
>    Dim errCurr As ADODB.Error
>    Dim colErrs As ADODB.Errors
>    Dim lTimeoutSeconds As Long
> 
>    Const ERR_OPER_ON_INVALID_CONNECTION = 3709
>    Const ERR_RECORD_IS_DELETED = -2147467259
>    Const ERR_Timeout = -2147217871
> 
>    Set cnn = New ADODB.Connection
>    cnn.ConnectionString = mTrustedConnection(strServerName, strDatabase)
>    cnn.CursorLocation = adUseClient
> 
>    'this simplifies accessing the errors
>    'collection, which belongs to the
>    'connection
>    Set colErrs = cnn.Errors
> 
>    cnn.Open
> 
>    Set cmd = New ADODB.Command
>    lTimeoutSeconds = 55000
>    With cmd
>      .ActiveConnection = cnn
>      'this could also be written as
>      'colErrs.Clear
>      .ActiveConnection.Errors.Clear
>      .CommandType = adCmdStoredProc
>      .CommandText = SPName
>      .CommandTimeout = lTimeoutSeconds
> 
>      For intLoop = LBound(Params) To UBound(Params)
>        Select Case VarType(Params(intLoop))
>          Case vbString
>            varPrmType = adVarWChar
>          Case vbLong
>            varPrmType = adBigInt
>          Case vbDate
>            varPrmType = adDate
>            'if SQL Server, use adDBTimeStamp
>          Case vbInteger
>            varPrmType = adSmallInt
>          Case vbDouble
>            varPrmType = adDouble
>          Case vbSingle
>            varPrmType = adSingle
>          Case vbBoolean
>            varPrmType = adBoolean
>          Case vbCurrency
>            varPrmType = adCurrency
>             Case vbByte
>            varPrmType = adUnsignedTinyInt
>          Case vbNull
>            varPrmType = Null
>          Case Else
>            'WARNING!  Not supported in ADO 2.5
>            varPrmType = adVariant
>        End Select
>        If varPrmType = adVarWChar Then
>          .Parameters.Append .CreateParameter( _
>                "prm" & intLoop, varPrmType, adParamInput,
> Len(Params(intLoop)) + 2, Params(intLoop))
>        Else
>          'you have to create ALL the parameters
>          .Parameters.Append .CreateParameter( _
>                "prm" & intLoop, varPrmType, adParamInput, , Params(intLoop))
>        End If 'varPrmType = adVarWChar
>      Next intLoop
>      .Execute RecordsAffected:=lngRecords, Options:=adCmdStoredProc
>      CallADOStoredProcIn = True
>    End With
> Proc_exit:
>    On Error Resume Next
>    CallADOStoredProcIn = lngRecords
>    Set cmd = Nothing
>    Exit Function
> Proc_err:
>    'ADO errors and Jet errors aren't the same
>    'collection, so this handles them differently
>    If colErrs.Count > 0 Then
>      'There are ADO errors
>      For Each errCurr In colErrs
>        Select Case errCurr
>          Case ERR_OPER_ON_INVALID_CONNECTION
>          Stop
>            Resume Proc_exit
>          Case "Timeout expired" 'Timeout
>              Debug.Print "Command timeout in CallAdoStoredProcIn: " &
> lTimeoutSeconds & " Seconds"
>              If lTimeoutSeconds > 60000 Then
>                  MsgBox errCurr.Number & "--" _
>                          & errCurr.Description & " (" _
>                          & errCurr.Source & ")"
>                  Resume Proc_exit
>              Else
>                  lTimeoutSeconds = lTimeoutSeconds * 2
>                  Resume 0
>              End If
>          Case Else
>              MsgBox errCurr.Number & "--" _
>                      & errCurr.Description & " (" _
>                      & errCurr.Source & ")"
>              Resume Proc_exit
>        End Select
>      Next errCurr
>      colErrs.Clear
>    Else
>      'there is an other error
>      MsgBox Err.Number & "--" & Err.Description
>      Resume Proc_exit
>    End If
>      Resume 0
> End Function
> 



More information about the AccessD mailing list