2013-08-29 6 views
9

ich ein ASP klassisches System zu C#mehrere Re-Cord-Return von gespeicherten proc in C#

ich eine gespeicherte Prozedur zu konvertieren habe, die (in Abhängigkeit von den übergebenen Parametern in) bis 7-Cord-Sets zurückkehren können.

Ich muss wissen, wie ich einfach alle Re-Cord-Sets als einzelne DataTables zurückgeben kann, so dass ich durch was auch immer dort gehen kann, zum nächsten DataTable überspringe, wenn ich an das Ende des gehen, ohne mehrere SQL-Anweisungen auszuführen und Verwenden Sie mehrere adapter.Fill-Anweisungen, um jede Tabelle zu einem DataSet hinzuzufügen.

In klassischen es war eine einfache Do While nicht objRS.EOF Schleife mit einem objRS.NextRecordset(), wenn ich an das Ende der Schleife, um zur nächsten Anweisung zu gelangen.

Gibt es etwas, das ich verwenden kann, erfordert keine vollständige Neuschreibung des aktuellen Back-End-Code?

Jedes Recordset hat eine andere Anzahl von Spalten und Zeilen. Sie sind nicht miteinander verwandt. Wir geben mehrere Recordsets von Stored Proc zurück, um den Datenverkehr zu reduzieren.

Beispiele wären nett.

Dank

Antwort

11
SqlConnection con=new SqlConnection("YourConnection String"); 
SqlCommand cmd=new SqlCommand(); 
SqlDataAdapter da=new SqlDataAdapter(); 
DataSet ds = new DataSet(); 
cmd = new SqlCommand("name of your Stored Procedure", con); 
cmd.CommandType = CommandType.StoredProcedure; 
//cmd.Parameters.AddWithValue("@SuperID", id);//if you have parameters. 
da = new SqlDataAdapter(cmd); 
da.Fill(ds); 
con.Close(); 

Danach können Sie ad nehmen Vorteil von verschiedenen (7) Re-Cord-Sets mit

ds.Tables[0] 
ds.Tables[1] 
ds.Tables[2] 
ds.Tables[3] 
ds.Tables[4] 
ds.Tables[5] 
ds.Tables[6] 
+0

Danke, ich mag diese Antwort rein, weil ich bereits eine Datenklasse mit Wrapper-Funktionen, die Verbindungen handhaben und entsorgen sie, wenn die Klasse zerstört usw. Ich wollte nur eine vorhandene Funktion verwenden, die Ich hatte und referenzieren die Tabellen innerhalb des Datensatzes. – user2334626

5

das Sie zurückkehren werden alles, was Sie

brauchen
using (SqlConnection conn = new System.Data.SqlClient.SqlConnection(connString)) 
{ 
    using (SqlCommand cmd = new SqlCommand()) 
    { 
     cmd.CommandText = "yoursp"; 
     cmd.Connection = conn; 
     cmd.CommandType = CommandType.StoredProcedure; 

     conn.Open(); 

     SqlDataAdapter adapter = new SqlDataAdapter(cmd); 

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

     conn.Close(); 
    } 
} 
+2

Dies ist, was ich verwende, um mehrere Recordsets aus einer gespeicherten Prozedur zu erhalten. Nur zur Verdeutlichung werden die Recordsets in 'ds.Tables' gespeichert und Sie können das' DataSet ds = new DataSet(); 'am Anfang platzieren, so dass Sie es außerhalb des' using (SqlConnection conn = new System.Data.SqlClient.SqlConnection (connString)) block. Nur ein Gedanke. – JoeFletch

+0

Ja, Sie können es verschieben. Ich gebe nur ein Beispiel dafür, wie es geht. – Ehsan

8

Wenn Sie einen Datensatz mit der SqlDataAdapter.Fill() Methode füllen dann als Datentabelle zurückgegeben werden jedes Ihrer Cord-Sets aus der gespeicherten Prozedur zurück in Ihrem Dataset

DataSet dataset = new DataSet(); 
using (var adapter = new SqlDataAdapter("yourStoredProcedure", yourConnectionString)) 
{ 
    adapter.SelectCommand.CommandType = CommandType.StoredProcedure; 
    adapter.Fill(dataset); 
} 
for (int i = 0; i < dataset.Tables.Count; i++) 
{ 
    // Do something for each recordset 
} 

Wenn Sie einen SqlDataReader verwenden, dann können Verwendung der SqlDataReader.NextResult() Methode verwenden, um vorzurücken auf die nächste Cord-:

using (var connection = new SqlConnection(yourConnectionString)) 
using (var command = new SqlCommand("yourStoredProcedure")) 
{ 
    connection.Open(); 
    using (var reader = command.ExecuteReader()) 
    { 
     while (reader.Read()) 
     { 
      // do something with first result set; 
     } 
     if (reader.NextResult()) 
     { 
      while (reader.Read()) 
      { 
       // do something with second result set; 
      } 
     } 
     else 
     { 
      return; 
     } 
     if (reader.NextResult()) 
     { 
      while (reader.Read()) 
      { 
       // do something with third result set; 
      } 
     } 
     else 
     { 
      return; 
     } 
    } 
} 
+0

Ich wusste nie, dass Sie mit 'SqlDataReader' mit' .ExecuteReader() 'und' .NextResult() 'mehrere Ergebnismengen erhalten können. Danke für die ausführliche Antwort! – JoeFletch

+2

In der Tat kann ich, ich bevorzuge in der Regel mit dem SqlDataReader aufgrund der geringeren Speicherauslastung arbeiten, indem Sie nur den aktuellen Datensatz speichern, und sich nicht mit dem beschäftigen, was bereits gelesen wurde und was noch zu lesen ist. Allerdings gibt es eine große Analogie in [dieser Antwort] (http://stackoverflow.com/a/1083223/1048425) Vergleichen von Datensätzen mit Datenreadern. – GarethD

+0

Vielen Dank für den SO Link! Ich habe 'SqlDataReader' in der Vergangenheit benutzt und ich dachte, dass es eine Menge von zu wartendem Code war. Ich habe dann 'DataTables' ausprobiert und dachte, dass sie viel schneller waren. Ich werde die Alternativen berücksichtigen müssen, wenn ich in Zukunft zusätzlichen Code schreibe! Nochmals vielen Dank für das Teilen! – JoeFletch

0

können Sie überprüfen, ob dr mehr Cord-if (dr.NextResult())

unter Verwendung ot nicht hat und dann wieder Schleife mit dr.read

versuchen, diese

string connStr = ConfigurationManager.ConnectionStrings["ConString"].ConnectionString; 
SqlConnection Con = new SqlConnection(connStr); 

try 
{ 
    string str1 = "select productid,productname from products;select VendorFName from vendor"; 
    SqlCommand com = new SqlCommand(str1, Con); 

    com.Connection.Open(); 

    SqlDataReader dr = com.ExecuteReader(); 

    DropDownList1.Items.Add("Select Product Id"); 
    DropDownList2.Items.Add("Select Vendor Name"); 

    while(dr.Read()) 
    { 
     DropDownList1.Items.Add(dr.GetValue(0).ToString()); 
    } 

    if (dr.NextResult()) 
    { 
     while (dr.Read()) 
     { 
      DropDownList2.Items.Add(dr.GetValue(0).ToString()); 
     } 
    } 
} 
catch (Exception ex) 
{ 
} 
finally 
{ 
    if (Con.State == ConnectionState.Open) 
    { 
     Con.Close(); 
    } 
} 
Verwandte Themen