您的位置:首页 > 数据库

使用 SqlBulkCopy 大量复制文字文件之 C# 程序代码

2006-12-25 09:47 836 查看
我们在之前的一篇文章(/article/4743866.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();
}
}
}
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: