Как заполнить набор данных несколькими таблицами?

Я пытаюсь заполнить DataSet, который содержит 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, если это возможно.

5 ответов

Если вы выдаете одну команду с несколькими операторами select, вы можете использовать метод NextResult для перехода к следующему набору результатов в datareader: http://msdn.microsoft.com/en-us/library/system.data.idatareader.nextresult.aspx

Я покажу, как он мог выглядеть ниже:

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


Заполнение DataSet несколькими таблицами может быть выполнено путем отправки нескольких запросов в базу данных или более быстрым способом. Несколько операторов SELECT могут быть отправлены на сервер базы данных одним запросом. Проблема здесь в том, что таблицы, созданные из запросов, имеют автоматические имена Таблица и Таблица1. Тем не менее, сгенерированные имена таблиц могут быть сопоставлены с именами, которые должны использоваться в DataSet.

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


Это старая тема, но для некоторых это может быть полезно:

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"]);
 }


Вот очень хороший ответ на ваш вопрос

см. пример, упомянутый выше на странице MSDN: -


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

licensed under cc by-sa 3.0 with attribution.