none
Rückgabewert einer Gespeicherten Prozedur stimmt nicht

    Frage

  • Hallo,

    habe folgende SP:

    ...
    DECLARE @rc INT = -1;
    
     BEGIN TRANSACTION;
     
    	BEGIN TRY
    	
    		Insert into tbl_Gehaeuse_Daten
    		(Gehaeusenr, Zeit_Magnetkraft, archiv)
    			Select I.Gehaeusenr, I.Zeit_Magnetkraft, 0 As Archiv 
    			From tbl_importGehaeuse As I 
    			Where I.Gehaeusenr Not In (Select G.Gehaeusenr From tbl_Gehaeuse As G);
    
    		Insert into tbl_Gehaeuse (Gehaeusenr, Status, Erfassungsdatum, Rohmaterial)
    			SELECT I.Gehaeusenr, I.Status, I.insertDatum, I.Rohmaterial
    			FROM dbo.tbl_ImportGehaeuse AS I 
    			Where I.Gehaeusenr Not In (Select G.Gehaeusenr From tbl_Gehaeuse As G);		
    			
    		SET @rc = @@ROWCOUNT;
    
    	END TRY
    	BEGIN CATCH
    		IF @@TRANCOUNT > 0 ROLLBACK;
    		RETURN -1
    	END CATCH
    	
    Commit
    return @rc


    Die SP führe ich im SQL-Server aus => Rückgabewert = 44 Wenn ich nun von Access diese ausführe erhalte ich als Rückgabewert = 0. Siehe nachfolgender Code:

    Public Function SP_ImportGehaeuseNeu() As Long
     Dim strProcname As String
    10 strProcname = "dbo.ImportGehaeuseNew"
    20 Set cnn = OpenConnection(ConnectionStringC)
    30 Set cmdObj = New ADODB.Command
    40 With cmdObj
    50  .ActiveConnection = cnn
    60  .CommandText = strProcname
    70  .CommandType = adCmdStoredProc
    80  .CommandTimeout = 60
    90  .Execute
    100 End With
    110 SP_ImportGehaeuseNeu = cmdObj.Parameters(0).Value
    120 Set cmdObj = Nothing
    End Function


    Wo habe ich da einen Fehler? Die SP wird auch über den Access-Aufruf korrekt ausgeführt, nur liefert @rc keinen Rückgabewert.

    Gruß Andreas
    http://www.AccessBlog.de
    Montag, 29. August 2011 14:04

Antworten

  • Du musst entweder einen expliziten Rückgabeparameter anlegen oder die Parameters-Collection neu laden:

    Option Compare Database
    Option Explicit
    
    Public Sub Test()
    
      Dim cnn As ADODB.Connection
      Dim cmd As ADODB.Command
      Dim rs As ADODB.Recordset
    
      Set cnn = New ADODB.Connection
      cnn.ConnectionString = "Provider=SQLNCLI10;Server=(local);Database=tempdb;Integrated Security=SSPI;"
      cnn.Open
    
      Set cmd = New ADODB.Command
      Set cmd.ActiveConnection = cnn
    
      cmd.CommandText = "Test"
      cmd.CommandType = adCmdStoredProc
      cmd.Parameters.Refresh
      cmd.Execute
    
      Set cmd = Nothing
      cnn.Close
      Set cnn = Nothing
    
    End Sub
    • Als Antwort markiert Andreas Vogt Montag, 29. August 2011 14:40
    Montag, 29. August 2011 14:32
    Moderator

Alle Antworten

  • Du musst entweder einen expliziten Rückgabeparameter anlegen oder die Parameters-Collection neu laden:

    Option Compare Database
    Option Explicit
    
    Public Sub Test()
    
      Dim cnn As ADODB.Connection
      Dim cmd As ADODB.Command
      Dim rs As ADODB.Recordset
    
      Set cnn = New ADODB.Connection
      cnn.ConnectionString = "Provider=SQLNCLI10;Server=(local);Database=tempdb;Integrated Security=SSPI;"
      cnn.Open
    
      Set cmd = New ADODB.Command
      Set cmd.ActiveConnection = cnn
    
      cmd.CommandText = "Test"
      cmd.CommandType = adCmdStoredProc
      cmd.Parameters.Refresh
      cmd.Execute
    
      Set cmd = Nothing
      cnn.Close
      Set cnn = Nothing
    
    End Sub
    • Als Antwort markiert Andreas Vogt Montag, 29. August 2011 14:40
    Montag, 29. August 2011 14:32
    Moderator
  • Hallo,

    tatsächlich,

    .Parameters.Refresh löst das Problem.

    Gruß Andreas


    http://www.AccessBlog.de
    Montag, 29. August 2011 14:41