Announcement

Collapse
No announcement yet.

Problem mit SP und ADO mit Rückgabe-/Output-Parametern

Collapse
X
  • Filter
  • Time
  • Show
Clear All
new posts

  • Problem mit SP und ADO mit Rückgabe-/Output-Parametern

    Hallo,

    ich rufe zur Neuanlage eines Datensatzes aus VB über ADO eine Stored-Procedure auf, die ein komplexes Insert macht... soweit so gut...

    Der Aufruf der Prozedur klappt auch soweit, aber ich benötige die Datensatz-ID als Rückgabe.

    Leider bekomme ich keine Rückgabewerte/Outputparameter :-(

    Ist das ein Problem von ADO?

    Danke
    Alex

  • #2
    hat jemand ne funktionierende code-schnipsel-Kombination von sp und vb

    Comment


    • #3
      Hallo,

      der Aufruf einer Stored Procedure ist kein Problem, ich habe aber nur ein Delphi-Beispiel zur Hand.

      <b>A) Stored Procedure</b><br>
      Die folgende SP liefert sowohl einen Rückgabewert als auch einen OUTPUT-Parameter zurück
      <pre>
      CREATE PROCEDURE stprOrtsname
      @sPLZ char(5),
      @sORT varchar(40) OUTPUT
      AS
      SELECT @sORT = Ortsname
      FROM plzDat
      WHERE Postleitzahl = @sPLZ
      -- Trefferanzahl zurueckliefern
      RETURN @@rowcount
      </pre>
      <b>B) Aufruf aus Delphi heraus</b> <br>
      Vor dem Aufruf müssen die entsprechenden Parameter-Einträge der Parameters-Kollektion über <b>adParamReturnValue</b> bzw. <b>adParamOutput</b> gekennzeichnet werden. Der Rückgabewert einer Stored Procedure wird dabei immer als 1. Parameter (Kollektion-Eintrag 0) zurückgeliefert:
      <PRE>
      <b>procedure</b> TForm1.ButtonOutputClick(Sender: TObject);
      <b>var</b>
      aConnection : _Connection;
      aCommand : _Command;
      vRowsAffected: OleVariant;
      iReturnValue : Integer;
      sOrt : <b>String</b>;
      <br>
      <b>procedure</b> AddParamObj(<b>const</b> sName: <b>String</b>; iType,iParam,iSize: Integer);
      <b>var</b>
      aParam : _Parameter;
      <b>begin</b>
      <b>with</b> aCommand <b>do</b>
      <b>begin</b>
      aParam := CreateParameter(sName, iType, iParam,iSize, EmptyParam);
      Parameters.Append(aParam);
      <b>end</b>;
      <b>end</b>;
      <BR>
      <b>begin</b>
      aConnection := CoConnection.Create;
      aConnection.Open(cCS, <font color="#9933CC">''</font>, <font color="#9933CC">''</font>, adConnectUnspecified);
      <b>try</b>
      aCommand := CoCommand.Create;
      <b>try</b>
      <b>with</b> aCommand <b>do</b>
      <b>begin</b>
      CommandType := adCmdStoredProc;
      Set_CommandText(<font color="#9933CC">'stprOrtsname'</font>);
      <font color="#003399"><i>// Rückgabewert</i></font>
      AddParamObj(<font color="#9933CC">'RETURN_VALUE'</font>, adInteger, adParamReturnValue, 4);
      <font color="#003399"><i>// Input-Parameter</i></font>
      AddParamObj(<font color="#9933CC">'@sPLZ'</font>, adChar, adParamInput, 5);
      <font color="#003399"><i>// Output-Parameter</i></font>
      AddParamObj(<font color="#9933CC">'@sORT'</font>, adVarChar, adParamOutput, 35);
      <font color="#003399"><i>// Parameter-Werte zuweisen</i></font>
      Parameters[1].Value := <font color="#9933CC">'53001'</font>;
      <font color="#003399"><i>// Ausführen</i></font>
      Set_ActiveConnection(aConnection);
      Execute(vRowsAffected, EmptyParam, adExecuteNoRecords);
      <font color="#003399"><i>// Ergebnis abholen</i></font>
      sOrt := Parameters[2].Value;
      iReturnValue := Parameters.Item[0].Value;
      <b>end</b>;
      <b>finally</b>
      aCommand := <b>nil</b>;
      <b>end</b>;
      <b>finally</b>
      aConnection.Close;
      aConnection := <b>nil</b>;
      <b>end</b>;
      ShowMessage(IntToStr(iReturnValue) + <font color="#9933CC">' - '</font> + sOrt);
      <b>end</b>;
      </PRE>
      P.S: Ich habe doch noch ein VB-Beispiel gefunden (in der Codebibliothek von Microsoft Office XP Developer):
      <pre>
      Sub TestParameter()

      'Public Sub testParameter
      'Zweck:
      'Dieses Codebeispiel zeigt Folgendes:
      '1. Erstellen einer gespeicherten Prozedur, die Eingabeparameter verwendet
      '2. Erstellen der Parameter und Auslösen der gespeicherten Prozedur
      '3. Anzeigen des Ergebnisses und Löschen der gespeicherten Prozedur

      Dim Conn As ADODB.Connection
      Dim Param As ADODB.Parameter
      Dim Com As ADODB.Command

      Dim strConn As String

      ' Verbindungszeichenfolge einer Variablen zuweisen

      strConn = "SERVER=(local);" & _
      "User Id=sa;Password=;DATABASE=pubs"

      ' Connection-Objekt erstellen

      Set Conn = New ADODB.Connection

      ' Verbindungszeichenfolge und Provider zuweisen, dann die Verbindung öffnen

      Conn.ConnectionString = strConn
      Conn.Provider = "SQLOLEDB"
      Conn.Open strConn

      'Neues Befehlsobjekt erstellen
      Set Com = New ADODB.Command

      'Mit Code laden, der eine neue gespeicherte Prozedur in PUBS erstellt
      Com.CommandText = "Create Procedure sp_ReturnsOutput @authid " _
      & "varchar(11),@result Varchar(20) OUTPUT As Select @result " _
      & "= (Select au_fname from authors Where Au_id = @authid)"

      'Auslösen zum Erstellen einer neuen gespeicherten Prozedur
      Com.ActiveConnection = Conn
      Com.Execute

      'Nun sollen zwei Parameter erstellt werden: einer für Eingabe, einer für Ausgabe.
      'Eingabeparameter erstellen
      Set Param = Com.CreateParameter("AuId", adVarChar, adParamInput, 11)
      Param.Value = "172-32-1176"
      Com.Parameters.Append Param

      'Rückgabeparameter erstellen
      Set Param = Com.CreateParameter("Return", adVarChar, _
      adParamReturnValue, 20)
      Com.Parameters.Append Param

      'ANMERKUNG: Beim Erstellen von Parametern müssen Sie die Größe
      'des Parameters sowie den Typ des Wertes einbeziehen, mit dem Sie arbeiten.
      'Befehlsobjekt als SQL-Zeichenfolge laden

      Com.CommandText = "sp_ReturnsOutput"
      Com.CommandType = adCmdStoredProc

      'Auslösen
      Com.Execute

      'Ergebnisse anzeigen
      MsgBox "Der Vorname des Autors mit " & _
      Com.Parameters(0).Value & " ist " & Com.Parameters(1).Value

      'Cleanup durch Löschen von gespeicherter Prozedur
      Com.CommandText = "Drop Procedure Sp_ReturnsOutput"
      Com.CommandType = adCmdText
      Com.Execute
      Conn.Close

      End Sub
      </pre&gt

      Comment


      • #4
        genau so hab ich das aber gemacht...???
        bin total ratlos, warum das nicht funktioniert... :-

        Comment


        • #5
          Hallo,

          was passiert, wenn meine einfache SP nachgebaut und getestet wird? Wenn dort die Werte ermittelt werden können, wir der Grund innerhalb der SP liegen

          Comment

          Working...
          X