Problem beim Auslesen der parameter von gespeicherten Prozeduren mit c#
Nur komm ich über ein seltsames problem, wo ich nicht abrufen der gespeicherten sql-Prozedur aus parameter-Wert. Ich schlug mit diesem problem seit fast 2 Stunden.
Code ist sehr einfach
using (var con = new SqlConnection(connectionString))
{
con.Open();
SqlCommand cmd = new SqlCommand("sp_mgsearach", con);
cmd.CommandType = CommandType.StoredProcedure;
SqlParameter param1 = new SqlParameter("@SearchTerm", SqlDbType.VarChar);
param1.Value = searchTerm;
param1.Direction = ParameterDirection.Input;
cmd.Parameters.Add(param1);
SqlParameter param2 = new SqlParameter("@start", SqlDbType.Int);
param2.Value = start;
param2.Direction = ParameterDirection.Input;
cmd.Parameters.Add(param2);
SqlParameter param3 = new SqlParameter("@end", SqlDbType.Int);
param3.Value = end;
param3.Direction = ParameterDirection.Input;
cmd.Parameters.Add(param3);
SqlParameter param4 = new SqlParameter("@total", SqlDbType.Int);
param4.Direction = ParameterDirection.InputOutput;
param4.Value = 0;
cmd.Parameters.Add(param4);
var reader = cmd.ExecuteReader();
LoadHits(reader);
if (lstHits.Count > 0)
total = Convert.ToInt32(cmd.Parameters["@total"].Value);
else
total = 0;
}
dem @ - Gesamt-Wert ist immer null. Aber wenn ich die Abfrage ausführen wird durch den profiler in query analyzer , gibt es in Ordnung.
Schließlich habe ich festgestellt, dass dies durch die SQL-Verbindung.
Es funktioniert gut, wenn ich schließen Sie die Verbindung vor dem Lesen Sie den out-param
LoadHits(reader);
con.close()
if (lstHits.Count > 0)
total = Convert.ToInt32(cmd.Parameters["@total"].Value);
else
total = 0;
WT.., ich kann nicht herausfinden, warum verhält es sich so.. jemand eine Idee?
Du musst angemeldet sein, um einen Kommentar abzugeben.
Parameter Werte, die zurückgegeben werden am Ende der TDS-Datenstrom (da könnte man es ändern, am Ende von der Abfrage nach der Auswahl der Daten). Sie müssen sicher sein, zu konsumieren alle die TDS-Daten (oder zumindest die, Ursache die Puffer werden geleert, die
Close()
für Sie tut), um den aktualisierten parameter-Werten, zum Beispiel:Das gleiche gilt für SQL-Fehler ausgelöst spät in die Abfrage. Sie könnten auch versuchen, hinzufügen von ein
using
; dies kann auch ausreichend sein:Hinzufügen zu Marc ' s Antwort, Sie können einfach schließen Sie die Leser (nicht die Verbindung), um die Ergebnisse zu erhalten.
Dies ist gut dokumentiert ("Schließen des DataReader"): http://msdn.microsoft.com/en-us/library/haa3afyz(v=VS.100).aspx