2012-07-05 19 views
15

Birbiriyle çok ilişki içeren 2 tablo içeren DataSet'i doldurmaya çalışıyorum.Veri kümesini birden çok tablo ile doldurma?

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; 
    } 

Ama sadece bir masa dolar var: Bunu başarmak için DataReader kullanıyorum. Hedefime nasıl ulaşırım - her iki tabloyu da doldurun mu?

Mümkünse DataAeader yerine DataAdapter kullanmak istiyorum. http://msdn.microsoft.com/en-us/library/system.data.idatareader.nextresult.aspx

Ben feryat görünebilir göstermek:

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; 
} 
+3

Neden iki tablo dolmasını beklersiniz? Komutunuz sadece tek bir tablo döndüren tek bir 'select' ifadesi içerir. –

+2

Neden "DbCommand" yerine "SqlDataAdapter" ve "Fill (...)" yöntemini kullanmıyorsunuz? – bluevector

+0

@Nikola Anusev - Biliyorum, bu yüzden sadece –

cevap

19

, sen datareader içinde sonraki resultset geçmek için NextResult yöntemini kullanabilir bir DataSet wi Dolum

+7

Sadece 'result.Load (okuyucu)' yapabilirsiniz. 'Load' yöntemi çoklu sonuç kümelerini ele alacaktır. – AMissico

+0

@AMissico, true, ancak hangi sonuç kümesinin DataSet.Load ile açıkça belirtilemeyeceği ile ilgili tablo, tabloları başka bir sırayla tanımlarsanız kırılır. Ayrıca diğer parametreleri de belirtmeniz gerekir. – smoothdeveloper

+0

bugün beni güldürdün. – AMissico

3

birkaç seçme ifadelere tek komutu veren varsa

23

-:

Here is very good answer of your question MSDN sayfasında yukarıda belirtilen örneğe bakın Birden çok tablo, veritabanına birden çok istek göndererek veya daha hızlı bir şekilde yapılabilir: Çoklu SELECT deyimleri, veritabanı sunucusuna tek bir istekte gönderilebilir. Buradaki problem, sorgulardan oluşturulan tabloların otomatik isimleri Tablo ve Tablo1'dir. Ancak, oluşturulan tablo adları DataSet'te kullanılması gereken adlara eşlenebilir.

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

Cevabınız için teşekkür ederiz, fakat göreve başladım - DataReader yerine DataAdapter kullanmalıyım: Bu soru, TableMappings.Add ile eklendiğim –

+3

sorularımda anlatılmıştır. Nullsarry –

7

Bu eski bir konu, ama bazı insanlar için yararlı olabilir:

 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

değil, birden çok tablo döndüren sql (mağaza proc) bu durumu nasıl ele alabilir ? –

+1

'adap.Fill (someDataSet.Tables [" Table1 "])' 'yerine' 'adap.Fill (someDataSet)' yaparsınız. Tabi olduğunuzdan, saklı yordamınız tabloları geri çeker, ancak yalnızca TABLES'i döndürürse ve birden fazla tablodan bir COLUMNS kümesi döndürmezse. – CularBytes

+0

Yanıt için teşekkürler, bu şeyi deneyeceğim :-) –

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

Lütfen, biraz açıklama ekleyin. – gofr1

İlgili konular