【C#】 List类型存储大量数据时,使用 SqlBulkCopy 以提高性能
序言
在大多数情况下,使用List类型时,
会通过 "SqlBulkCopy "将数据保存到数据库。
也可以一次插入一条记录,但处理大量数据需要时间,因此 "SqlBulkCopy "是您需要记住的一种方法。
使用SqlBulkCopy时的准备
使用 SqlBulkCopy 的步骤如下。
将列表转换为数据表
使用 SqlBulkCopy.WriteToServer 保存它
这似乎很容易做到。
将List转换为Table
public static DataTable ToDataTable(this List data) { var properties = TypeDescriptor.GetProperties(typeof(T)); var table = new DataTable(); foreach(PropertyDescriptor prop in properties) { table.Columns.Aadd(prop.Name, Nullable.GetUnderlyingType(prop.PropertyType) ?? prop.PropertyType); } foreach(T item in data) { var row = table.NewRow(); foreach(PropertyDescriptor prop in properties) { row[prop.Name] = prop.GetValue(item) ?? DBNull.Value; table.Rows.Add(row); } } return table;
顺便提一下,如果 List 类型的属性名称与表格的列名称不同,则必须重新设置 Datatable 中的列。
List infoList = new List() { id = 1, infoName = “test” } DataTable table = new Datatable(“SampleTable”); table.Columns.Add(new Datacolumn(“id”,typeof(int))); table.Columns.Add(new Datacolumn(“name”,typeof(string))); foreach(Info target in infoList) { table.Rows.Add(target.id, target.infoName);
通过SqlBulkCoppy.WriteToServer进行数据保存
string connectionString = “Data Source=SampleDB\\SQLExPRESS;Initial Catalog=SampleTable;User ID=sa;Password=P@ssw0rd”; using(SqlBulkCopy bulkCopy = new SqlBulkCopy(connecttionS)) { bulkCopy.BulkCopyTimeout = 600; bulkCopy.DestinationTableName = “SampleTable”; bulkCopy.WriteToServer(table); }
在运行时,当一个事务被t提交时,会出现错误信息 "Existing transaction is unexpected."。 的错误信息,可以使用
connection.Open(); using(var tran = connection.BeginTransaction(IsolationLevel.ReadCommitted)) { using(SqlBulkCopy bulkCopy = new SqlBulkCopy(connection, SqlBulkCopyOptions.Default, tran)) { bulkCopy.BulkCopyTimeout = 600; bulkCopy.DestinationTableName = “SampleTable”; bulkCopy.WrieToServer(table); } tran.Commit(); }
总结
可以实现SqlBulkCopy 了。
当使用大量数据时,最好使用 SqlBulkCopy,但当数据量较小时,最好使用 Insert。
根据不同的使用情况使用不同的方法。
本作品采用 知识共享署名-非商业性使用 2.5 中国大陆许可协议进行许可。 |