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

And*_*rko 19 c# sql ado.net datareader dataset

我正在尝试填充包含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;
    }
Run Code Online (Sandbox Code Playgroud)

但我只填了一张桌子.我如何实现目标 - 填写两个表格?

如果可能的话,我想使用DataReader而不是DataAdapter.

Moh*_*ari 28

使用多个表填充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);
Run Code Online (Sandbox Code Playgroud)

  • @Iman - 如果您按照示例将 SQL 发送到服务器,则可能没有必要,但如果您调用存储过程并返回多个 SELECT,则可能没有必要。这个答案对我非常有用 (5认同)
  • 添加TableMappings.Add不是neccassarry (4认同)

smo*_*per 21

如果要发出包含多个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;
}
Run Code Online (Sandbox Code Playgroud)

  • 你可以做`result.Load(reader)`.`Load`方法将处理多个结果集. (8认同)

Cul*_*tes 8

这是一个古老的话题,但对某些人来说可能有用:

        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"]);
        }
Run Code Online (Sandbox Code Playgroud)