SqlBulkCopy 快速插入数据到SqlServer 数据库
程序员文章站
2022-05-21 18:10:18
...
向SQL Server中导入大量数量可以用bulk insert,但是必须要求 插入 的文件在 数据 库机器上或者一个 数据 库可以访问的共享文件夹中(我不知道怎么设置共享文件夹,以使得SQL Server能访问到) SqlBulkCopy 是.net中的一个类,提供了导入大量 数据 的功能。
向SQL Server中导入大量数量可以用bulk insert,但是必须要求插入的文件在数据库机器上或者一个数据库可以访问的共享文件夹中(我不知道怎么设置共享文件夹,以使得SQL Server能访问到)
SqlBulkCopy 是.net中的一个类,提供了导入大量数据的功能。
基本用法如下:
using (SqlBulkCopy bc = new SqlBulkCopy(sqlConn, SqlBulkCopyOptions.TableLock | SqlBulkCopyOptions.UseInternalTransaction, null)) { bc.BulkCopyTimeout = 10 * 60; bc.BatchSize = 10000; bc.DestinationTableName = "dbo.Destination"; bc.WriteToServer(reader); //reader 是一个继承自IDataReader的类的实例 }
自己可以写代码来实现继承自IDataReader的类。有n多成员要实现。。。
比如FieldCount, Read(), GetValue(int i), Close()等
下面是一个读文件的例子:
//返回记录的列数 public int FieldCount { get { return 3; } } //读记录,此方法会被自动调用 public bool Read() { if (_Reader == null) _Reader = new StreamReader(_FilePath); string line = _Reader.ReadLine(); if (line != null) { _CurrentQueryItem = GetRawData(line); _Count++; while (_CurrentQueryItem == null)//如果读出的是不满足条件的记录,则读下一条记录 { Read(); } return true; } return false; } //返回一条记录中第i 列(项)的值,此方法会被自动调用 //SqlBulkCopy内部应该有一个循环,从0到FieldCount -1 ,再调用GetValue(int i)这个方法。我猜的。。。 public object GetValue(int i) { if (_CurrentQueryItem == null) return null; switch (i) { //如果数据库中表的第一列是自增字段,则会忽略第一列,也就是说此方法被调用时,i只会从1开始,所以不需要case 0的情况。估计.net内部去取目的表的schema,自动判断哪些列是需要从外部导入的。有空再研究这个问题 case 0: return _CurrentQueryItem.Item1; case 1: return _CurrentQueryItem.Item2; case 2: return _CurrentQueryItem.Item3; default: throw new IndexOutOfRangeException(); } } //释放资源 public void Close() { Dispose(); } public void Dispose() { if (_Reader != null) _Reader.Close(); }
有一些其他属性其方法需要自己实现,当然有的不实现也没关系。似乎重要的就以上几个方法了。
对照SqlDataRead,自己可以猜想出会用到哪些方法。
经过实验,一个文件如果一行一行插入到数据库里,需要大约2分钟,如果用SqlBulkCopy 10秒左右就完成了。而且可以自己实现类来指定处理什么数据,也不用把文件放在数据库机器上了。不错。
忘说了,SqlBulkCopy里用到的connction对象只能是SqlConnection。SqlBulkCopy.WriteToServer (DataRow]) 和SqlBulkCopy.WriteToServer (DataTable) 都是可以的。
推荐阅读
-
Android批量插入数据到SQLite数据库的方法
-
通过Java实现批量导入数据到SQLServer数据库
-
通过创建SQLServer 2005到 Oracle10g 的链接服务器实现异构数据库数据转换方案
-
sqlserver数据库批量插入-SqlBulkCopy
-
Python实现读取SQLServer数据并插入到MongoDB数据库的方法示例
-
C#.NET中如何批量插入大量数据到数据库中
-
基于SQLServer数据库的SQL语言使用--插入数据
-
企业生产实践--生产环境批量插入百万数据到数据库几种实现方式(二)
-
将SQLServer的数据导入到Oracle数据库的方法
-
本地数据库(sql server)插入一条新数据时,同步到服务器数据库