Ado.net怎么实现批量插入数据?

Ado.net怎么实现批量插入数据?,第1张

在做大批量数据插入的时候,如果用Insert into ... values (...)这种方式的话效率极低,这里介绍两种性能比较好的批量插入方法。 1. 使用SqlBulkCopyprivate static long SqlBulkCopyInsert(){Stopwatch stopwatch = new Stopwatch()stopwatch.Start()DataTable dataTable = GetTableSchema()string passportKeyfor (int i = 0i <counti++){passportKey = Guid.NewGuid().ToString()DataRow dataRow = dataTable.NewRow()dataRow[0] = passportKeydataTable.Rows.Add(dataRow)}SqlBulkCopy sqlBulkCopy = new SqlBulkCopy(connectionString)sqlBulkCopy.DestinationTableName = "Passport"sqlBulkCopy.BatchSize = dataTable.Rows.CountSqlConnection sqlConnection = new SqlConnection(connectionString)sqlConnection.Open()if (dataTable!=null &&dataTable.Rows.Count!=0){sqlBulkCopy.WriteToServer(dataTable)}sqlBulkCopy.Close()sqlConnection.Close()stopwatch.Stop()return stopwatch.ElapsedMilliseconds}使用SqlBulkCopy类进行数据插入其原理是采用了SQL Server的BCP协议进行数据的批量复制。这里我们先要建好一个DataTable(最好是通过DataAdapter来灌数据得到,因为这样出来的DataTable就已经有跟数据表相同的列定义,可以免去之后Mapping Column的步骤),把要插入的数据加进这个DataTable中,然后用SqlBulkCopy的实例来插入到数据库中。经过测试,SqlBulkCopy方法比直接用Sql语句插入数据的效率高出将近25倍。

C#和MS SQL交互使用的技术叫做 ADO.NET。 使用ADO.NET可以方便的对SQL SERVER 进行 *** 作。

(如果你对ADO.NET不了解,建议先MSDN一下)

批量插入数据,有两种方式,

1,数据比较复杂但是量不是很大,(这个大小的概念要视你的硬件、网络而定,一般在100万条以上才叫大)。

使用FOR循环进行插入, 即声明连接(conn.Open)然后进行遍历,

一条一条插入数据库(执行Insert语句),

一般来说,100W条数据,如果插入本机数据库的话, 耗时一般在40S-1分钟左右,

也可以在SqlServer中创建一个存储过程来执行Insert命令, 遍历时只需要调用存储过程即可,  存储过程的执行效率比Sql语句要高很多,因为不需要每次都编译。

100W条数据用存储过程来执行的话,一般耗时在20S左右,。

2数据量巨大,但是类型较简单,(一般指上百万条数据)

使用ADO.NET提供的BulkCopy,即批量导入,

语法:

 public static void BulkToDB(DataTable dt, string TableName)

        {

            SqlConnection sqlConn = new SqlConnection(

            ConfigurationManager.ConnectionStrings["dbconnstr"].ConnectionString)

            

            SqlBulkCopy bulkCopy = new SqlBulkCopy(sqlConn)

            bulkCopy.BulkCopyTimeout = 600

            bulkCopy.DestinationTableName = TableName

            bulkCopy.BatchSize = dt.Rows.Count

            try

            {

                sqlConn.Open()

                if (dt != null && dt.Rows.Count != 0)

                    bulkCopy.WriteToServer(dt)

            }

            catch (Exception ex)

            {

                throw ex

            }

            finally

            {

                sqlConn.Close()

                if (bulkCopy != null)

                    bulkCopy.Close()

            }

        }

需要传入一个DataTable,一个表名。 

这种方式速度非常快,同样100W条数据,本机导入,大概3-5秒就可以完成,

但是需要注意,传入的DataTable必须和Sql Server中的表结构一模一样,

比如你的表有3列,分别是Name, Age, Sex。  你传入的DataTable也必须是如此,所以这种方式只适合导入一些基础数据, 并不适合作为数据层的常用方法。

如果数据量巨大又要求很高的效率,更建议使用NoSql数据库

ls 写的方法也可以,但好像限定SQLserver

也可以使用DataAdapter

设置 dataadapter 的 selectCommand 和 updateCommand

dataadapter.fill(dataset,tablename)

for ...

new datarow

edit datarow

dataset.Tables("tablename").Rows.Add(datarow)

next

dataadapter.update(dataset)

凭记忆写的,

可能有些地方不准确


欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/bake/11663311.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2023-05-17
下一篇 2023-05-17

发表评论

登录后才能评论

评论列表(0条)

保存