从SQLDataReader填充DataSet的最佳方法

9

我正在开发一个异步获取DataReader的DAL。

我想编写一个单独的方法来将DataReader转换为DataSet。它需要处理不同的架构,以便这个方法可以处理我所有的抓取需求。

附言:我正在异步地填充SQLDataReader,请不要提供删除DataReader的答案。


DataSet.Load()不好用吗?http://msdn.microsoft.com/en-us/library/5fd1ahe2.aspx - Matt Hamilton
其实我之前不知道这个选项。迫不及待地想看看 .Net 框架在第五版中会变得多么复杂等。 - Andrew Harry
我也是,谢谢你,马特! - Phaedrus
嗯,可能要将它作为实际答案发布,这样更容易被发现。 ;) - Matt Hamilton
1
最终放弃了这个东西,因为它太慢了。 我为每个实体使用一个IConverter接口,该接口直接将读取器读入元素中。 - Andrew Harry
3个回答

15

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

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

这是所问问题的答案。谢谢。 - mcNux

9

尝试使用DataSet.Load()。它有几个重载,可以接受一个IDataReader。


最终使用了一个 DataTable(其具有相同的方法)。 - Andrew Harry
2
它需要作为第三个参数的string[]或DataTable[]。是否有方法可以在不预先知道其模式的情况下填充最初为空的DataSet而无需任何表格? 此解决方案似乎部分阻塞,因为DataSet.Load()不能利用SqlDataReader的ReadAsync()和NextResultAsync()方法。 - KolA

0
如果由于某些原因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);

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接