Stored Procedure - Return Value auslesen

  • VB.NET

Es gibt 11 Antworten in diesem Thema. Der letzte Beitrag () ist von chris1978.

    Stored Procedure - Return Value auslesen

    Hallo Leute,

    bin neu hier und stelle mich kurz vor.
    Bin 36 und seit einiger Zeit mit Solid Works Add Ins beschäftigt.

    Es sollen nämlich zwischen dem CAD System und dem ERP System Daten ausgetauscht/abgefragt werden.

    Habe jetzt mein erstes AddIn begonnen, wo eine Stored Procedure am SQL Server aufgerufen wird.

    Leidersteht im Return Value nichts drinnen, obwohl ich am SQL Server sehe, dass ein Wert zurück gegeben wird von der Stored Procedure.

    Irgend etwas scheint da nicht zu stimmen, was ich da gebastelt habe.
    Würde mich freuen wenn mir jemand einen Tip geben könnte.

    Hier mal der Code

    -----------------------------------------------------------------------------------------------------------------------

    Visual Basic-Quellcode

    1. Public Sub getDatafromJetOrbit()
    2. Dim con As ADODB.Connection = New ADODB.Connection
    3. Dim cmd As ADODB.Command = New ADODB.Command
    4. Dim prm As New ADODB.Parameter
    5. Dim rs As ADODB.Recordset = New ADODB.Recordset
    6. Dim WgPr As String
    7. Dim sConString As String
    8. 'Start stored procedure request
    9. WgPr = InputBox("Bitte Warengruppen Präfix eingeben", "WG Präfix", "")
    10. sConString = "Provider=SQLOLEDB;Data Source=FLOATING\TESTSQL;" & "Initial Catalog=TestJet;" & "Integrated Security=SSPI;"
    11. con.Open(sConString)
    12. cmd.CommandText = "MyCADGetArtikelNr"
    13. cmd.CommandType = CommandType.StoredProcedure
    14. prm = cmd.CreateParameter("@Warengruppe", DataTypeEnum.adBSTR, ParameterDirection.Input,
    15. cmd.Parameters.Append(prm)
    16. cmd.Parameters("@Warengruppe").Value = WgPr
    17. prm = cmd.CreateParameter("@ArtikelNr", DataTypeEnum.adChar, ParameterDirectionEnum.adParamReturnValue, 25)
    18. cmd.Parameters.Append(prm)
    19. prm = cmd.CreateParameter("@FehlerText", DataTypeEnum.adVarChar, ParameterDirectionEnum.adParamReturnValue, 25)
    20. cmd.Parameters.Append(prm)
    21. cmd.ActiveConnection = con
    22. cmd.Execute()
    23. 'Execute the Stored Procedure
    24. MsgBox("Warengruppe: " + cmd.Parameters("@Warengruppe").Value)
    25. MsgBox("Fehlertext: " + cmd.Parameters("@FehlerText").Value)
    26. MsgBox("Artikelnummer: " + cmd.Parameters("@ArtikelNr").Value)
    27. 'var.SetVar("Artikelnummer", cmd.Parameters("@ArtikelNr").Value, "")
    28. cmd.ActiveConnection = Nothing
    29. con.Close()
    30. con = Nothing
    31. End Sub


    -----------------------------------------------------------------------------------------------------------------------

    Dieser Beitrag wurde bereits 1 mal editiert, zuletzt von „chris1978“ ()

    Bitte erst einmal Code richtig formatieren bitte !
    In general (across programming languages), a pointer is a number that represents a physical location in memory. A nullpointer is (almost always) one that points to 0, and is widely recognized as "not pointing to anything". Since systems have different amounts of supported memory, it doesn't always take the same number of bytes to hold that number, so we call a "native size integer" one that can hold a pointer on any particular system. - Sam Harwell

    chris1978 schrieb:

    Leidersteht im Return Value nichts drinnen, obwohl ich am SQL Server sehe, dass ein Wert zurück gegeben wird von der Stored Procedure.

    Vielleicht wertest Du die Rückgabe nur nicht richtig aus oder setzte sie nicht richtig? Ich kenne ja Deine SP nicht..

    Hier nur mal ein Beispiel, direkt in T-SQL, wie Rückgaben einer SP verarbeitet werden ~können~ (wie gesagt nur in T-SQL, nicht .NET).
    Beispiel-SP (wird hier neu angelegt, denk Dir den oberen Teil einfach weg):

    SQL-Abfrage

    1. /* SP löschen, falls vorhanden und 'sp_new_user' neu erstellen.
    2. ============================================================
    3. Fügt einen neuen Kunden ein.
    4. __ Test ____________________________________________________
    5. DECLARE @v_returnText VARCHAR(MAX)
    6. EXEC sp_new_user 'Herr','m','Müller','Erwin','13.12.1980','Am Oderbruch','66','12345','Hamburg','0401234567','01761234567','erwinm@web.de', @v_returnText OUTPUT
    7. PRINT @v_returnText;
    8. ____________________________________________________________ */
    9. IF EXISTS (
    10. SELECT *
    11. FROM dbo.sysobjects
    12. WHERE id = object_id(N'[dbo].[sp_new_user]') AND OBJECTPROPERTY(id, N'IsProcedure') = 1
    13. )
    14. DROP PROCEDURE [dbo].[sp_new_user]
    15. GO
    16. CREATE PROCEDURE sp_new_user @v_Anrede VARCHAR(15)
    17. ,@v_Geschlecht VARCHAR(1)
    18. ,@v_Name VARCHAR(50)
    19. ,@v_Vorname VARCHAR(50)
    20. ,@vs_Geburtsdatum VARCHAR(50)
    21. ,@v_Strasse VARCHAR(100)
    22. ,@v_HausNummer VARCHAR(5)
    23. ,@v_PLZ VARCHAR(5)
    24. ,@v_Ort VARCHAR(50)
    25. ,@v_TelFest VARCHAR(15)
    26. ,@v_TelMobil VARCHAR(15)
    27. ,@v_eMail VARCHAR(100)
    28. ,@v_returnText VARCHAR(MAX) OUTPUT
    29. AS
    30. BEGIN
    31. /* einfache Fehlerbehandlungen
    32. --------------------------- */
    33. /* Name */
    34. IF @v_Name IS NULL OR LEN(LTRIM(RTRIM(@v_Name))) = 0
    35. BEGIN
    36. SET @v_returnText = 'Der Nachname fehlt!'
    37. RETURN
    38. END;
    39. /* Vorname */
    40. IF @v_Vorname IS NULL OR LEN(LTRIM(RTRIM(@v_Vorname))) = 0
    41. BEGIN
    42. SET @v_returnText = 'Der Vorname fehlt!'
    43. RETURN
    44. END;
    45. /* Geburtstag */
    46. BEGIN TRY
    47. DECLARE @v_Geburtsdatum DATETIME
    48. SET @v_Geburtsdatum = convert(DATETIME, @vs_Geburtsdatum)
    49. END TRY
    50. BEGIN CATCH
    51. SET @v_returnText = 'Das Geburtsdatum fehlt oder ist syntaktisch falsch!'
    52. RETURN
    53. END CATCH;
    54. /* Strasse */
    55. IF @v_Strasse IS NULL OR LEN(LTRIM(RTRIM(@v_Strasse))) = 0
    56. BEGIN
    57. SET @v_returnText = 'Die Straße fehlt!'
    58. RETURN
    59. END;
    60. /* Hausnummer */
    61. IF @v_HausNummer IS NULL OR LEN(LTRIM(RTRIM(@v_HausNummer))) = 0
    62. BEGIN
    63. SET @v_returnText = 'Die Hausnummer fehlt!'
    64. RETURN
    65. END;
    66. /* PLZ */
    67. IF @v_PLZ IS NULL OR LEN(LTRIM(RTRIM(@v_PLZ))) = 0
    68. BEGIN
    69. SET @v_returnText = 'Die PLZ fehlt!'
    70. RETURN
    71. END;
    72. /* Ort */
    73. IF @v_Ort IS NULL OR LEN(LTRIM(RTRIM(@v_Ort))) = 0
    74. BEGIN
    75. SET @v_returnText = 'Der Ort fehlt!'
    76. RETURN
    77. END;
    78. /* neuen Kunden einfügen */
    79. BEGIN TRANSACTION;
    80. BEGIN TRY
    81. INSERT INTO Kunden (
    82. Anrede
    83. ,Geschlecht
    84. ,NAME
    85. ,Vorname
    86. ,Geburtsdatum
    87. ,Strasse
    88. ,HausNummer
    89. ,PLZ
    90. ,Ort
    91. ,TelFest
    92. ,TelMobil
    93. ,eMail
    94. )
    95. VALUES (
    96. @v_Anrede
    97. ,@v_Geschlecht
    98. ,@v_Name
    99. ,@v_Vorname
    100. ,@v_Geburtsdatum
    101. ,@v_Strasse
    102. ,@v_HausNummer
    103. ,@v_PLZ
    104. ,@v_Ort
    105. ,@v_TelFest
    106. ,@v_TelMobil
    107. ,@v_eMail
    108. );
    109. COMMIT;
    110. SET @v_returnText = @v_Vorname + ' ' + @v_Name + ' wurde als Neukunde eingetragen.'
    111. END TRY
    112. BEGIN CATCH
    113. /* Rollback bei einem Fehler */
    114. ROLLBACK TRANSACTION;
    115. DECLARE @ErrMsg NVARCHAR(4000)
    116. ,@ErrSeverity INT;
    117. SELECT @ErrMsg = ERROR_MESSAGE()
    118. ,@ErrSeverity = ERROR_SEVERITY();
    119. RAISERROR (
    120. @ErrMsg
    121. ,@ErrSeverity
    122. ,1
    123. );
    124. END CATCH;
    125. END;
    126. GO


    Und hier eine mögliche Auswertung der Rückgabe:

    SQL-Abfrage

    1. /* sp_new_user - fügt einen neuen Kunden ein.
    2. ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ */
    3. DECLARE @v_returnText VARCHAR(MAX)
    4. EXEC sp_new_user 'Herr','m','Müller','Erwin','13.12.1980','Am Oderbruch','66','12345','Hamburg','0401234567','01761234567','erwinm@web.de', @v_returnText OUTPUT
    5. PRINT @v_returnText;
    6. GO

    Nun ja, die stored procedure hat einen Inputwert => PREFIX

    Es gibt zwei return values

    1. Artikelnummer
    2. Fehlertext

    Irgend etwas mache ich beim Createparameter falsch, denke ich.

    Visual Basic-Quellcode

    1. prm = cmd.CreateParameter("@ArtikelNr", DataTypeEnum.adChar, ParameterDirectionEnum.adParamReturnValue, 25)
    2. cmd.Parameters.Append(prm)
    3. prm = cmd.CreateParameter("@FehlerText", DataTypeEnum.adVarChar, ParameterDirectionEnum.adParamReturnValue, 25)
    4. cmd.Parameters.Append(prm)


    Wenn ich jetzt eine msgbox ausgebe sollte doch der Wert drinnen stehen so oder?

    Visual Basic-Quellcode

    1. MsgBox("Artikelnummer: " + cmd.Parameters("@ArtikelNr").Value)

    VB.NET-Quellcode

    chris1978 schrieb:

    prm = cmd.CreateParameter("@Warengruppe", DataTypeEnum.adBSTR, ParameterDirection.Input,

    cmd.Parameters.Append(prm)

    cmd.Parameters("@Warengruppe").Value = WgPr



    prm = cmd.CreateParameter("@ArtikelNr", DataTypeEnum.adChar, ParameterDirectionEnum.adParamReturnValue, 25)

    cmd.Parameters.Append(prm)



    prm = cmd.CreateParameter("@FehlerText", DataTypeEnum.adVarChar, ParameterDirectionEnum.adParamReturnValue, 25)

    cmd.Parameters.Append(prm)

    Dein Problem liegt wahrscheinlich da:

    chris1978 schrieb:

    Es gibt zwei return values
    1. Artikelnummer
    2. Fehlertext
    Das sind wohl Output-Parameter.
    Auch eine StoredProcedure kann maximal einen Return-Wert haben.

    Ist dir der Unterschied klar?
    --
    If Not Program.isWorking Then Code.Debug Else Code.DoNotTouch
    --
    Sorry hatte mich verschrieben.
    Ja sind OUTPUT Parameter.

    Nur leider steht nichts drinnen in "@Artikelnummer"
    Oder ich bin einfach zu blöd um das auszulesen :(
    Bin schon etwas am Verzweifeln leider, hat sich nichts geändert am Ergebnis.

    Visual Basic-Quellcode

    1. Dim con As ADODB.Connection = New ADODB.Connection
    2. Dim cmd As ADODB.Command = New ADODB.Command
    3. Dim prm As ADODB.Parameter = New ADODB.Parameter
    4. Dim rs As ADODB.Recordset = New ADODB.Recordset
    5. Dim WgPr As String
    6. Dim sConString As String
    7. 'Start stored procedure request
    8. WgPr = InputBox("Bitte Warengruppen Präfix eingeben", "WG Präfix", "")
    9. sConString = "Provider=SQLOLEDB;Data Source=FLOATING\TESTSQL;" & "Initial Catalog=TestJet;" & "Integrated Security=SSPI;"
    10. con.Open(sConString)
    11. cmd.CommandText = "MyCADGetArtikelNr"
    12. cmd.CommandType = CommandType.StoredProcedure
    13. prm = cmd.CreateParameter("@Warengruppe", DataTypeEnum.adChar, ParameterDirectionEnum.adParamInput, 8)
    14. cmd.Parameters.Append(prm)
    15. cmd.Parameters("@Warengruppe").Value = WgPr
    16. prm = cmd.CreateParameter("@ArtikelNr", DataTypeEnum.adChar, ParameterDirectionEnum.adParamOutput, 25)
    17. cmd.Parameters.Append(prm)
    18. prm = cmd.CreateParameter("@FehlerText", DataTypeEnum.adVarChar, ParameterDirectionEnum.adParamOutput, 300)
    19. cmd.Parameters.Append(prm)
    20. cmd.ActiveConnection = con
    21. rs = cmd.Execute()
    22. MsgBox("Warengruppe: " + cmd.Parameters("@Warengruppe").Value)
    23. MsgBox("Fehlertext: " + cmd.Parameters("@FehlerText").Value)
    24. MsgBox("Artikelnummer: " + cmd.Parameters("@ArtikelNr").Value)
    25. cmd.ActiveConnection = Nothing
    26. con.Close()
    27. con = Nothing

    Dieser Beitrag wurde bereits 3 mal editiert, zuletzt von „chris1978“ ()

    Des Rätsels Lösung ist, dass man die Connection CLOSED und dann den Wert ausliest.

    Visual Basic-Quellcode

    1. Dim con As New ADODB.Connection
    2. Dim cmd As New ADODB.Command
    3. Dim prm As New ADODB.Parameter
    4. Dim rs As New ADODB.Recordset
    5. Dim WgPr As String
    6. Dim sConString As String
    7. Dim Ret0, Ret1 As String
    8.  
    9. 'Start stored procedure request
    10. WgPr = InputBox("Bitte Warengruppen Präfix eingeben", "WG Präfix", "")
    11. sConString = "Provider=SQLOLEDB;Data Source=FLOATING\TESTSQL;" & "Initial Catalog=TestJet;" & "Integrated Security=SSPI;"
    12. con.Open(sConString)
    13. rs.CursorLocation = CursorLocationEnum.adUseClient
    14. cmd.CommandText = "MyCADGetArtikelNr"
    15. cmd.CommandType = CommandType.StoredProcedure
    16. cmd.ActiveConnection = con
    17. prm = cmd.CreateParameter("@Warengruppe", DataTypeEnum.adChar, ParameterDirectionEnum.adParamInput, 2, "")
    18. cmd.Parameters.Append(prm)
    19. cmd.Parameters("@Warengruppe").Value = WgPr
    20. prm = cmd.CreateParameter("@ArtikelNr", DataTypeEnum.adChar, ParameterDirectionEnum.adParamOutput, 10)
    21. cmd.Parameters.Append(prm)
    22. prm = cmd.CreateParameter("@FehlerText", DataTypeEnum.adVarChar, ParameterDirectionEnum.adParamOutput, 30)
    23. cmd.Parameters.Append(prm)
    24. rs = cmd.Execute()
    25. con.Close()
    26. Ret0 = cmd.Parameters(1).Value
    27. MsgBox(Ret0)
    28.  
    29. cmd.ActiveConnection = Nothing
    30. con = Nothing

    Dieser Beitrag wurde bereits 1 mal editiert, zuletzt von „chris1978“ ()