2009-07-02 11 views
2

Ich möchte Informationen aus zwei Tabellen aus einem db abrufen. Eine Zeile von A, und die Zeilen in B mit einem FK zu der Zeile, die ich aus A gezogen habe.Zwei SELECTS, eine Abfrage

Ich möchte dies zu einem einzigen gespeicherten Proc mit zwei Select-Anweisungen machen, anstatt zwei Aufrufe an die DB.

Ich kenne mehrere Möglichkeiten, um die Informationen aus einer einzelnen Auswahl zu ziehen ... aber kann mich nicht erinnern, wie man Daten von mehreren Auswahlen erhält. Das Googeln hat sich als schwierig erwiesen, da ich Schwierigkeiten habe, mit Substantiven/Verben zu kommen, um die Situation zu beschreiben, die nicht eine Million anderer Dinge beschreibt.

Kann mir jemand in die richtige Richtung zeigen?

(Um die Dinge einfach zu halten, weiß ich, "verwenden" Anweisungen und solche ... Ich brauche nur die Grundidee des Ansatzes).

using (SqlConnection conn = new SqlConnection(connectionString)) 
{ 
    using (SqlCommand com = new SqlCommand(commandString, conn)) 
    { 
     <somehow get multiple select's of data here in one call> 
    } 
} 

Antwort

4

Wenn Sie sich zur Verwendung des SqlDataReader verwendet dann müssen Sie nur Ihre gespeicherte Prozedur oder SQL-Anweisung ausführen mehrere wählt haben und rufen NextResult() auf die bewegen nächste Ergebnismenge:

using (SqlConnection conn = new SqlConnection(connectionString)) 
{ 
    conn.Open(); 
    SqlCommand cmd = new SqlCommand(commandString, conn); 
    // Add parameters here 
    using (SqlDataReader reader = cmd.ExecuteReader()) 
    { 
     // This will read the first result set 
     while(reader.Read()) 
     { 
      // Read data 
     } 

     // This will read the second result set 
     if (!reader.NextResult()) 
     { 
      throw new ApplicationException("Only one result set returned"); 
     } 

     while (reader.Read()) 
     { 
      // Read data 
     } 
    } 
} 

Wenn Sie den Datenadapter zur Verwendung von Daten der Rückkehr Tabellen sind dann alles, was Sie tun müssen, ist, dass Ihr Datenadapter einen Datensatz füllen und die Ergebnismengen aus den Tabellen Eigenschaft extrahieren:

using (SqlConnection conn = new SqlConnection(connectionString)) 
{ 
    conn.Open(); 

    SqlDataAdapter da = new SqlDataAdapter(commandString, conn); 
    DataSet ds = new DataSet(); 
    da.Fill(ds); 

    DataTable firstResult = ds.Tables[0]; 
    DataTable secondResult = ds.Tables[1]; 
} 
+0

Ehrfürchtig und vollständig. Die zweite Antwort ist, was ich vorher gesehen habe, aber beide sind gut zu wissen. Danke vielmals. – Beska

0

Sie müssen M.A.R.S, verwenden, die ermöglicht es Ihnen, Datatable aus mehreren wählt als ein Datatablecollection zu laden.

+1

Nichts in der ursprünglichen Post zeigt an, dass mehrere Ergebnismengen gleichzeitig benötigt werden. –

3

Hinweis: Syntaxfehler möglicherweise nicht aktiviert. Aber der Punkt ist, verwenden Sie SqlDataReader.NextResult().

+0

Das sieht genau so aus, wie ich es brauchen würde ... aber ich sehe die .ReadNext() Methode nicht ... vermisse ich das Ziehen in einer Bibliothek, die ich brauche? – Beska

+0

@Beska: NextResult, nicht ReadNext. Ich habe gerade den Code aktualisiert. –

0

Vielleicht missverstehe ich, was Sie versuchen zu tun, aber können Sie nicht einen Join und einen Datenreader verwenden, um diese Informationen zu erhalten?

grob (in Ihrem Befehl die Anweisung using)

select a.foo, b.bar from a, b where a.id = 2 and b.foo = a.foo; 

using(DbDataReader reader = com.executeReader()) 
{ 
    while(reader.read()) 
    { 
     myA.foo = reader[0].toString(); 
     myB.bar = reader[1].toString(); 
    } 
} 
Verwandte Themen