【问题标题】:Best method for Populating DataSet from a SQLDataReader从 SQLDataReader 填充数据集的最佳方法
【发布时间】:2010-10-05 08:09:48
【问题描述】:

我正在处理异步获取 DataReader 的 DAL。

我想编写一个将 DataReader 转换为 DataSet 的方法。它需要处理不同的模式,以便这个方法可以处理我所有的获取需求。

附:我正在异步填充 SQLDataReader,请不要给出摆脱 DataReader 的答案。

【问题讨论】:

  • DataSet.Load() 不好用吗? msdn.microsoft.com/en-us/library/5fd1ahe2.aspx
  • 其实我不知道这个选项。迫不及待想看看 .Net 框架在第 5 版等中会有多复杂
  • 我也是,谢谢马特!
  • 嗯。可能会将其作为实际答案发布,以便更容易发现。 ;)
  • 最终放弃了这个,因为它太慢了。我为每个实体使用了一个 IConverter 接口,它直接将阅读器读入元素

标签: sql dataset sqldatareader


【解决方案1】:

试试DataSet.Load()。它有几个采用 IDataReader 的重载。

【讨论】:

  • 最终使用了DataTable(方法相同)
  • 它需要 string[] 或 DataTable[] 作为第三个参数。有没有办法在不事先知道其模式的情况下填充最初没有表的空 DataSet?看起来这个解决方案是部分阻塞的,因为 DataSet.Load() 不会利用 SqlDataReader 的 ReadAsync() 和 NextResultAsync() 方法
【解决方案2】:

DataTable.load() 可用于通用方法。

do {
    var table = new DataTable();
    table.Load(reader);
    dataset.Tables.Add(table);
} while(!reader.IsClosed);

【讨论】:

  • 这是对所提问题的回答。谢谢。
【解决方案3】:

如果由于某种原因 Load 方法失​​败,这里有一个手动方法:

                    DataTable dt = new DataTable();
                    dt = sdr.GetSchemaTable();
                    //dt.Constraints.Clear();
                    //dt.PrimaryKey = null;
                    //dt.BeginLoadData();
                    if (sdr.HasRows)
                    {
                        DataRow row;
                        while (sdr.Read())
                        {
                            row = dt.NewRow();
                            sdr.GetValues(row.ItemArray);
                            dt.Rows.Add(row);
                        }

另一种方法是使用SqlTableAdapter:

var adapter = new SqlDataAdapter(command);
DataSet ds = new DataSet();
adapter.Fill(ds);

【讨论】:

    猜你喜欢
    • 2020-01-08
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-05-19
    • 2021-06-16
    • 2016-11-01
    • 2012-04-04
    • 1970-01-01
    相关资源
    最近更新 更多