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

我们在之前的一篇文章( [url]http://www.cnblogs.com/liminzhang/archive/2006/10/20/534471.html[/url] )提到如何使用 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();
            }
        }
    }
}

本文出自 “章立民” 博客,转载请与作者联系!

你可能感兴趣的:(数据库,C#,休闲,SqlBulkCopy,程序代码)