我們在之前的一篇文章(http://www.cnblogs.com/liminzhang/archive/2006/10/20/534471.html)提到如何使用 SqlBulkCopy 對象來大量復制文字文件,當時所使用的程序語言是 Visual Basic 2005,有讀者希望提供 Visual C# 2005 的程序代碼。在此茲將程序代碼列示如下,請自行參考之:
// 匯入命名空間。
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();
}
}
}
}