如何用多个表填充数据集?

我正在尝试填充包含2个具有一对多关系的表的DataSet。 我正在使用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。

如果要发出包含多个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语句发送到数据库服务器。 这里的问题是从查询生成的表具有自动名称Table和Table1。 但是,生成的表名称可以映射到应该在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(); } 
  string connetionString = null; SqlConnection connection ; SqlCommand command ; SqlDataAdapter adapter = new SqlDataAdapter(); DataSet ds = new DataSet(); int i = 0; string firstSql = null; string secondSql = null; connetionString = "Data Source=ServerName;Initial Catalog=DatabaseName;User ID=UserName;Password=Password"; firstSql = "Your First SQL Statement Here"; secondSql = "Your Second SQL Statement Here"; connection = new SqlConnection(connetionString); try { connection.Open(); command = new SqlCommand(firstSql, connection); adapter.SelectCommand = command; adapter.Fill(ds, "First Table"); adapter.SelectCommand.CommandText = secondSql; adapter.Fill(ds, "Second Table"); adapter.Dispose(); command.Dispose(); connection.Close(); //retrieve first table data for (i = 0; i <= ds.Tables[0].Rows.Count - 1; i++) { MessageBox.Show(ds.Tables[0].Rows[i].ItemArray[0] + " -- " + ds.Tables[0].Rows[i].ItemArray[1]); } //retrieve second table data for (i = 0; i <= ds.Tables[1].Rows.Count - 1; i++) { MessageBox.Show(ds.Tables[1].Rows[i].ItemArray[0] + " -- " + ds.Tables[1].Rows[i].ItemArray[1]); } } catch (Exception ex) { MessageBox.Show("Can not open connection ! "); } 
 public DataSet GetDataSet() { try { DataSet dsReturn = new DataSet(); using (SqlConnection myConnection = new SqlConnection(Core.con)) { string query = "select * from table1; select* from table2"; SqlCommand cmd = new SqlCommand(query, myConnection); myConnection.Open(); SqlDataReader reader = cmd.ExecuteReader(); dsReturn.Load(reader, LoadOption.PreserveChanges, new string[] { "tableOne", "tableTwo" }); return dsReturn; } } catch (Exception) { throw; } } 

方法DataTable LoadDataReader上执行NextResult ,因此在使用Load时不应显式调用NextResult ,否则甚至可能会丢失表。

这是使用DataReader加载多个表的通用解决方案。

 // your command initialization code here // ... DataSet ds = new DataSet(); DataTable t; using (DbDataReader reader = command.ExecuteReader()) { while (!reader.IsClosed) { t = new DataTable(); t.Load(rs); ds.Tables.Add(t); } }