sqlbulkcopy 转移大数据
2009-05-07 13:27
// 汇入命名空间。
using System; using System.Collections.Generic; using System.ComponentModel; using System.Data; using System.Drawing; using System.Text; using System.Windows.Forms; using System.Data.SqlClient; using System.Data.SqlTypes; using Microsoft.VisualBasic.FileIO; namespace VC测试项目 { public partial class Form4 : Form { public Form4() { InitializeComponent(); } private string[] currentRow; private int myRowCount = 1; private int myBatchCount = 1; private long myCopiedRows = 0; private long countStart; // 建立「章立民研究室」数据表,此处是当作一个中介数据表来使用。 private DataTable myTable = new DataTable("章立民工作室"); private void btnGoBulkCopy_Click(object sender, EventArgs e) { this.btnGoBulkCopy.Enabled = false; // 建立「员工编号」字段。 DataColumn colEmployeeId = myTable.Columns.Add("员工编号", Type.GetType("System.Int32")); // 建立「身份证字号」字段。 myTable.Columns.Add("身份证字号", Type.GetType("System.String")); myTable.Columns["身份证字号"].MaxLength = 10; myTable.Columns["身份证字号"].AllowDBNull = false; // 建立「姓名」字段。 myTable.Columns.Add("姓名", Type.GetType("System.String")); myTable.Columns["姓名"].MaxLength = 12; // 建立「性别」字段。 myTable.Columns.Add("性别", Type.GetType("System.String")); // myTable.Columns["性别"].MaxLength = 1; // 建立「地址」字段。 myTable.Columns.Add("地址", Type.GetType("System.String")); myTable.Columns["地址"].MaxLength = 41; // 建立「邮政编码」字段。 myTable.Columns.Add("邮政编码", Type.GetType("System.String")); myTable.Columns["邮政编码"].MaxLength = 5; // 建立「出生日期」字段。 myTable.Columns.Add("出生日期", Type.GetType("System.DateTime")); // 建立「婚姻状况」字段。 myTable.Columns.Add("婚姻状况", Type.GetType("System.String")); // 建立「雇用日期」字段。 myTable.Columns.Add("雇用日期", Type.GetType("System.DateTime")); // 建立「起薪」字段。 myTable.Columns.Add("起薪", Type.GetType("System.Double")); // 建立「目前薪资」字段。 myTable.Columns.Add("目前薪资", Type.GetType("System.Double")); // 建立「加薪日期」字段。 myTable.Columns.Add("加薪日期", Type.GetType("System.DateTime")); // 建立「部门」字段。 myTable.Columns.Add("部门", Type.GetType("System.String")); myTable.Columns["部门"].MaxLength = 10; using(TextFieldParser myReader = new TextFieldParser(@"Text/章立民工作 室.txt")) { // 表示文件内容是字符分隔。 myReader.TextFieldType = FieldType.Delimited; // 定义文字文件的字符分隔符。 myReader.Delimiters = new string[] {","}; // 循环处理文字文件中所有数据列的所有字段。 while(!myReader.EndOfData) { try { currentRow = myReader.ReadFields(); // 略过标题列 if(myRowCount > 1) { myTable.Rows.Add(currentRow); } } catch(MalformedLineException ex) { MessageBox.Show(ex.Message); return; } myRowCount += 1; this.lblBeingCopyedTextRows.Text = myTable.Rows.Count.ToString(); this.lblBeingCopyedTextRows.Refresh(); if(myTable.Rows.Count == 50000) { try { GoBulkCopy(); } catch(Exception ex) { MessageBox.Show(ex.Message); return; } // 清空资料表。 myTable.Rows.Clear(); myBatchCount += 1; } } // 复制最后一批不足50000 笔的数据记录。 if(myTable.Rows.Count > 0) { GoBulkCopy(); } } this.lblBeingCopyedTextRows.Text = myTable.Rows.Count.ToString(); this.lblTextFileRowCount.Text = "来源文字文件的数据笔数:" + (myRowCount - 2).ToString(); this.btnGoBulkCopy.Enabled = true; } private void GoBulkCopy() { // 利用SqlConnectionStringBuilder 对象来构建连接字符串。 // 由于本范例是在同一个SQL Server 数据库的不同数据表之间进行大量复 // 制作业,因此连接至来源数据库与连接至目标服务器的连接字符串是相同的。 SqlConnectionStringBuilder sqlconStringBuilder = new SqlConnectionStringBuilder(); sqlconStringBuilder.DataSource = @"(local)/SQLExpress"; sqlconStringBuilder.InitialCatalog = "北风贸易"; sqlconStringBuilder.IntegratedSecurity = true; // 建立连结至目标SQL Server 数据库的连接。 using(SqlConnection con_bulkcopy = new SqlConnection(sqlconStringBuilder.ConnectionString)) { // 开启连接至目标SQL Server 的连接。 con_bulkcopy.Open(); SqlCommand cmdRowCount = new SqlCommand( "SELECT COUNT(*) FROM dbo.Bulk_Target_章立民工作室;", con_bulkcopy); if(myBatchCount == 1) { // 计算出目标数据表在执行大量复制作业前有多少笔数据记录。 countStart = System.Convert.ToInt32(cmdRowCount.ExecuteScalar()); this.lblRowsCountBeforeBulkCopy.Text = "目标数据表在大量复制前拥有的数据笔数= " + countStart.ToString(); this.lblRowsCountBeforeBulkCopy.Refresh(); } // 建立一个SqlBulkCopy 对象以便执行大量复制作业。 using(SqlBulkCopy bcp = new SqlBulkCopy(con_bulkcopy)) { // 指定目标数据表的名称。 bcp.DestinationTableName = "dbo.Bulk_Target_章立民工作室"; // 如果来源数据表与目标数据表的各个字段顺序没有完全对应, // 必须在此设定来源字段与目标字段的对应关系。 // 将来源数据写入目标数据表。 bcp.WriteToServer(myTable); } // 最后再计算出大量复制了多少笔数据记录。 long countEnd = System.Convert.ToInt32(cmdRowCount.ExecuteScalar()); // 计算出累计复制笔数。 myCopiedRows = countEnd - countStart; // 显示出批次与大量复制累计笔数。 this.DataGridView1.Rows.Add( new string[] { Convert.ToString(myBatchCount), Convert.ToString(myCopiedRows)}); this.DataGridView1.Refresh(); } } } |