IDataReader如何快速转成DataTable?

IDataReader如何快速转成DataTable?
由于某些原因,不能使用IDbDataAdapter的Fill方法拿到DataSet,于是自己使用ExecuteReader拿到IDataReader并一行一行塞入DataTable,这样速度很慢。经过测试,拿到2W条数据,IDbDataAdapter.Fill()只需要12秒,而我自己转需要120秒+。网上看了下Fill的底层也是先执行ExecuteReader拿到IDataReader,再去转换成DataTable,但是我不明白它具体怎么做到这么快的。
需求:需要一个快速将IDataReader转成DataTable的方法,最好的情况是能跟Fill方法持平,或者直接能使用到Fill底层的转换方法。(网上的方法能搜到的都试过了,还是很慢)

小魔女参考了bing和GPT部分内容调写:
使用IDataReader转换DataTable的快速方法,可以使用Load方法,它可以将IDataReader的数据快速加载到DataTable中,而不用一行一行的去填充,这样可以提高转换的效率。

下面是一个示例代码:

DataTable dt = new DataTable();
using (IDataReader reader = command.ExecuteReader())
{
    dt.Load(reader);
}

Load方法可以将IDataReader中的数据快速加载到DataTable中,而不用一行一行的去填充,这样可以提高转换的效率,达到和IDbDataAdapter Fill()方法持平的效果。
回答不易,记得采纳呀。

该回答引用GPTᴼᴾᴱᴺᴬᴵ
您可以考虑使用一些第三方库来快速将IDataReader转换为DataTable,例如FastMember和Dapper。这些库能够以非常高效的方式将IDataReader转换为DataTable。以下是使用FastMember和Dapper的示例代码:

使用FastMember:

using FastMember;

public static DataTable ToDataTable(IDataReader reader)
{
    var table = new DataTable();
    var accessor = TypeAccessor.Create(reader.GetType());

    for (int i = 0; i < reader.FieldCount; i++)
    {
        table.Columns.Add(reader.GetName(i), reader.GetFieldType(i));
    }

    while (reader.Read())
    {
        var row = table.NewRow();

        for (int i = 0; i < reader.FieldCount; i++)
        {
            row[i] = accessor[reader, i];
        }

        table.Rows.Add(row);
    }

    return table;
}


使用Dapper:

using Dapper;

public static DataTable ToDataTable(IDataReader reader)
{
    var table = new DataTable();
    table.Load(reader);
    return table;
}


这两个示例都可以快速将IDataReader转换为DataTable,具体使用哪个取决于您的喜好和项目需要。

除了MarkHan_所说的方法外,你还可以尝试使用SqlBulkCopy类
可以使用SqlBulkCopy类将IDataReader的数据快速地批量插入到数据库中,也可以使用它来将IDataReader的数据批量复制到DataTable中。

以下是示例代码:

public static DataTable ConvertDataReaderToDataTable(IDataReader dataReader)
{
    DataTable dataTable = new DataTable();

    using (SqlBulkCopy bulkCopy = new SqlBulkCopy("yourConnectionString"))
    {
        bulkCopy.DestinationTableName = "tempTable";

        bulkCopy.WriteToServer(dataReader);

        dataTable.Load(dataReader);
    }

    return dataTable;
}