2012-07-05 19 views
15

Ich versuche DataSet zu füllen, die mit einem zu vielen Beziehung 2 Tabellen enthält. Ich verwende Datareader dies zu erreichen:Wie füllt man Dataset mit mehreren Tabellen?

public DataSet SelectOne(int id) 
    { 
     DataSet result = new DataSet(); 
     using (DbCommand command = Connection.CreateCommand()) 
     { 
      command.CommandText = "select * from table1"; 

      var param = ParametersBuilder.CreateByKey(command, "ID", id, null); 
      command.Parameters.Add(param); 

      Connection.Open(); 
      using (DbDataReader reader = command.ExecuteReader()) 
      { 
       result.MainTable.Load(reader); 
      } 
      Connection.Close(); 
     } 
     return result; 
    } 

Aber ich habe nur eine Tabelle gefüllt bekam. Wie erreiche ich mein Ziel - füllen Sie beide Tabellen?

würde Ich mag Datareader verwenden, anstatt Dataadapter, wenn es möglich ist.

+3

Warum würden Sie erwarten, dass zwei Tabellen gefüllt sind? Ihr Befehl enthält nur eine einzige 'select' Anweisung, die eine einzelne Tabelle zurückgibt. –

+2

Warum verwenden Sie nicht '' SqlDataAdapter' 'und die 'Fill (...)' Methode anstelle des 'DbCommand'? – bluevector

+0

@Nikola Anusev - Ich weiß es, so frage ich einfach jede Art von Anregung –

Antwort

19

Wenn Sie einen einzelnen Befehl mit mehreren SELECT-Anweisungen Ausgabe, können Sie Nextresult-Methode zu bewegen zum nächsten Suchresultates im Datareader verwenden: http://msdn.microsoft.com/en-us/library/system.data.idatareader.nextresult.aspx

ich zeigen, wie es unten aussehen könnte:

public DataSet SelectOne(int id) 
{ 
    DataSet result = new DataSet(); 
    using (DbCommand command = Connection.CreateCommand()) 
    { 
     command.CommandText = @" 
select * from table1 
select * from table2 
     "; 

     var param = ParametersBuilder.CreateByKey(command, "ID", id, null); 
     command.Parameters.Add(param); 

     Connection.Open(); 
     using (DbDataReader reader = command.ExecuteReader()) 
     { 
      result.MainTable.Load(reader); 
      reader.NextResult(); 
      result.SecondTable.Load(reader); 
      // ... 
     } 
     Connection.Close(); 
    } 
    return result; 
} 
+7

Sie können einfach 'result.Load (reader)'. Die Load-Methode verarbeitet mehrere Ergebnismengen. – AMissico

+0

@AMissico, wahr, aber die Tabelle mit dem Suchresultates füllen kann nicht explizit mit DataSet.Load angegeben wird, wird es brechen, wenn Sie Tabellen in einer anderen Reihenfolge zu definieren. Auch Sie müssen andere Parameter angeben. – smoothdeveloper

+0

du hast mich heute zum lächeln gebracht. – AMissico

23

ein DataSet wi Filling Diese mehreren Tabellen können erstellt werden, indem mehrere Anfragen an die Datenbank gesendet werden oder schneller: Mehrere SELECT-Anweisungen können in einer einzigen Anfrage an den Datenbankserver gesendet werden. Das Problem hierbei ist, dass die aus den Abfragen generierten Tabellen die Namen Table und Table1 haben. Die generierten Tabellennamen können jedoch Namen zugeordnet werden, die im DataSet verwendet werden sollen.

SqlDataAdapter adapter = new SqlDataAdapter(
     "SELECT * FROM Customers; SELECT * FROM Orders", connection); 
adapter.TableMappings.Add("Table", "Customer"); 
adapter.TableMappings.Add("Table1", "Order"); 

adapter.Fill(ds); 
+0

Vielen Dank für die Antwort, aber nach meiner Aufgabe - ich brauche DataReader statt DataAdapter: das wurde in meiner Frage beschrieben –

+3

Hinzufügen mit TableMappings.Add ist nicht neccassarry –

7

Es ist ein altes Thema, aber für manche Menschen könnte es nützlich sein:

 DataSet someDataSet = new DataSet(); 
     SqlDataAdapter adapt = new SqlDataAdapter(); 

     using(SqlConnection connection = new SqlConnection(ConnString)) 
     { 
      connection.Open(); 
      SqlCommand comm1 = new SqlCommand("SELECT * FROM whateverTable", connection); 
      SqlCommand comm2g = new SqlCommand("SELECT * FROM whateverTable WHERE condition = @0", connection); 
      commProcessing.Parameters.AddWithValue("@0", "value"); 
      someDataSet.Tables.Add("Table1"); 
      someDataSet.Tables.Add("Table2"); 

      adapt.SelectCommand = comm1; 
      adapt.Fill(someDataSet.Tables["Table1"]); 
      adapt.SelectCommand = comm2; 
      adapt.Fill(someDataSet.Tables["Table2"]); 
     } 
+0

wie kann diese Situation umgehen, wenn sql (Speicher Proc) mehrere Tabellen zurückgibt ? –

+1

Statt 'adapt.Fill tun (someDataSet.Tables [ "Table1"])' Sie tun würden, 'adapt.Fill (someDataSet)'. Natürlich liest Ihre gespeicherte Prozedur die Tabellen zurück, aber nur, wenn sie wirklich TABLES und nicht eine Menge von COLUMNS aus mehreren Tabellen zurückgibt. – CularBytes

+0

Danke für die Antwort, werde dieses Ding versuchen :-) –

0
protected void Page_Load(object sender, EventArgs e) 
{ 
    SqlConnection con = new SqlConnection("data source=.;uid=sa;pwd=123;database=shop"); 
    //SqlCommand cmd = new SqlCommand("select * from tblemployees", con); 
    //SqlCommand cmd1 = new SqlCommand("select * from tblproducts", con); 
    //SqlDataAdapter da = new SqlDataAdapter(); 

    //DataSet ds = new DataSet(); 
    //ds.Tables.Add("emp"); 
    //ds.Tables.Add("products"); 
    //da.SelectCommand = cmd; 
    //da.Fill(ds.Tables["emp"]); 
    //da.SelectCommand = cmd1; 

    //da.Fill(ds.Tables["products"]); 
    SqlDataAdapter da = new SqlDataAdapter("select * from tblemployees", con); 
    DataSet ds = new DataSet(); 
    da.Fill(ds, "em"); 
    da = new SqlDataAdapter("select * from tblproducts", con); 
    da.Fill(ds, "prod"); 

    GridView1.DataSource = ds.Tables["em"]; 
    GridView1.DataBind(); 
    GridView2.DataSource = ds.Tables["prod"]; 
    GridView2.DataBind(); 
} 
+0

Bitte, fügen Sie einige Erklärung hinzu. – gofr1

Verwandte Themen