zoukankan      html  css  js  c++  java
  • SqlBulkCopy批量复制

    一、概述

    SqlBulkCopy提供了一种将数据复制到Sql Server数据库表中高性能的方法。SqlBulkCopy 包含一个方法 WriteToServer,它用来从数据的源复制数据到数据的目的地。 WriteToServer方法可以处理的数据类型有DataRow[]数组,DataTable 和 DataReader。 你可以根据不同的情形使用不同的数据类型。SqlBulkCopy其原理是采用了SQL Server的BCP协议进行数据的批量复制。

    二、表数据复制

    1、数据表to数据表

    将Pubs数据库的stores表中的资料复制到Northwind数据库的store表中,这两个表结构相同。

    using System.Data;
    using System.Data.SqlClient;
    using System.Configuration;
            /// <summary>
            /// 数据库中的表复制到另一个数据库中的表
            /// </summary>
            private void SqlBulkCopyMethod()
            {
                try
                {
                    SqlConnection connetionPub = new SqlConnection(ConfigurationManager.ConnectionStrings["PubsDB"].ConnectionString);
                    using (connetionPub)
                    {
                        SqlCommand commandPub = connetionPub.CreateCommand();
                        using (commandPub)
                        {
                            commandPub.CommandText = "select * from stores";
                            commandPub.CommandType = System.Data.CommandType.Text;
                            connetionPub.Open();
    
                            SqlConnection connectionBulkCopy =new SqlConnection(ConfigurationManager.ConnectionStrings["NorthwindDB"].ConnectionString);
                            using (connectionBulkCopy)
                            {
                                connectionBulkCopy.Open();
                                SqlDataReader dataReader = commandPub.ExecuteReader();
                                SqlBulkCopy bulkCopy = new SqlBulkCopy(connectionBulkCopy);
                                using (bulkCopy)
                                {
                                    bulkCopy.DestinationTableName = "store";
                                    bulkCopy.WriteToServer(dataReader);
                                }
                            }
                        }
                    }
    
                }
                catch (Exception ex)
                {
                    throw ex;
                }
            }

    2、DataTable to 数据表

    using System.Data;
    using System.Data.SqlClient;
    using System.Configuration;
            /// <summary>
            /// 将表中资料批量插入到数据库
            /// 转自:http://www.cnblogs.com/mrliuc/archive/2011/01/18/1938271.html
            /// </summary>
            /// <param name="connectionString"></param>
            /// <param name="TableName"></param>
            /// <param name="dt"></param>
            private void SqlBulkCopyByDatatable(string connectionString, string TableName, DataTable dt)
            {
                using (SqlConnection conn = new SqlConnection(connectionString))
                {
                    using (SqlBulkCopy sqlbulkcopy = new SqlBulkCopy(connectionString, SqlBulkCopyOptions.UseInternalTransaction))
                    {
                        try
                        {
                            sqlbulkcopy.DestinationTableName = TableName;
                            for (int i = 0; i < dt.Columns.Count; i++)
                            {
                                sqlbulkcopy.ColumnMappings.Add(dt.Columns[i].ColumnName, dt.Columns[i].ColumnName);
                            }
                            sqlbulkcopy.WriteToServer(dt);
                        }
                        catch (System.Exception ex)
                        {
                            throw ex;
                        }
                    }
                }
            }

    3、XML to 数据表

    数据源并不局限于数据库的表,你也可以使用XML文件做数据源。 这里有一个非常简单的使用XML文件做数据源进行批量复制操作的例子。
    <?xml version="1.0" encoding="utf-8" ?>
    <Products>
      <Product productID="1" productName="Chai" />
      <Product productID="2" productName="Football" />
      <Product productID="3" productName="Soap" />
      <Product productID="4" productName="Green Tea" />
    </Products>
    /// <summary>
            /// 使用XML作为数据源
            /// </summary>
            private static void PerformBulkCopyXMLDataSource()
            {
                string connectionString = @"Server=localhost;Database=Northwind;Trusted_Connection=true";
    
                DataSet ds = new DataSet();
                DataTable sourceData = new DataTable();
                ds.ReadXml(@"C:Products.xml");
                sourceData = ds.Tables[0];
                // 目的 
                using (SqlConnection destinationConnection = new SqlConnection(connectionString))
                {
                    // 打开连接 
                    destinationConnection.Open();
                    using (SqlBulkCopy bulkCopy = new SqlBulkCopy(destinationConnection.ConnectionString))
                    {
                        // 列映射
                        bulkCopy.ColumnMappings.Add("productID", "ProductID");
                        bulkCopy.ColumnMappings.Add("productName", "Name");
    
                        bulkCopy.DestinationTableName = "Products_TopSelling";
                        bulkCopy.WriteToServer(sourceData);
                    }
                }
            }

    首先把XML文件读进DataTable,然后再使用SqlBulkCopy类的WriteToServer方法。 因为目的表示是Products_TopSelling,所以我们必须执行列映射。

  • 相关阅读:
    Convolutional Neural Network-week1编程题(一步步搭建CNN模型)
    Coursera Deep Learning笔记 卷积神经网络基础
    爬取b站周杰伦新歌mv弹幕 绘制词云
    Coursera Deep Learning笔记 结构化机器学习项目 (下)
    Golang-执行go get私有库提示”410 Gone“ 解决办法
    golang常用的http请求操作
    关于asyncio知识(四)
    关于asyncio知识(二)
    Python Every Class Needs a __repr__
    关于asyncio知识(一)
  • 原文地址:https://www.cnblogs.com/qtiger/p/5692120.html
Copyright © 2011-2022 走看看