用SqlBulkCopy批量插入数据到SqlServer数据库表中

首先创建一个数据库连接类:SQLHelper

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Data.SqlClient;
using System.Data;

namespace insetData
{
   public  class SQLHelper
    {
       public static readonly string Strconn = "Data Source=LocalHost;database=CardID;uid=sa;pwd=123";

        /// <summary>

        /// 创建SqlConnection对象

        /// </summary>

        /// <returns></returns>

        public static SqlConnection sqlConn()
        {

            return new SqlConnection(Strconn);

        }

        /// <summary>
        /// SQLServer批量插入数据功能
        /// 这是SQLServer特有的功能,故不再上层抽象类中编写
        /// </summary>
        /// <param name="dt">数据表</param>

        /// <param name="tableName">表名称</param>

        public static void BulkInsert(SqlConnection conn, DataTable dt, string tableName)
        {

            if (string.IsNullOrEmpty(tableName))
            {

                throw new ArgumentNullException("请指定需要插入的数据表");

            }

            var count = dt.Rows.Count;

            if (count == 0)
            {

                return;

            }

            if (conn.State == ConnectionState.Closed)
            {

                conn.Open();

            }

            //SqlBulkCopy用其他源的数据有效批量加载 SQL Server 表

            using (SqlBulkCopy copy = new SqlBulkCopy(conn))
            {

                copy.BatchSize = dt.Rows.Count;//每一批次中的行数。在每一批次结束时,将该批次中的行发送到服务器。 

                copy.DestinationTableName = tableName;//指定目标表

                copy.WriteToServer(dt);//将dt中的所有行复制到SqlBulkCopy对象的DestinationTableName指定的目标表中

                conn.Close();
                conn.Dispose();

            }

        }

        /// <summary>
        /// 创建数据表
        /// </summary>
        /// <param name="columns"></param>

        public static DataTable CreateTable(IList<string> columns)
        {
            var dt = new DataTable();
            foreach (var c in columns)
            {
                dt.Columns.Add(c);
            }

            return dt;

        }
        /// <summary>
        /// 批量插入数据
        /// </summary>
        /// <param name="tableName">数据表</param>
        /// <param name="columns">字段</param>
        /// <param name="dataList">数据列表</param>
        /// <param name="action">具体操作</param>

        public static void CreateInner<T>(SqlConnection conn, string tableName, IList<string> columns, IList<T> dataList, Action<DataRowWaper, T, int> action)
        {
            if (string.IsNullOrEmpty(tableName))
            {
               throw new ArgumentNullException("需要指定操作的数据表");
            }

            if (columns == null || columns.Count == 0)
            {
                throw new ArgumentNullException("数据表列不能为空");
            }

            var dt = CreateTable(columns);

            if (action != null)
            {
                for (var i = 0; i < dataList.Count; i++)
                {
                    var wapper = new DataRowWaper(dt.NewRow());
                    action(wapper, dataList[i], i);
                    dt.Rows.Add(wapper.Row);

                }
            }

            BulkInsert(conn, dt, tableName);

        }
    }
}

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Data.SqlClient;
using System.Data;

namespace insetData
{
   public  class SQLHelper
    {
       public static readonly string Strconn = "Data Source=LocalHost;database=CardID;uid=sa;pwd=123";

        /// <summary>

        /// 创建SqlConnection对象

        /// </summary>

        /// <returns></returns>

        public static SqlConnection sqlConn()
        {

            return new SqlConnection(Strconn);

        }

        /// <summary>
        /// SQLServer批量插入数据功能
        /// 这是SQLServer特有的功能,故不再上层抽象类中编写
        /// </summary>
        /// <param name="dt">数据表</param>

        /// <param name="tableName">表名称</param>

        public static void BulkInsert(SqlConnection conn, DataTable dt, string tableName)
        {

            if (string.IsNullOrEmpty(tableName))
            {

                throw new ArgumentNullException("请指定需要插入的数据表");

            }

            var count = dt.Rows.Count;

            if (count == 0)
            {

                return;

            }

            if (conn.State == ConnectionState.Closed)
            {

                conn.Open();

            }

            //SqlBulkCopy用其他源的数据有效批量加载 SQL Server 表

            using (SqlBulkCopy copy = new SqlBulkCopy(conn))
            {

                copy.BatchSize = dt.Rows.Count;//每一批次中的行数。在每一批次结束时,将该批次中的行发送到服务器。 

                copy.DestinationTableName = tableName;//指定目标表

                copy.WriteToServer(dt);//将dt中的所有行复制到SqlBulkCopy对象的DestinationTableName指定的目标表中

                conn.Close();
                conn.Dispose();

            }

        }

        /// <summary>
        /// 创建数据表
        /// </summary>
        /// <param name="columns"></param>

        public static DataTable CreateTable(IList<string> columns)
        {
            var dt = new DataTable();
            foreach (var c in columns)
            {
                dt.Columns.Add(c);
            }

            return dt;

        }
        /// <summary>
        /// 批量插入数据
        /// </summary>
        /// <param name="tableName">数据表</param>
        /// <param name="columns">字段</param>
        /// <param name="dataList">数据列表</param>
        /// <param name="action">具体操作</param>

        public static void CreateInner<T>(SqlConnection conn, string tableName, IList<string> columns, IList<T> dataList, Action<DataRowWaper, T, int> action)
        {
            if (string.IsNullOrEmpty(tableName))
            {
               throw new ArgumentNullException("需要指定操作的数据表");
            }

            if (columns == null || columns.Count == 0)
            {
                throw new ArgumentNullException("数据表列不能为空");
            }

            var dt = CreateTable(columns);

            if (action != null)
            {
                for (var i = 0; i < dataList.Count; i++)
                {
                    var wapper = new DataRowWaper(dt.NewRow());
                    action(wapper, dataList[i], i);
                    dt.Rows.Add(wapper.Row);

                }
            }

            BulkInsert(conn, dt, tableName);

        }
    }
}

其次创建DataRowWaper类

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Data;

namespace insetData
{
  public  class DataRowWaper
    {
        private DataRow row = null;

        public DataRowWaper(DataRow row)
        {

            this.row = row;

        }

        public DataRow Row
        {

            get
            {

                return this.row;

            }

        }

        public object this[DataColumn column]
        {

            get
            {

                return this.row[column];

            }

            set
            {

                this.row[column] = value;

            }

        }

        public object this[int columnIndex]
        {

            get
            {

                return this.row[columnIndex];

            }

            set
            {

                this.row[columnIndex] = value;

            }

        }

        public object this[string columnName]
        {

            get
            {

                return this.row[columnName];

            }

            set
            {

                this.row[columnName] = value;

            }

        }

        public void SetValue(string key, object value)
        {

            this.row[key] = value;

        }
    }
}

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Data;

namespace insetData
{
  public  class DataRowWaper
    {
        private DataRow row = null;

        public DataRowWaper(DataRow row)
        {

            this.row = row;

        }

        public DataRow Row
        {

            get
            {

                return this.row;

            }

        }

        public object this[DataColumn column]
        {

            get
            {

                return this.row[column];

            }

            set
            {

                this.row[column] = value;

            }

        }

        public object this[int columnIndex]
        {

            get
            {

                return this.row[columnIndex];

            }

            set
            {

                this.row[columnIndex] = value;

            }

        }

        public object this[string columnName]
        {

            get
            {

                return this.row[columnName];

            }

            set
            {

                this.row[columnName] = value;

            }

        }

        public void SetValue(string key, object value)
        {

            this.row[key] = value;

        }
    }
}

映射到数据库对象表信息People

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;

namespace insetData
{
   public class People
    {
       public int id { get; set;}
       public string uname { get; set; }
       public string era { get; set; }
       public string amount { get; set; }
    }
}

  

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;

namespace insetData
{
   public class People
    {
       public int id { get; set;}
       public string uname { get; set; }
       public string era { get; set; }
       public string amount { get; set; }
    }
}

批量操作数据

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Data;
using System.Diagnostics;
using System.Data.SqlClient;

namespace insetData
{
    class Program
    {
        static void Main(string[] args)
        {

            //构造的数据源
            List<People> list = new List<People>() 

            {
                new People(){ uname="张亮",era="中年",amount="100000"},

                new People(){ uname="天天",era="年轻",amount="233233"},

                new People(){ uname="kimi",era="年轻",amount="455631"}

             };

            //列名称
            var lists = new[] { "id", "uname", "era", "amount" };

            ////构建DataTable

            //DataTable dt = new DataTable();
            //foreach (var item in lists)
            //{
            //    dt.Columns.Add(item, item.GetType());
            //}

            //for (int i = 0; i < list.Count; i++)
            //{
            //    DataRow newRow = dt.NewRow();
            //   newRow["uname"] = list[i].uname;
            //    newRow["era"] = list[i].era;
            //    newRow["amount"] = list[i].amount;
            //   dt.Rows.Add(newRow);

            //}

            ////批量插入

            //SQLHelper.BulkInsert(SQLHelper.sqlConn(), dt, "Tb_People");
            //上面这段代码是直接构造的DataTable

            SQLHelper.CreateInner<People>(SQLHelper.sqlConn(), "Tb_People", lists, list,

               (curow, People, i) =>
               {

                   curow["id"] = People.id;

                   curow["uname"] = People.uname;

                   curow["era"] = People.era;

                   curow["amount"] = People.amount;

               }
               );

        }

    }
}

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Data;
using System.Diagnostics;
using System.Data.SqlClient;

namespace insetData
{
    class Program
    {
        static void Main(string[] args)
        {

            //构造的数据源
            List<People> list = new List<People>() 

            {
                new People(){ uname="张亮",era="中年",amount="100000"},

                new People(){ uname="天天",era="年轻",amount="233233"},

                new People(){ uname="kimi",era="年轻",amount="455631"}

             };

            //列名称
            var lists = new[] { "id", "uname", "era", "amount" };

            ////构建DataTable

            //DataTable dt = new DataTable();
            //foreach (var item in lists)
            //{
            //    dt.Columns.Add(item, item.GetType());
            //}

            //for (int i = 0; i < list.Count; i++)
            //{
            //    DataRow newRow = dt.NewRow();
            //   newRow["uname"] = list[i].uname;
            //    newRow["era"] = list[i].era;
            //    newRow["amount"] = list[i].amount;
            //   dt.Rows.Add(newRow);

            //}

            ////批量插入

            //SQLHelper.BulkInsert(SQLHelper.sqlConn(), dt, "Tb_People");
            //上面这段代码是直接构造的DataTable

            SQLHelper.CreateInner<People>(SQLHelper.sqlConn(), "Tb_People", lists, list,

               (curow, People, i) =>
               {

                   curow["id"] = People.id;

                   curow["uname"] = People.uname;

                   curow["era"] = People.era;

                   curow["amount"] = People.amount;

               }
               );

        }

    }
}

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Data;
using System.Diagnostics;
using System.Data.SqlClient;

namespace insetData
{
    class Program
    {
        static void Main(string[] args)
        {

            //构造的数据源
            List<People> list = new List<People>() 

            {
                new People(){ uname="张亮",era="中年",amount="100000"},

                new People(){ uname="天天",era="年轻",amount="233233"},

                new People(){ uname="kimi",era="年轻",amount="455631"}

             };

            //列名称
            var lists = new[] { "id", "uname", "era", "amount" };

            ////构建DataTable

            //DataTable dt = new DataTable();
            //foreach (var item in lists)
            //{
            //    dt.Columns.Add(item, item.GetType());
            //}

            //for (int i = 0; i < list.Count; i++)
            //{
            //    DataRow newRow = dt.NewRow();
            //   newRow["uname"] = list[i].uname;
            //    newRow["era"] = list[i].era;
            //    newRow["amount"] = list[i].amount;
            //   dt.Rows.Add(newRow);

            //}

            ////批量插入

            //SQLHelper.BulkInsert(SQLHelper.sqlConn(), dt, "Tb_People");
            //上面这段代码是直接构造的DataTable

            SQLHelper.CreateInner<People>(SQLHelper.sqlConn(), "Tb_People", lists, list,

               (curow, People, i) =>
               {

                   curow["id"] = People.id;

                   curow["uname"] = People.uname;

                   curow["era"] = People.era;

                   curow["amount"] = People.amount;

               }
               );

        }

    }
}

时间: 2024-10-04 01:59:22

用SqlBulkCopy批量插入数据到SqlServer数据库表中的相关文章

.Net批量插入数据到SQLServer数据库,SqlBulkCopy类批量插入大数据到数据库

批量的的数据导入数据库中,尽量少的访问数据库,高性能的对数据库进行存储. 采用SqlBulkCopy来处理存储数据.SqlBulkCopy存储大批量的数据非常的高效,将内存中的数据表直接的一次性的存储到数据库中,而不需要一次一次的向数据库Insert数据. 经过几次实验,百万级别的数据表,也只需几秒时间内就可以完全的存入数据库中,其速度,比传统的Insert into方法不止快很多倍. 下面看代码: /// <summary> /// 批量插入数据 /// </summary> /

C#_批量插入数据到Sqlserver中的四种方式

先创建一个用来测试的数据库和表,为了让插入数据更快,表中主键采用的是GUID,表中没有创建任何索引.GUID必然是比自增长要快的,因为你生成一个GUID算法所花的时间肯定比你从数据表中重新查询上一条记录的ID的值然后再进行加1运算要少.而如果存在索引的情况下,每次插入记录都会进行索引重建,这是非常耗性能的.如果表中无可避免的存在索引,我们可以通过先删除索引,然后批量插入,最后再重建索引的方式来提高效率. create database CarSYS;    go    use CarSYS;  

C#中的SqlBulkCopy批量插入数据

在C#中,我们可以使用sqlBulkCopy去批量插入数据,其他批量插入方法不在讨论. 1 /// <summary> 2 /// SqlBulkCopy批量插入数据 3 /// </summary> 4 /// <param name="connectionStr">链接字符串</param> 5 /// <param name="dataTableName">表名</param> 6 ///

SqlBulkCopy批量插入数据时,不执行触发器和约束的解决方法

原文:SqlBulkCopy批量插入数据时,不执行触发器和约束的解决方法 在new SqlBulkCopy对象的时候,设置一下SqlBulkCopyOptions选项即可,按位或运算 SqlBulkCopyOptions.FireTriggers | SqlBulkCopyOptions.CheckConstraints using (SqlBulkCopy bulkCopy = new SqlBulkCopy(GlobalString.ConnectionString, SqlBulkCopy

批量插入数据到sqlserver

第一种方法:Insert部分数据还ok 批量数据性能问题.第二种方法:sqlbulkcopy 方法 主要思想 是在客户端将数据缓存到datatable里面,然后用sqlbulkcopy 一次性将数据插入到数据库表中方法如下: System.Data.SqlClient.SqlBulkCopy bcp = new System.Data.SqlClient.SqlBulkCopy(connectionString); //指定目标数据库的表名 bcp.DestinationTableName =

Android批量插入数据到SQLite数据库

Android中在sqlite插入数据的时候默认一条语句就是一个事务,因此如果存在上万条数据插入的话,那就需要执行上万次插入操作,操作速度可想而知.因此在Android中插入数据时,使用批量插入的方式可以大大提高插入速度. 有时需要把一些数据内置到应用中,常用的有以下2种方式:其一直接拷贝制作好的SQLite数据库文件,其二是使用系统提供的数据库,然后把数据批量插入.我更倾向于使用第二种方式:使用系统创建的数据库,然后批量插入数据.批量插入数据也有很多方法,那么那种方法更快呢,下面通过一个dem

sql 批量插入数据到Sqlserver中 效率较高的方法

使用SqlBulk #region 方式二 static void InsertTwo() { Console.WriteLine("使用Bulk插入的实现方式"); Stopwatch sw = new Stopwatch(); DataTable dt = GetTableSchema(); using (SqlConnection conn = new SqlConnection(StrConnMsg)) { SqlBulkCopy bulkCopy = new SqlBulkC

Android 批量插入数据到SQLite数据库

Android中在sqlite插入数据的时候默认一条语句就是一个事务,因此如果存在上万条数据插入的话,那就需要执行上万次插入操作,操作速度可想而知.因此在Android中插入数据时,使用批量插入的方式可以大大提高插入速度. 有时需要把一些数据内置到应用中,常用的有以下2种方式:其一直接拷贝制作好的SQLite数据库文件,其二是使用系统提供的数据库,然后把数据批量插入.我更倾向于使用第二种方式:使用系统创建的数据库,然后批量插入数据.批量插入数据也有很多方法,那么那种方法更快呢,下面通过一个dem

使用事务和SqlBulkCopy批量插入数据

SqlBulkCopy是.NET Framework 2.0新增的类,位于命名空间System.Data.SqlClient下,主要提供把其他数据源的数据有效批量的加载到SQL Server表中的功能.类似与 Microsoft SQL Server 包中名为 bcp 的命令行应用程序.但是使用 SqlBulkCopy 类可以编写托管代码解决方案,性能上优于bcp命令行应用程序,更优于如Insert方式向SQL Server表加载大量数据.SqlBulkCopy可以应用到大批量数据的转移上,而不