2012-07-05 14 views
15

मैं डेटासेट भरने की कोशिश कर रहा हूं जिसमें कई तालिकाओं के साथ 2 टेबल शामिल हैं। मैं इस लक्ष्य को हासिल करने के लिए DataReader उपयोग कर रहा हूँ:डेटासेट को एकाधिक तालिकाओं से कैसे भरें?

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

लेकिन मैं केवल एक मेज भरा मिल गया है। मैं अपना लक्ष्य कैसे प्राप्त करूं - दोनों टेबल भरें?

यदि संभव हो तो मैं DataReader के बजाय DataAdapter का उपयोग करना चाहता हूं।

+3

तुम क्यों उम्मीद करेंगे कि दो तालिकाओं भर रहे हैं? आपके आदेश में केवल एक 'चयन' कथन होता है जो एक एकल तालिका देता है। –

+2

'SqlDataAdapter' का उपयोग क्यों न करें और' DbCommand' की बजाय 'भरें (...)' विधि? – bluevector

+0

@ निकोला Anusev - मुझे पता है, तो मैं बस किसी भी तरह के सुझाव –

उत्तर

19

आप कई चुनिंदा बयानों के साथ एक एकल आदेश जारी कर रहे हैं, तो आप NextResult विधि का उपयोग हो सकता है DataReader भीतर अगले resultset को स्थानांतरित करने के लिए: http://msdn.microsoft.com/en-us/library/system.data.idatareader.nextresult.aspx

मैं इसे bellow कैसा नज़र आ सकता दिखाने:

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

आप केवल 'परिणाम। लोड (पाठक) 'कर सकते हैं। 'लोड' विधि एकाधिक परिणाम-सेट को संभाल लेगी। – AMissico

+0

@AMissico, सच है लेकिन कौन सा तालिका भरने के लिए परिणामसेट को स्पष्ट रूप से डेटासेट के साथ नहीं बताया जा सकता है। लोड, यदि आप किसी अन्य क्रम में तालिकाओं को परिभाषित करते हैं तो यह टूट जाएगा। इसके अलावा आपको अन्य पैरामीटर भी कहना होगा। – smoothdeveloper

+0

आपने आज मुझे मुस्कुराया। – AMissico

23

एक डेटासेट वाई भरने डेटाबेस में एकाधिक अनुरोध भेजकर या एक तेज़ तरीके से वें एकाधिक टेबल किए जा सकते हैं: एक से अधिक अनुरोध डेटाबेस डेटाबेस में एक ही अनुरोध में भेजा जा सकता है। यहां समस्या यह है कि प्रश्नों से उत्पन्न तालिकाओं में स्वचालित नाम तालिका और तालिका 1 है। हालांकि, जेनरेट किए गए टेबल नामों को उन नामों पर मैप किया जा सकता है जिनका उपयोग डेटासेट में किया जाना चाहिए।

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

उत्तर के लिए धन्यवाद, लेकिन मेरे कार्य के अनुसार - मुझे DataAeadapter के बजाय DataReader का उपयोग करने की आवश्यकता है: यह मेरे प्रश्न –

+3

में तालिका मैपिंग के साथ जोड़ना था। जोड़ें nccassarry नहीं है –

7

यह एक पुराने विषय है, लेकिन कुछ लोगों के लिए यह उपयोगी हो सकता है:

 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

एसक्यूएल (स्टोर प्रो) एकाधिक टेबल लौटने पर इस स्थिति को कैसे संभाला जा सकता है ? –

+1

'अनुकूलन करने के बजाय। भरें (कुछडेटासेट टेबल्स ["तालिका 1"])' आप 'अनुकूलन करेंगे। भरें (कुछडेटासेट) '। क्योंकि आपकी संग्रहीत प्रक्रिया तालिकाओं को फिर से चालू करती है, लेकिन केवल तभी जब यह वास्तव में टेबल लौटाती है और एकाधिक तालिकाओं से COLUMNS का सेट नहीं है। – CularBytes

+0

प्रतिक्रिया के लिए धन्यवाद, इस बात का प्रयास करेंगे :-) –

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

कृपया, कुछ स्पष्टीकरण जोड़ें। – gofr1

संबंधित मुद्दे