前些日子,公司要求做一个数据导入程序,要求将Excel数据,大批量的导入到数据库中,尽量少的访问数据库,高性能的对数据库进行存储。于是在网上进行查找,发现了一个比较好的解决方案,就是采用SqlBulkCopy来处理存储数据。SqlBulkCopy存储大批量的数据非常的高效,就像这个方法的名字一样,可以将内存中的数据表直接的一次性的存储到数据库中,而不需要一次一次的向数据库Insert数据。初次实验,百万级别的数据表,也只需几秒时间内就可以完全的存入数据库中,其速度,比传统的Insert方法不止快很多倍
使用代码如下
先创建一个datatable
DataTable dt= new DataTable(); dt.Columns.Add("UserName", typeof(long)); dt.Columns.Add("Longitude", typeof(double)); dt.Columns.Add("Latitude", typeof(double)); dt.Columns.Add("Address", typeof(string));
然后向datatable添加100w数据
代码就不填写了
然后重头戏,批量添加数据
using (SqlConnection connection = new SqlConnection(ConfigurationManager.ConnectionStrings["ConnectionString"].ConnectionString)) { try { connection.Open(); //SqlBulkCopyOptions.KeepIdentity using (SqlBulkCopy bulkCopy = new SqlBulkCopy(connection.ConnectionString, SqlBulkCopyOptions.UseInternalTransaction, null)) { bulkCopy.DestinationTableName = 你的表明; bulkCopy.BatchSize = dt.Rows.Count; bulkCopy.BulkCopyTimeout = 12 * 60 * 60; bulkCopy.ColumnMappings.Add("UserName", "GridID"); bulkCopy.ColumnMappings.Add("Longitude", "Longitude"); bulkCopy.ColumnMappings.Add("Latitude", "Latitude"); bulkCopy.ColumnMappings.Add("Address", "Address"); bulkCopy.WriteToServer(dt); } } catch (Exception ex) { throw ex; } finally { if (connection != null && connection.State != ConnectionState.Closed) { connection.Close(); } } }
最后经过测试100w条数据,几秒就插入完毕,比传统的insert into不知道快了多少倍