C# 批量插入表SQLSERVER SqlBulkCopy往数据库中批量插入数据

本文涉及的产品
云数据库 RDS SQL Server,基础系列 2核4GB
RDS SQL Server Serverless,2-4RCU 50GB 3个月
推荐场景:
简介: #region 帮助实例:SQL 批量插入数据 多种方法 /// /// SqlBulkCopy往数据库中批量插入数据 /// /// 数据源表 /// 服务器上目标表 /// 创建新的列映射,并使用列序号引用源列和目标列的列名称。
#region 帮助实例:SQL 批量插入数据 多种方法
     /// <summary>
        /// SqlBulkCopy往数据库中批量插入数据
        /// </summary>
        /// <param name="sourceDataTable">数据源表</param>
        /// <param name="targetTableName">服务器上目标表</param>
        /// <param name="mapping">创建新的列映射,并使用列序号引用源列和目标列的列名称。</param>
        public static void BulkToDB(DataTable sourceDataTable, string targetTableName, SqlBulkCopyColumnMapping[] mapping)
        {
            /*  调用方法 -2012年11月16日编写
            //DataTable dt = Get_All_RoomState_ByHID();
            //SqlBulkCopyColumnMapping[] mapping = new SqlBulkCopyColumnMapping[4];
            //mapping[0] = new SqlBulkCopyColumnMapping("Xing_H_ID", "Xing_H_ID");
            //mapping[1] = new SqlBulkCopyColumnMapping("H_Name", "H_Name");
            //mapping[2] = new SqlBulkCopyColumnMapping("H_sName", "H_sName");
            //mapping[3] = new SqlBulkCopyColumnMapping("H_eName", "H_eName");
            //BulkToDB(dt, "Bak_Tts_Hotel_Name", mapping);
            */
            SqlConnection conn = new SqlConnection(SQLHelper.ConnectionString);
            SqlBulkCopy bulkCopy = new SqlBulkCopy(conn);   //用其它源的数据有效批量加载sql server表中
            bulkCopy.DestinationTableName = targetTableName;    //服务器上目标表的名称
            bulkCopy.BatchSize = sourceDataTable.Rows.Count;   //每一批次中的行数

            try
            {
                conn.Open();
                if (sourceDataTable != null && sourceDataTable.Rows.Count != 0)
                {
                    for (int i = 0; i < mapping.Length; i++)
                        bulkCopy.ColumnMappings.Add(mapping[i]);

                    //将提供的数据源中的所有行复制到目标表中
                    bulkCopy.WriteToServer(sourceDataTable );   
                }
            }
            catch (Exception ex)
            {
                //throw ex;
                Common.WriteTextLog("BulkToDB", ex.Message);
            }
            finally
            {
                conn.Close();
                if (bulkCopy != null)
                    bulkCopy.Close();
            }
        }
        /// <summary>
        /// SQL2008以上方可支持自定义表类型 :调用存储过程游标-往数据库中批量插入数据 ,注意
        /// </summary>
        /// <param name="sourceDataTable"></param>
        public void DataTableToHotelDB(DataTable sourceDataTable)
        {
            /*  -2012年11月15日编写
                ALTER PROCEDURE [dbo].[P_InsertSubject]
                @tempStudentID int
                AS
                DECLARE rs CURSOR LOCAL SCROLL FOR
                select H_ID from Tts_Hotel_Name 
                OPEN rs
                FETCH NEXT FROM rs INTO @tempStudentID
                WHILE @@FETCH_STATUS = 0
                BEGIN
                Insert student (tempStudentID) values (@tempStudentID)
                FETCH NEXT FROM rs INTO @tempStudentID
                END
                CLOSE rs
             *  ***************************************************************
             *  create table Orders
                (
                Orders_ID int identity(1,1) primary key,
                ItemCode nvarchar(50) not null,
                UM nvarchar(20) not null,
                Quantity decimal(18,6) not null,
                UnitPrice decimal(18,6) not null
                )

                --创建用户自定义表类型,在可编程性->类型性->用户自定义表类型
                create type OrdersTableType as table
                (
                ItemCode nvarchar(50) not null,
                UM nvarchar(20) not null,
                Quantity decimal(18,6) not null,
                UnitPrice decimal(18,6) not null
                )
                go

                create procedure Pro_Orders
                (
                    @OrdersCollection OrdersTableType readonly
                )
                as
                insert into Orders([ItemCode],[UM],[Quantity],[UnitPrice])
                    SELECT oc.[ItemCode],oc.[UM],[Quantity],oc.[UnitPrice] FROM @OrdersCollection AS oc;
    
                go
             * 
             */

            SqlParameter[] parameters = {new SqlParameter("@OrdersCollection", SqlDbType.Structured)};
            parameters[0].Value = sourceDataTable;
            new SQLHelper().ExecuteScalar("P_DataTable_ToHotelDB", parameters, true);
        }
        #endregion


  

  #region 使用SqlBulkCopy将DataTable中的数据批量插入数据库中
        /// <summary>
        /// 使用SqlBulkCopy将DataTable中的数据批量插入数据库中
        /// </summary>
        /// <param name="strTableName">数据库中对应的表名</param>
        /// <param name="dtData">数据集</param>
        public void SqlBulkCopyInsert(string strTableName, DataTable dtData)
        {
            string ConStr = connectionString;// 数据库连接字符串

            try
            {
                using (SqlBulkCopy sqlRevdBulkCopy = new SqlBulkCopy(ConStr))//引用SqlBulkCopy
                {
                    sqlRevdBulkCopy.DestinationTableName = strTableName;//数据库中对应的表名

                    sqlRevdBulkCopy.NotifyAfter = dtData.Rows.Count;//有几行数据

                    sqlRevdBulkCopy.WriteToServer(dtData);//数据导入数据库

                    sqlRevdBulkCopy.Close();//关闭连接
                }
            }
            catch (Exception ex)
            {
                WriteErrorLog(ex.Message + "数据库处理出错654行。SqlBulkCopyInsert");
                throw (ex);
            }
        }
        #endregion


        private static void DataTableToSQLServer( DataTable dt)
        {
            string connectionString = GetConnectionString();

            using (SqlConnection destinationConnection =new SqlConnection(connectionString))
            {
                destinationConnection.Open();

                using (SqlBulkCopy bulkCopy =new SqlBulkCopy(destinationConnection))
                {


                    try
                    {

                        bulkCopy.DestinationTableName = "T_EIInformation";//要插入的表的表明
                        bulkCopy.ColumnMappings.Add("Email", "Email");//映射字段名 DataTable列名 ,数据库 对应的列名
                        bulkCopy.ColumnMappings.Add("author", "author");
                        bulkCopy.ColumnMappings.Add("Title", "Title");
                        bulkCopy.ColumnMappings.Add("Type", "Type");
                        bulkCopy.ColumnMappings.Add("confName", "confName");
                        bulkCopy.ColumnMappings.Add("Language", "Language");
                        bulkCopy.ColumnMappings.Add("Publicationyear", "Publicationyear");
                        bulkCopy.ColumnMappings.Add("Conferencelocation", "Conferencelocation");
                        bulkCopy.WriteToServer(dt);
                    }
                    catch (Exception ex)
                    {
                        Console.WriteLine(ex.Message);
                    }
                    finally
                    {
                        // Close the SqlDataReader. The SqlBulkCopy
                        // object is automatically closed at the end
                        // of the using block.
                       
                    }
                }

       
            }
            
        }

以上3段代码均为SqlBulkCopy往数据库中批量插入数据,根据不同程度封装,时候不同程度技术人员存档查阅。

相关实践学习
使用SQL语句管理索引
本次实验主要介绍如何在RDS-SQLServer数据库中,使用SQL语句管理索引。
SQL Server on Linux入门教程
SQL Server数据库一直只提供Windows下的版本。2016年微软宣布推出可运行在Linux系统下的SQL Server数据库,该版本目前还是早期预览版本。本课程主要介绍SQLServer On Linux的基本知识。 相关的阿里云产品:云数据库RDS&nbsp;SQL Server版 RDS SQL Server不仅拥有高可用架构和任意时间点的数据恢复功能,强力支撑各种企业应用,同时也包含了微软的License费用,减少额外支出。 了解产品详情:&nbsp;https://www.aliyun.com/product/rds/sqlserver
目录
相关文章
|
3月前
|
SQL 数据库 数据安全/隐私保护
数据库数据恢复——sql server数据库被加密的数据恢复案例
SQL server数据库数据故障: SQL server数据库被加密,无法使用。 数据库MDF、LDF、log日志文件名字被篡改。 数据库备份被加密,文件名字被篡改。
|
3月前
|
存储 缓存 数据库
数据库数据删除策略:硬删除vs软删除的最佳实践指南
在项目开发中,“删除”操作常见但方式多样,主要分为硬删除与软删除。硬删除直接从数据库移除数据,操作简单、高效,但不可恢复;适用于临时或敏感数据。软删除通过标记字段保留数据,支持恢复和审计,但增加查询复杂度与数据量;适合需追踪历史或可恢复的场景。两者各有优劣,实际开发中常结合使用以满足不同需求。
211 4
|
1月前
|
存储 SQL Java
数据存储使用文件还是数据库,哪个更合适?
数据库和文件系统各有优劣:数据库读写性能较低、结构 rigid,但具备计算能力和数据一致性保障;文件系统灵活易管理、读写高效,但缺乏计算能力且无法保证一致性。针对仅需高效存储与灵活管理的场景,文件系统更优,但其计算短板可通过开源工具 SPL(Structured Process Language)弥补。SPL 提供独立计算语法及高性能文件格式(如集文件、组表),支持复杂计算与多源混合查询,甚至可替代数据仓库。此外,SPL 易集成、支持热切换,大幅提升开发运维效率,是后数据库时代文件存储的理想补充方案。
|
3月前
|
人工智能 关系型数据库 分布式数据库
让数据与AI贴得更近,阿里云瑶池数据库系列产品焕新升级
4月9日阿里云AI势能大会上,阿里云瑶池数据库发布重磅新品及一系列产品能力升级。「推理加速服务」Tair KVCache全新上线,实现KVCache动态分层存储,显著提高内存资源利用率,为大模型推理降本提速。
|
23天前
|
人工智能 运维 关系型数据库
数据库运维:mysql 数据库迁移方法-mysqldump
本文介绍了MySQL数据库迁移的方法与技巧,重点探讨了数据量大小对迁移方式的影响。对于10GB以下的小型数据库,推荐使用mysqldump进行逻辑导出和source导入;10GB以上可考虑mydumper与myloader工具;100GB以上则建议物理迁移。文中还提供了统计数据库及表空间大小的SQL语句,并讲解了如何使用mysqldump导出存储过程、函数和数据结构。通过结合实际应用场景选择合适的工具与方法,可实现高效的数据迁移。
161 1
|
2月前
|
负载均衡 算法 关系型数据库
大数据大厂之MySQL数据库课程设计:揭秘MySQL集群架构负载均衡核心算法:从理论到Java代码实战,让你的数据库性能飙升!
本文聚焦 MySQL 集群架构中的负载均衡算法,阐述其重要性。详细介绍轮询、加权轮询、最少连接、加权最少连接、随机、源地址哈希等常用算法,分析各自优缺点及适用场景。并提供 Java 语言代码实现示例,助力直观理解。文章结构清晰,语言通俗易懂,对理解和应用负载均衡算法具有实用价值和参考价值。
大数据大厂之MySQL数据库课程设计:揭秘MySQL集群架构负载均衡核心算法:从理论到Java代码实战,让你的数据库性能飙升!
|
4月前
|
关系型数据库 MySQL Java
【YashanDB知识库】原生mysql驱动配置连接崖山数据库
【YashanDB知识库】原生mysql驱动配置连接崖山数据库
【YashanDB知识库】原生mysql驱动配置连接崖山数据库
|
2月前
|
存储 关系型数据库 MySQL
大数据新视界 --面向数据分析师的大数据大厂之 MySQL 基础秘籍:轻松创建数据库与表,踏入大数据殿堂
本文详细介绍了在 MySQL 中创建数据库和表的方法。包括安装 MySQL、用命令行和图形化工具创建数据库、选择数据库、创建表(含数据类型介绍与选择建议、案例分析、最佳实践与注意事项)以及查看数据库和表的内容。文章专业、严谨且具可操作性,对数据管理有实际帮助。
大数据新视界 --面向数据分析师的大数据大厂之 MySQL 基础秘籍:轻松创建数据库与表,踏入大数据殿堂
|
2月前
|
SQL 关系型数据库 MySQL
MySQL下载安装全攻略!小白也能轻松上手,从此数据库不再难搞!
这是一份详细的MySQL安装与配置教程,适合初学者快速上手。内容涵盖从下载到安装的每一步操作,包括选择版本、设置路径、配置端口及密码等。同时提供基础操作指南,如数据库管理、数据表增删改查、用户权限设置等。还介绍了备份恢复、图形化工具使用和性能优化技巧,帮助用户全面掌握MySQL的使用方法。附带常见问题解决方法,保姆级教学让你无忧入门!
MySQL下载安装全攻略!小白也能轻松上手,从此数据库不再难搞!
|
4月前
|
关系型数据库 MySQL 数据库连接
docker拉取MySQL后数据库连接失败解决方案
通过以上方法,可以解决Docker中拉取MySQL镜像后数据库连接失败的常见问题。关键步骤包括确保容器正确启动、配置正确的环境变量、合理设置网络和权限,以及检查主机防火墙设置等。通过逐步排查,可以快速定位并解决连接问题,确保MySQL服务的正常使用。
653 82

热门文章

最新文章