在.Net1.1中无论是对于批量插入整个DataTable中的所有数据到数据库中,还是进行不同数据源之间的迁移,都不是很方便。而 在.Net2.0中,SQLClient命名空间下增加了几个新类帮助我们通过DataTable或DataReader批量迁移数据。数据源可以来自关 系数据库或者XML文件,甚至WebService返回结果。其中最重要的一个类就是SqlBulkCopy类,使用它可以很方便的帮助我们把数据源的数 据迁移到目标数据库中。
1 public classQueue2 {3 public Queue(string content, QueueType type, stringofficeNumber)4 {5 Content =content;6 Type =type;7 OfficeNumber =officeNumber;8 }9
10 public Queue(DateTime proccessTime, int internalNumber, string content, QueueType type, stringofficeNumber)11 {12 ProcessTime =proccessTime;13 InternalNumber =internalNumber;14 Content =content;15 Type =type;16 OfficeNumber =officeNumber;17 }18
19 ///
20 ///处理时间21 ///
22 public DateTime ProcessTime { get; set; }23 ///
24 ///内部编号25 ///
26 public int InternalNumber { get; set; }27 ///
28 ///内容29 ///
30 public string Content { get; set; }31 ///
32 ///信箱类型33 ///
34 public QueueType Type { get; set; }35 ///
36 ///代理人编号37 ///
38 public string OfficeNumber { get; set; }39
40 ///
41 ///判断给出的内容字串是否是有效的信件内容;42 ///
43 ///
44 ///
45 public static bool Validate(string queueContent, stringofficNumber)46 {47 returnqueueContent.Contains(officNumber);48 }49 }
实体
1 privateDataTable GetTableSchema()2 {3 var dataTable = newDataTable();4 dataTable.Columns.AddRange(new[]5 {6 new DataColumn("ProcessTime"),7 new DataColumn("InternalNumber"),8 new DataColumn("Content"),9 new DataColumn("Type"),10 new DataColumn("OfficeNumber"),11 });12 returndataTable;13 }
创建DataTable
1 public int Add(System.Collections.Generic.Listqueues)2 {3 int rowCount = 0;4 var dataTable =GetTableSchema();5
6 foreach (var queue inqueues)7 {8 DataRow dataRow =dataTable.NewRow();9 dataRow[0] =queue.ProcessTime;10 dataRow[1] =queue.InternalNumber;11 dataRow[2] =queue.Content;12 dataRow[3] =queue.Type;13 dataRow[4] =queue.OfficeNumber;14 dataTable.Rows.Add(dataRow);15 }16
17 using (var sqlConnection = newSqlConnection(ConnectionString))18 {19 sqlConnection.Open();20 using (var sqlBulkCopy = newSqlBulkCopy(sqlConnection))21 {22 sqlBulkCopy.DestinationTableName = "History.Queues";23 sqlBulkCopy.BatchSize =dataTable.Rows.Count;24 if (sqlBulkCopy.BatchSize != 0)25 {26 sqlBulkCopy.WriteToServer(dataTable);27 rowCount =sqlBulkCopy.BatchSize;28 }29 }30 }31
32 returnrowCount;33 }
批量操作
代码分析:
var sqlBulkCopy = new SqlBulkCopy(sqlConnection)
先生成SqlBulkCopy 实例,构造函数指定了目标数据库,使用sqlConnection链接创建
sqlBulkCopy.WriteToServer(dataTable);
rowCount = sqlBulkCopy.BatchSize;
rowCount 属性指定通知通知事件前处理的数据行数
WriteToServer方法就是将数据源拷备到目标数据库。在使用WriteToServer方法之前必须先指定 DestinationTableName属性,也就是目标数据库的表名,