C#使用SqlBulkCopy批量导数据

案例:将数据库数据导入到另一个库

ImportDataUtil:

public class ImportDataUtil
    {
        const int PAGE_SIZE = 500;
        private SqlConnection _sourceConn = null;
        private SqlConnection _descConn = null;
        public ImportDataUtil(string sourceConnStr,string descConnStr)
        {
            _sourceConn = new SqlConnection(sourceConnStr);
            _descConn = new SqlConnection(descConnStr);
            if (_sourceConn.State != System.Data.ConnectionState.Open)
            {
                _sourceConn.Open();
            }
            if (_descConn.State != System.Data.ConnectionState.Open)
            {
                _descConn.Open();
            }
        }

        public void ImportTables()
        {
            var tableNameList = GetTableNames();
            Console.WriteLine($"共{tableNameList.Count}个表");
            for (int i = 0; i < tableNameList.Count; i++)
            {
                var tableName = tableNameList[i];
                Console.WriteLine($"{tableName}开始导数据");
                ImportTable(tableName);
                Console.WriteLine($"{tableName}结束导数据");
            }
        }
        private void ImportTable(string tableName)
        {
            DataTable table = null;
            var rowCount = GetRowCount( tableName);
            Console.WriteLine($"{tableName}表共{rowCount}条记录");
            var pageCount = rowCount / PAGE_SIZE + 1;
            for (int pageIndex = 0; pageIndex < pageCount; pageIndex++)
            {
                table = GetSourceTable(tableName, PAGE_SIZE, pageIndex);
                SqlBulkCopy bulkCopy = new SqlBulkCopy(_descConn);//,SqlBulkCopyOptions.KeepIdentity 自增列保留原值
                bulkCopy.DestinationTableName = tableName;
                bulkCopy.BatchSize = table.Rows.Count;
                bulkCopy.WriteToServer(table);
            }
        }

        private  List<string> GetTableNames()
        {
            string sql = "select name from sysobjects where  OBJECTPROPERTY(id, N‘IsUserTable‘) = 1;";
            return _sourceConn.Query<string>(sql).ToList();
        }
        private  int GetRowCount( string tableName)
        {
            string sql = $"SELECT COUNT(ID) FROM {tableName}";
            return _sourceConn.ExecuteScalar<int>(sql);
        }
        private  DataTable GetSourceTable( string tableName, int pageSize, int pageIndex)
        {
            var table = new DataTable();
            var command = _sourceConn.CreateCommand();
            command.CommandText = $"SELECT * FROM {tableName}";//Account_Permission
            command.CommandType = System.Data.CommandType.Text;
            var adapter = new SqlDataAdapter(command);
            adapter.Fill(table);
            return table;
        }

    }

使用:

        static void Main(string[] args)
        {
            string sourceConnStr = "Data Source = 192.168.0.116,30705; uid = sa; pwd = KI68oecJc0NpXwscxybK; Initial Catalog=test3; Pooling=true; Max Pool Size=1000; Min Pool Size=5; Connection Timeout=28800";
            string descConnStr = "Data Source = 192.168.0.116,30705; uid = sa; pwd = KI68oecJc0NpXwscxybK; Initial Catalog=test2; Pooling=true; Max Pool Size=1000; Min Pool Size=5; Connection Timeout=28800";
            ImportDataUtil importUtil = new ImportDataUtil(sourceConnStr,descConnStr);
            importUtil.ImportTables();

            Console.ReadKey();
        }

参考文章:

https://www.cnblogs.com/jiekzou/p/6145550.html

https://www.cnblogs.com/zhaoshujie/p/9691010.html

原文地址:https://www.cnblogs.com/fanfan-90/p/12521135.html

时间: 2024-08-05 17:57:07

C#使用SqlBulkCopy批量导数据的相关文章

利用DataTable快速批量导数据

DataSet ds = new DataSet();            using (SqlConnection conn = new SqlConnection(@"data source=.\sqlxu;initial catalog=NationalUnion20140717;persist security info=True;user id=sa;password=101;MultipleActiveResultSets=True"))            {    

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

用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

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

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

SqlBulkCopy 批量复制数据到数据表

使用 SqlBulkCopy 类只能向 SQL Server 表写入数据.但是,数据源不限于 SQL Server:可以使用任何数据源,只要数据可加载到 DataTable 实例或可使用 IDataReader 实例读取数据 使用Datatable作为数据源的方式: 下面的代码使用到了ColumnMappings,因为目标表和数据源Datatable的结构不一致,需要这么一个映射来指定对应关系 public string SaveJHCData(LzShopBasicData[] datas)

SqlBulkCopy 批量导入数据 转换表字段类型

在使用SqlBulkCopy导入数据时,要有一个跟数据库里面同样的DataTable 要赋值表名 要求每个列跟数据库中列同名,并且列的类型要赋值跟数据库中列的类型对应的NET类型 要求数据库中为Null的数据,赋值DBNull.Value 代码: [AcceptVerbs(HttpVerbs.Post)] public JsonResult Upload(HttpPostedFileBase fileData) { if (fileData != null) { try { Guid UserI

Excel批量导数据到SQLServer

string filepath = @"D:\data.xlsx";           string strConn = "Provider=Microsoft.Ace.OleDb.12.0;Persist Security Info=False;" + "data source=" +                            filepath + ";Extended Properties='Excel 12.0; H

SqlBulkCopy批量添加数据

var sqlconn = ConfigurationManager.ConnectionStrings["SQLConnStringRead"].ConnectionString; string sql = "select * from TicketRecord where 1=2"; //Database db = new Database(sqlconn); //var ds = db.QueryExtend(sql); DataTable ImportDT