Returncode von Stored Proc in .NET-Code ermitteln

12/06/2008 - 13:10 von Alexander Mueller | Report spam
Hallo

wie kann ich den Returncode der Ausführung einer SP
(SQL-Server) in C# ermitteln?
Die SP gibt ein Resultset zurück, das in ein Dataset geladen
wird, außerdem noch einen Returncode (SQL-return Anweisung).

Wie kann ich den abfragen, über die Parameters-Collection
des SelectCommands?


Gruß,
Alex


<SQL>
...
declare @anzahl int
declare @ergebnis int

select @anzahl = count(*) from #tmp
select top 1 @ergebnis = ergebniscode from #tmp
select * from #tmp
drop table #tmp

if @anzahl > 0
return @ergebnis -- Wie ruf ich das in C# ab?
else
return -1

</SQL>

<C#>

SqlCommand sc = new SqlCommand();
sc.CommandType = CommandType.StoredProcedure;
sc.CommandText = "pSRS_WurdeTaskAusgefuehrt";
sc.Parameters.AddWithValue("@PartnerID", partnerChar);
sc.Parameters.AddWithValue("@SollAusfuehrung", sollAusfuehrung);
sc.Parameters.AddWithValue
(
"@ReportOderFlatfile",
taskType == TaskType.FlatFile ? 'F' : 'R'
);

sc.Connection = _ccon.Connection;

SqlDataAdapter da = new SqlDataAdapter(sc);
da.UpdateCommand = sc;

DataSet ds = new DataSet();
da.Fill(ds);

//Wo kann ich den Returncode der Ausführung abfragen?
//Ist das ein bestimmter benannter Parameter?


</C#>
 

Lesen sie die antworten

#1 Elmar Boye
12/06/2008 - 13:53 | Warnen spam
Alexander Mueller schrieb:
wie kann ich den Returncode der Ausführung einer SP
(SQL-Server) in C# ermitteln?
Die SP gibt ein Resultset zurück, das in ein Dataset geladen
wird, außerdem noch einen Returncode (SQL-return Anweisung).

Wie kann ich den abfragen, über die Parameters-Collection
des SelectCommands?


<SQL>
...



Ganz zu Beginn sollte stehen
SET NOCOUNT ON

Denn sonst mußt Du Dich zunàchst durch jede Menge leere Resultsets arbeiten
(bzw. der SqlDataAdapter muß es).
Grundsàtzlich stehen alle Ausgabeparameter (inkl. ReturnValue) erst am Ende,
nach dem letzten Resultset, zur Verfügung.
Und jedes SELECT sowie INSERT, UPDATE, DELETE liefert ohne SET NOCOUNT ON
eines, bei letzeren sind die nur immer leer!


declare @anzahl int
declare @ergebnis int

select @anzahl = count(*) from #tmp
select top 1 @ergebnis = ergebniscode from #tmp
select * from #tmp
drop table #tmp

if @anzahl > 0
return @ergebnis -- Wie ruf ich das in C# ab?
else
return -1



Im Prinzip ist das viel Rauch um nichts.
Das Fill liefert Dir bereits die Zahl der verarbeiteten Zeilen
(@@ROWCOUNT in T-SQL).
Ein TOP 1 ohne ORDER BY liefert ein zufàlliges Ergebnis
und die Daten hast Du sowieso im DataSet, Du kannst Dir
den Wert also auch dort abholen.


</SQL>

<C#>

SqlCommand sc = new SqlCommand();
sc.CommandType = CommandType.StoredProcedure;
sc.CommandText = "pSRS_WurdeTaskAusgefuehrt";



Der Return Parameter, da traditionell der erste

sc.Parameters.Add(new SqlParameter("@RETURN_VALUE", SqlDbType.Int));
sc.Parameters["@RETURN_VALUE"].Direction = ParameterDirection.ReturnValue;

sc.Parameters.AddWithValue("@PartnerID", partnerChar);



Besser Du deklarierst alle Parameter mit Typ (und Lànge bei Zeichenfolgen).
Das ist sicherer und auch effizienter (da nur ein Plan gecacht wird).

Unter der Annahme PartnerID ist ein Char(10) z. B.
sc.Parameters.Add("@PartnerID", SqlDbType.Char, 10).Value = partnerChar;

sc.Parameters.AddWithValue("@SollAusfuehrung", sollAusfuehrung);
sc.Parameters.AddWithValue
(
"@ReportOderFlatfile",
taskType == TaskType.FlatFile ? 'F' : 'R'
);



und hier àquivalent.

sc.Connection = _ccon.Connection;

SqlDataAdapter da = new SqlDataAdapter(sc);
da.UpdateCommand = sc;

DataSet ds = new DataSet();
da.Fill(ds);



Der Wert wird am Ende in der Parameters Auflistung geliefert,
zeigen sollte Dir das:
Console.WriteLine("RETURNS: {0}", sc.Parameters["@RETURN_VALUE"].Value);

//Ist das ein bestimmter benannter Parameter?

Der Name ist beliebig, eingebürgert hat sich @RETURN_VALUE, oder auch @rc,
entsprechend dem Auruf in T-SQL:
EXEC @RETURN_VALUE = pSRS_WurdeTaskAusgefuehrt ...

Gruß Elmar

Ähnliche fragen