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

新手上路,请多包涵

我正在尝试填充包含 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。

原文由 Andriy Zakharko 发布,翻译遵循 CC BY-SA 4.0 许可协议

阅读 539
2 个回答

如果您使用多个 select 语句发出单个命令,则可以使用 NextResult 方法移动到数据读取器中的下一个结果集: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;
}

原文由 smoothdeveloper 发布,翻译遵循 CC BY-SA 3.0 许可协议

Method Load of DataTable NextResult on the DataReader , so you shouldn’t call NextResult explicitly when using Load ,否则将省略序列中的奇数表。

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

 public static DataSet DataSetFromReader(IDataReader reader)
{
    DataSet ds = new DataSet();
    while (!reader.IsClosed)
    {
        DataTable t = new DataTable();
        t.Load(reader);
        ds.Tables.Add(t);
    }
    return ds;
}

原文由 Mario Vázquez 发布,翻译遵循 CC BY-SA 4.0 许可协议

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
logo
Stack Overflow 翻译
子站问答
访问
宣传栏