zoukankan      html  css  js  c++  java
  • 用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);
    
            }
        }
    }
    View Code

    其次创建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;
    
            }
        }
    }
    View Code

    映射到数据库对象表信息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; }
        }
    }
    View Code

    批量操作数据

    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;
    
                   }
                   );
    
            }
    
        }
    }
    View Code
  • 相关阅读:
    Android APP 内部捐赠实现(支付宝&微信)
    RecyclerView 与 Scrollview 搭配使用的两个坑
    Android 应用内直接跳转酷市场
    Zxing 的集成 ---- Maven 对应 Gradle 的写法
    Android Gradle manifestPlaceholders 占位符详解
    Nopcommerce架构浅谈之架构层次
    Nopcommerce架构浅谈之文件结构
    策略模式
    Class path contains multiple SLF4J bindings.
    常量池
  • 原文地址:https://www.cnblogs.com/Warmsunshine/p/3631318.html
Copyright © 2011-2022 走看看