2009-05-06 9 views
3

Ich habe eine gespeicherte Prozedur, die zwei Recordsets zurückgibt, die ich mit GetReader aufrufen. Ich wiederhole die erste, rufe IDataReader.NextResult() auf, dann wiederhole ich die zweite.Gespeicherte Proc Ausgabeparameter + Wählen Sie nicht übergeben Ausgabeparameter

Ich gebe den Ausgabeparametern im SP Werte zu, aber wenn ich die Werte nach Abschluss mit meinem Leser überprüfe, sind meine Ausgabeparameter null. Sieht nach einem Fehler aus. Ich möchte keine Auswahl verwenden, da ich keine Fudges mag. Einige Schnipsel ...

...

sp.Command.AddParameter("@SelectedTabID", selectedTabID, DbType.Int32); 
sp.Command.AddParameter("@CurrentTabID", 0, DbType.Int32, ParameterDirection.Output); 
sp.Command.AddParameter("@TypeID", 0, DbType.Int32, ParameterDirection.Output); 

(Anmerkung es auf diese Art und Weise oder mit AddOutputParameter tun() liefert gleiche Ergebnisse)

...

using(IDataReader reader = sp.GetReader()) 
{ 
    while (reader.Read()) {...} 
    if (reader.NextResult()) {while (reader.Read()) {...}} 

} 

.. .

int one = (int)sp.OutputValues[0]; //null expected an int 
int two = (int)sp.OutputValues[1]; //null expected an int 

Looki uns auf einige Perlen der Weisheit ng :)

+0

Welche RDBMS, SQL Server, Oracle, DB2, MySQL,. . . ? –

+0

SQL Server 2005 mit Subsonic –

Antwort

0

Das ist Unterschall Versagen, funktioniert wie ein Moor Standard SQLConnection-/Befehl

0

Etwas verwirrt hier ... erwarten Sie die Ausgabe von skalaren Werten oder irgendeine Art von Cord-? Get Reader wäre nur sinnvoll, wenn Sie z. einige Cursor zurück, wie aus Parameter kommt ...

Sie möchten „ExecuteNonQuery()“ auf Ihren Befehl aufrufen und sicherstellen, dass Sie die Commandtype richtig (CommandType.StoredProcedure)

+0

SP geht: Wählen Sie @ p1 = somevalue, @ p2 = othervalue Von irgendwo Wählen Sie a, b, c Aus Abfrage 1 Wo somevalue = @ p1 x Wählen, y, z Aus Abfrage 2 Wo irgendeinothervalue = @ p2 ... Ich möchte stören Ergebnissätze und beide Parameter Mit InputOutput aas der Typ dieses Problem behoben. –

4

Der einfachste Weg, um das Set Ausgabeparameter ist eine instanziierte Variable zu verwenden. Was ich meine, ist ein Verweis auf Ihre Parameter halten, dann, wenn Sie Ihre sproc ausführen, dann können Sie sie wie folgt kontrollieren:

SqlCommand cmd = new SqlCommand(); 
cmd.Connection = ConfigurationManager.ConnectionStrings["MyCon"].ToString(); 
cmd.CommandText = "MySproc"; 

SqlParameter parmOut = new SqlParameter("@StuffIWant", SqlDbType.Int); 
parmOut.Direction=ParameterDirection.Output; 

cmd.Parameters.Add(parmOut); 
cmd.ExecuteNonQuery(); 

string theThingIWant = parmOut.Value.ToString(); 

Dies ist kein Datareader verwenden können, aber Sie können dies nutzen können finde die richtige Antwort. Viel Glück.

0

Die Antwort ist, dass Sie den Reader schließen müssen, bevor Sie auf die Ausgabeparameter zugreifen können.

Von: This Page

  • Stellen Sie sicher, dass der Re-Cord zunächst als SqlDataReader über cmd.ExecuteReader() Prozess durch alle Cord-Sets abrufen und dann ...
  • Achten Sie darauf, die enge -Cord, oder SqlDataReader über reader.Close() vor dem Versuch, die Ausgangsparameter
zurückzuholen
Verwandte Themen