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;
}