Rückgabewert von einer gespeicherten Prozedur in C# abrufen (2023)

Rückgabewert von einer gespeicherten Prozedur in C# abrufen– Dieser Artikel führt Sie durch die häufigsten SQL-Fehler, die bei der Arbeit mit c#, sql und sql-server auftreten können. Die falsche Anordnung von Schlüsselwörtern führt sicherlich zu einem Fehler, aber auch falsch angeordnete Befehle können ein Problem sein. SQL-Schlüsselwortfehler treten auf, wenn eines der Wörter, die die SQL-Abfragesprache für ihre Befehle und Klauseln reserviert, falsch geschrieben ist. Wenn der Benutzer alle diese gemeldeten Fehler beheben möchte, ohne den ursprünglichen Fehler zu finden, wird aus einem einfachen Tippfehler ein viel größeres Problem.

SQL-Problem:

Ich habe folgende Abfrage:

SatzANSI_NULLSANSatzQUOTED_IDENTIFIERANgoALTERVERFAHREN[dbo].[Bestätigen]@A Varchar(50),@B Varchar(50) AusgangALSSATZ@Passwort=(SELECT PasswordFROM dbo.tblUserWHERE Login = @a)ZURÜCKKEHREN@BGEHEN

Das lässt sich perfekt kompilieren. Ich möchte diese Abfrage ausführen und den Rückgabewert erhalten. Mein Code ist unten:

 SQLConnection SqlConn = neu SQLConnection(System.Configuration.ConfigurationManager.ConnectionStrings[„MyLocalSQLServer“].ConnectionString.ToString()); System.Data.SqlClient.SqlCommand sqlcomm = neu System.Data.SqlClient.SqlCommand("Bestätigen", SqlConn);Zeichenfolge Rückgabewert =string.Empty;versuchen{ SqlConn.Open(); sqlcomm.CommandType = CommandType.StoredProcedure;SQLParameter param = neu SQLParameter("@A", SqlDbType.VarChar); param.Direction = ParameterDirection.Input; param.Value = Benutzername; sqlcomm.Parameters.Add(param);SQLParameter retval =sqlcomm.Parameters.Add("@B", SqlDbType.VarChar); retval.Direction = ParameterDirection.ReturnValue;Zeichenfolge Rückgabewert =(string)sqlcomm.Parameters["@B"].Wert;

Hinweis: Die Ausnahmebehandlung wurde gekürzt, um den Code kurz zu halten. Jedes Mal, wenn ich zur letzten Zeile komme, wird null zurückgegeben. Was ist der logische Fehler in diesem Code?

Lösung :

Mehrdad macht einige gute Argumente, aber das Wichtigste, was mir aufgefallen ist, sind SieFühren Sie die Abfrage niemals aus

SqlParameter retval = sqlcomm.Parameters.Add("@B", SqlDbType.VarChar);retval.Direction = ParameterDirection.ReturnValue;sqlcomm.ExecuteNonQuery();// FEHLENZeichenfolgeRückgabewert = (Zeichenfolge)sqlcomm.Parameters["@B"].Wert;
retval.Direction= ParameterDirection.Output;

ParameterDirection.ReturnValuesollte für den „Rückgabewert“ der Prozedur verwendet werden, nicht für Ausgabeparameter. Es erhält den von SQL zurückgegebenen WertZURÜCKKEHRENAnweisung (mit dem Parameter namens@RÜCKGABEWERT).

AnstattRÜCKKEHR @bDu solltestSET @b = etwas

Der Rückgabewertparameter ist übrigens immerint, keine Zeichenfolge.

Ich hatte jede Menge Probleme mit dem Rückgabewert, also habe ich am Ende nur Dinge ausgewählt.

Die Lösung bestand einfach darin, das Ergebnis am Ende auszuwählen und das Abfrageergebnis in Ihrer Funktion zurückzugeben.

In meinem Fall habe ich eine Existenzprüfung durchgeführt:

WENN(EXISTS (SELECT RoleName FROM dbo.Roles WHERE@Rollenname= Rollenname))WÄHLEN 1ANDERS WÄHLEN 0

Dann

mit (SQLConnection cnn = neu SQLConnection(ConnectionString)){SqlCommand cmd =cnn.CreateCommand(); cmd.CommandType = CommandType.StoredProcedure; cmd.CommandText =„RoleExists“;zurückkehren(int) cmd.ExecuteScalar()}

Sie sollten in der Lage sein, dasselbe mit einem String-Wert anstelle eines Int-Werts zu tun.

(Video) Tutorial Gespeicherte Prozeduren im MS SQL Server

Darauf baut man aufJoelsUndMehrdadsAntworten: Sie binden niemals den Parameter desretvalzumsqlcommand. Du brauchst ein

sqlcomm.Parameter.Hinzufügen(retval);

und um sicherzustellen, dass Sie den Befehl ausführen

sqlcomm.ExecuteNonQuery();

Ich bin mir auch nicht sicher, warum Sie zwei Rückgabewertzeichenfolgen haben (RückgabewertUndRückgabewert).

Sie sagen, Ihr SQL lässt sich gut kompilieren, aber ich bekomme: Die Skalarvariable „@Password“ muss deklariert werden.

Sie versuchen auch, ein Varchar (@b) von Ihrer gespeicherten Prozedur zurückzugeben, aber gespeicherte SQL Server-Prozeduren können nur Ganzzahlen zurückgeben.

Wenn Sie die Prozedur ausführen, erhalten Sie die Fehlermeldung:

„Bei der Konvertierung des Varchar-Werts ‚x‘ in den Datentyp int ist die Konvertierung fehlgeschlagen.“

(Video) Prozeduren & Funktionen | DelphiLernen #010

Hier gibt es mehrere Probleme:

  1. Es ist nicht möglich. Sie versuchen, einen Varchar zurückzugeben. Gelagert
    Prozedurrückgabewerte können nur ganzzahlige Ausdrücke sein. Sehen
    offizielle RÜCKGABE-Dokumentation:
    https://msdn.microsoft.com/en-us/library/ms174998.aspx.
  2. Deinsqlcommwurde nie hingerichtet. Du musst anrufen
    sqlcomm.ExecuteNonQuery();um Ihren Befehl auszuführen.

Hier ist eine Lösung mit OUTPUT-Parametern. Dies wurde getestet mit:

  • Windows Server 2012
  • .NET v4.0.30319
  • C# 4.0
SATZANSI_NULLSANGEHENSATZQUOTED_IDENTIFIERANGEHENÄNDERN VERFAHREN[dbo].[Validieren]@A Varchar(50),@B Varchar(50) AUSGANGALSSTART ERKLÄREN @B ALS Varchar(50)=(WÄHLENPasswortAUSdbo.tblBenutzerWOAnmeldung= @A)WÄHLEN @B;ENDE
SqlConnection SqlConn = ...Warsqlcomm =neuSqlCommand("Bestätigen", SqlConn);ZeichenfolgereturnValue =Zeichenfolge.Leer;versuchen{ SqlConn.Open(); sqlcomm.CommandType = CommandType.StoredProcedure; SqlParameter param =neuSQLParameter("@A", SqlDbType.VarChar); param.Direction = ParameterDirection.Input; param.Value = Benutzername; sqlcomm.Parameters.Add(param); SqlParameter-Ausgabe = sqlcomm.Parameters.Add("@B", SqlDbType.VarChar); ouput.Direction = ParameterDirection.Output; sqlcomm.ExecuteNonQuery();// Diese Zeile fehltereturnValue = Output.Value.ToString();// ... der Rest des Codes}fangen(SqlException ex) {Wurfex;}

Wenn wir einen Wert von einer gespeicherten Prozedur ohne Select-Anweisung zurückgeben.
Wir müssen die Befehle „ParameterDirection.ReturnValue“ und „ExecuteScalar“ verwenden, um den Wert zu erhalten.

ERSTELLEN VERFAHRENIsEmailExists@EmailNVARCHAR(20)ALSSTART – SET NOCOUNT ON hinzugefügt, um zusätzliche Ergebnismengen zu verhindern – Beeinträchtigung von SELECT-Anweisungen. SATZKEINE ZÄHLUNGAN;-- Fügen Sie hier Anweisungen zur Vorgehensweise einWENNEXISTIERT(WÄHLENEmailAUSBenutzerWoEmail= @Email)START ZURÜCKKEHREN 0 ENDE ANDERS START ZURÜCKKEHREN 1 ENDEENDE

in C#

GetOutputParaByCommand(„IsEmailExists“)öffentlich int GetOutputParaByCommand(ZeichenfolgeBefehl){ObjektIdentität =0;versuchen{ mobj_SqlCommand.CommandText = Befehl; SqlParameter SQP =neuSQLParameter(„returnVal“, SqlDbType.Int); SQP.Direction = ParameterDirection.ReturnValue; mobj_SqlCommand.Parameters.Add(SQP); mobj_SqlCommand.Connection = mobj_SqlConnection; mobj_SqlCommand.ExecuteScalar(); Identity = Convert.ToInt32(SQP.Value); Verbindung schließen(); }fangen(Ausnahmebeispiel) { CloseConnection(); }zurückkehrenConvert.ToInt32(identity); }

Wir erhalten den zurückgegebenen Wert von SP „IsEmailExists“ mithilfe der obigen C#-Funktion.

Dieser SP sieht sehr seltsam aus. Es ändert nichts an dem, was an @b übergeben wird. Und nirgendwo im SP weisen Sie @b etwas zu. Und @Password ist nicht definiert, sodass dieser SP überhaupt nicht funktioniert.

Ich würde vermuten, dass Sie tatsächlich @Password zurückgeben möchten oder SET @b = (SELECT…) haben möchten.

Viel einfacher wird es sein, wenn Sie Ihren SP wie folgt ändern (Achtung: kein OUTPUT-Parameter):

SatzANSI_NULLSAN SatzQUOTED_IDENTIFIERANgoALTERVERFAHREN[dbo].[Bestätigen] @A Varchar(50)ALSWÄHLEN SPITZE1Passwort AUS dbo.tblUser WO Anmeldung= @A

Anschließend kann Ihr Code cmd.ExecuteScalar verwenden und das Ergebnis empfangen.

Hier gibt es zwei Dinge zu beheben. Richten Sie zunächst die gespeicherte Prozedur ein, um den Wert im Ausgabeparameter (nicht im Rückgabeparameter) zu speichern.

(Video) PRG04SU03 Programmierung Verzweigungen Eingabe Ausgabe

SatzANSI_NULLSANSatzQUOTED_IDENTIFIERANgoALTERVERFAHREN[dbo].[Bestätigen]@A Varchar(50),@B Varchar(50) AusgangALSSATZ@B=(SELECT PasswordFROM dbo.tblUserWHERE Login = @a)ZURÜCKKEHRENGEHEN

Dadurch wird das Passwort in @b gespeichert und Sie erhalten es als Rückgabeparameter. Um es dann in Ihr C# zu bekommen, gehen Sie wie folgt vor:

SQLConnection SqlConn = neu SQLConnection(System.Configuration.ConfigurationManager.ConnectionStrings[„MyLocalSQLServer“].ConnectionString.ToString()); System.Data.SqlClient.SqlCommand sqlcomm = neu System.Data.SqlClient.SqlCommand("Bestätigen", SqlConn);Zeichenfolge Rückgabewert =string.Empty;versuchen{ SqlConn.Open(); sqlcomm.CommandType = CommandType.StoredProcedure;SQLParameter param = neu SQLParameter("@A", SqlDbType.VarChar,50); param.Direction = ParameterDirection.Input; param.Value = Benutzername; sqlcomm.Parameters.Add(param);SQLParameter retval = neu SQLParameter("@B", SqlDbType.VarChar,50); retval.Direction = ParameterDirection.ReturnValue; sqlcomm.Parameters.Add(retval); sqlcomm.ExecuteNonQuery(); SqlConn.Close();Zeichenfolge Rückgabewert =retval.Value.ToString(); }

Vielleicht hilft das.

Datenbankskript:

VERWENDEN Sie [edata]GOSATZANSI_NULLSANGEHENSATZQUOTED_IDENTIFIERANGEHENERSTELLEN VERFAHREN[dbo].[InsertNewUser](@neunameNVARCHAR(255),@neupasswordNVARCHAR(255),@neupositionNVARCHAR(255) )ALSSTART STARTVERSUCHENERKLÄREN @überprüfen INT;SATZ @überprüfen =(WÄHLEN zählen(eid)AUSBenutzerWOEuname= @neuname);WENN(@überprüfen = 0)EINFÜGUNG HINEINeuusers(euname,eupassword,eposition)WERTE(@neuname,@neupassword,@neuposition);ERKLÄREN @lastid INT;SATZ @lastid =@@IDENTITÄT;ZURÜCKKEHREN @lastid;ENDEVERSUCHENSTARTFANGENWÄHLENERROR_LINE()alserrline, ERROR_MESSAGE()alsFehlermeldung, ERROR_SEVERITY()alsFehlergefahrENDEFANGENENDE

Anwendungskonfigurationsdatei:

„1,0“Kodierung=„utf-8“?><Aufbau> <App Einstellungen> <hinzufügen Taste=„conStr“ Wert=„Datenquelle=UserSQLEXPRESS;Initial Catalog=edata;Integrated Security=True“/> App Einstellungen>Aufbau>

Datenzugriffsschicht (DAL):

verwendenSystem;verwendenSystem.Collections.Generic;verwendenSystem.Linq;verwendenSystem.Text;verwendenSystem.Threading.Tasks;verwendenSystemkonfiguration;verwendenSystemdaten;verwendenSystem.Data.SqlClient;Namensraum DAL{öffentlich statisch Klasse DAL{öffentlich statischSqlConnection conn;statisch DAL(){ conn =neuSqlConnection(ConfigurationManager.AppSettings[„conStr“].ToString()); conn.Open(); } }}

Geschäftslogikschicht (BLL):

verwendenSystem;verwendenSystem.Collections.Generic;verwendenSystem.Linq;verwendenSystem.Text;verwendenSystem.Threading.Tasks;verwendenSystemdaten;verwendenSystem.Data.SqlClient;verwendenDAL;Namensraum BLL{öffentlich statisch Klasse BLL{öffentlich statisch int Benutzer einfügen(ZeichenfolgeLadungen,ParameterSqlParameter[]-Coll){intlastInserted =0;versuchen{ SqlCommand comm =neuSqlCommand(); comm.Connection = DAL.DAL.conn;für jede(WarparamIncoll) { comm.Parameters.Add(param); } SqlParameter lastID =neuSqlParameter(); lastID.ParameterName = lastid; lastID.SqlDbType = SqlDbType.Int; lastID.Direction = ParameterDirection.ReturnValue; comm.Parameters.Add(lastID); comm.CommandType = CommandType.StoredProcedure; comm.CommandText =„NeuenBenutzer einfügen“; comm.ExecuteNonQuery(); lastInserted = (int)comm.Parameters[lastid].Value; }fangen(SqlException ex) { }Endlich{Wenn(DAL.DAL.conn.State != ConnectionState.Closed) { DAL.DAL.conn.Close(); } }zurückkehrenlastInserted; } }}

Implementierung :

BLL.BLL.Benutzer einfügen("@Ladung",neu SQLParameter(„Neuname“,„Ded“),neu SQLParameter(„Neupasswort“,„Moro$ilka"),neu SQLParameter(„Neuposition“,„Moroz“) );
Datenbank----->:erstellenproc MySP@A Varchar(50),@B Varchar(50) AusgangALSSATZ @Passwort =(WÄHLENPasswortAUSdbo.tblBenutzerWOAnmeldung= @A)C#----->:SqlConn.Open();sqlcomm.CommandType=CommandType.StoredProcedure;SqlParameter param= neuSqlParameter("@a", SqlDbType.VarChar);param.Direction=ParameterDirection.Input;//DasIstoptional, da EingabeIstDieStandardparam.Wert=Benutzername;sqlcomm.Parameters.Add(param);SqlParameter-Ausgabewert=sqlcomm.Parameters.Add("@b", SqlDbType.VarChar);outputval .Direction=ParameterDirection.Output//NICHTReturnValue;String-Ausgabewert=sqlcomm.Parameters["@b"].Value.ToString();

Angenommen, Sie müssen bestehenNutzernameUndPasswortZuGespeicherte Prozedurund erfahren Sie, ob die Anmeldung erfolgreich war oder nicht, und prüfen Sie, ob ein Fehler aufgetreten istGespeicherte Prozedur.

öffentlich bool IsLoginSuccess(ZeichenfolgeNutzername,ZeichenfolgePasswort){versuchen{ SqlConnection SQLCon =neuSqlConnection(WebConfigurationManager.ConnectionStrings[„SqlConnector“].ConnectionString); SqlCommand sqlcomm =neuSqlCommand(); SQLCon.Open(); sqlcomm.CommandType = CommandType.StoredProcedure; sqlcomm.CommandText =„spLoginCheck“;// Name der gespeicherten Prozedursqlcomm.Parameters.AddWithValue("@Nutzername", Nutzername);// Eingabeparametersqlcomm.Parameters.AddWithValue("@Passwort", Passwort);// Eingabeparameter // Ihr Ausgabeparameter in der gespeicherten Prozedur WarreturnParam1 =neuSqlParameter { ParameterName =„@LoginStatus“, Richtung = ParameterDirection.Output, Größe =1}; sqlcomm.Parameters.Add(returnParam1);// Ihr Ausgabeparameter in der gespeicherten Prozedur WarreturnParam2 =neuSqlParameter { ParameterName ="@Fehler", Richtung = ParameterDirection.Output, Größe =1000}; sqlcomm.Parameters.Add(returnParam2); sqlcomm.ExecuteNonQuery();ZeichenfolgeFehler = (Zeichenfolge)sqlcomm.Parameters["@Fehler"].Wert;ZeichenfolgeRückgabewert = (Zeichenfolge)sqlcomm.Parameters[„@LoginStatus“].Wert; }fangen(Ausnahmebeispiel) { }zurückkehren FALSCH;}

Ihre Verbindungszeichenfolge inWeb.Config

<VerbindungsStrings> <hinzufügen Name=„SqlConnector“ VerbindungsString=„Datenquelle=.SQLEXPRESS;Integrierte Sicherheit=SSPI;Initial Catalog=Datenbankname;Benutzer-ID=IhrBenutzername;Passwort=IhrPasswort“ Anbietername=„System.Data.SqlClient“/> VerbindungsStrings>

Und hier ist dasGespeicherte Prozedurals Referenz

ERSTELLEN VERFAHRENspLoginCheck@Nutzername Varchar(100),@Passwort Varchar(100),@LoginStatus verkohlen(1)= NullAusgang,@Fehler Varchar(1000) AusgangALSSTART SATZKEINE ZÄHLUNGAN;STARTVERSUCHENSTART SATZ @Fehler = 'Keiner' SATZ @LoginStatus = ''WENNEXISTIERT(WÄHLENSPITZE1 * AUSEMP_MASTERWOEMPNAME=@Nutzername UNDEMPPASSWORT=@Passwort)START SATZ @LoginStatus='Y' ENDE ANDERS START SATZ @LoginStatus='N' ENDE ENDE ENDEVERSUCHENSTARTFANGENSTART SATZ @Fehler =FEHLERMELDUNG()ENDE ENDEFANGENENDEGEHEN

Wenn Sie verwenden

(Video) Tod der Prozedur -- Modernes C# ist nicht linear | Oliver Sturm

cmd.Parameters.Add("@RÜCKGABEWERT", SqlDbType.Int).Direction = ParameterDirection.ReturnValue;

Sie müssen dann sicherstellen, dass Ihre gespeicherte Prozedur dies hat

zurückkehren @RÜCKGABEWERT;

am Ende der gespeicherten Prozedur.

Der Wert, den Sie abrufen möchten, ist kein Rückgabewert, sondern ein Ausgabeparameter. Sie müssen die Parameterrichtung auf „Ausgabe“ ändern.

SqlParameter retval = sqlcomm.Parameters.Add("@B", SqlDbType.VarChar);retval.Direction = ParameterDirection.Output;command.ExecuteNonquery();ZeichenfolgeRückgabewert = (Zeichenfolge)sqlcomm.Parameters["@B"].Wert;

Für .net Core 3.0 und Dapper:

Wenn Ihre gespeicherte Prozedur Folgendes zurückgibt:

wählenID, FILE_NAMEausdbo.FileStorageWoID = (wählen max(AUSWEIS)ausdbo.FileStorage);

Dann in c#:

 War Daten= (_dbConnection.Query („dbo.insertFile“, whateverParameters, commandType: CommandType.StoredProcedure)).ToList();WargespeicherterDateiname =Daten[0].DATEINAMEN;Warid =Daten[0].AUSWEIS;

Wie Sie sehen, können Sie eine einfache Klasse definieren, die beim Abrufen der tatsächlichen Werte aus der Standardrückgabestruktur von Dapper hilft (mit der ich nicht arbeiten konnte):

öffentlich Klasse FileUploadQueryResponse{öffentlich ZeichenfolgeAUSWEIS {erhalten;Satz; }öffentlich ZeichenfolgeDATEINAMEN {erhalten;Satz; } }

Diese Codezeile gibt den Store StoredProcedure-Rückgabewert von SQL Server zurück

cmd.Parameters.Add("@Ausweis", System.Data.SqlDbType.Int).Direction = System.Data.ParameterDirection.ReturnValue; cmd.ExecuteNonQuery();

Nach Ausführung des Abfragewerts wird vom SP zurückgegeben

Ausweis= (int)cmd.Parameters["@Ausweis"].Wert;

Das Auffinden von SQL-Syntaxfehlern kann kompliziert sein, es gibt jedoch einige Tipps, wie Sie es etwas einfacher machen können. Die Verwendung der oben genannten Fehlerliste ist eine große Hilfe. Dadurch kann der Benutzer bereits beim Schreiben des Projekts nach Fehlern suchen und so das spätere Durchsuchen tausender Codezeilen vermeiden.

Videos

1. EXCEL VBA Fortgeschrittene #2 - Prozeduren aufrufen & Parameter nutzen (Summe, Mittelwert berechnen)
(ANDRÉ NAS - EXCEL VBA & POWERPOINT)
2. DB0706UE Datenbanken: LE07 Recordset 06 Hinzufügen und Ändern per Recordset
(lerneAccess)
3. How to Create Stored Procedure in MySQL Workbench with INPUT, OUTPUT, INOUT parameters |Crash Course
(TechGeekyArti)
4. Excel VBA Introduction Part 56.4 - Return Multiple Result Sets from SQL Queries
(WiseOwlTutorials)
5. Java Tutorial Deutsch (German) [17/24] - Methoden mit Rückgabewert
(Programmieren Starten)
6. SQL Server Stored Procedures erstellen
(Steffen Krause)

References

Top Articles
Latest Posts
Article information

Author: Sen. Ignacio Ratke

Last Updated: 09/25/2023

Views: 5297

Rating: 4.6 / 5 (76 voted)

Reviews: 83% of readers found this page helpful

Author information

Name: Sen. Ignacio Ratke

Birthday: 1999-05-27

Address: Apt. 171 8116 Bailey Via, Roberthaven, GA 58289

Phone: +2585395768220

Job: Lead Liaison

Hobby: Lockpicking, LARPing, Lego building, Lapidary, Macrame, Book restoration, Bodybuilding

Introduction: My name is Sen. Ignacio Ratke, I am a adventurous, zealous, outstanding, agreeable, precious, excited, gifted person who loves writing and wants to share my knowledge and understanding with you.