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
目录
相关文章
|
2月前
|
SQL 数据库
数据库数据恢复—SQL Server数据库报错“错误823”的数据恢复案例
SQL Server附加数据库出现错误823,附加数据库失败。数据库没有备份,无法通过备份恢复数据库。 SQL Server数据库出现823错误的可能原因有:数据库物理页面损坏、数据库物理页面校验值损坏导致无法识别该页面、断电或者文件系统问题导致页面丢失。
100 12
数据库数据恢复—SQL Server数据库报错“错误823”的数据恢复案例
|
6天前
|
SQL 存储 缓存
SQL Server 数据太多如何优化
11种优化方案供你参考,优化 SQL Server 数据库性能得从多个方面着手,包括硬件配置、数据库结构、查询优化、索引管理、分区分表、并行处理等。通过合理的索引、查询优化、数据分区等技术,可以在数据量增大时保持较好的性能。同时,定期进行数据库维护和清理,保证数据库高效运行。
|
14天前
|
存储 数据挖掘 数据库
数据库数据恢复—SQLserver数据库ndf文件大小变为0KB的数据恢复案例
一个运行在存储上的SQLServer数据库,有1000多个文件,大小几十TB。数据库每10天生成一个NDF文件,每个NDF几百GB大小。数据库包含两个LDF文件。 存储损坏,数据库不可用。管理员试图恢复数据库,发现有数个ndf文件大小变为0KB。 虽然NDF文件大小变为0KB,但是NDF文件在磁盘上还可能存在。可以尝试通过扫描&拼接数据库碎片来恢复NDF文件,然后修复数据库。
|
2月前
|
SQL 关系型数据库 MySQL
创建包含MySQL和SQLServer数据库所有字段类型的表的方法
创建一个既包含MySQL又包含SQL Server所有字段类型的表是一个复杂的任务,需要仔细地比较和转换数据类型。通过上述方法,可以在两个数据库系统之间建立起相互兼容的数据结构,为数据迁移和同步提供便利。这一过程不仅要考虑数据类型的直接对应,还要注意特定数据类型在不同系统中的表现差异,确保数据的一致性和完整性。
31 4
|
1月前
|
SQL 缓存 大数据
C#高效处理大数据的批次处理,以及最好的数据库设计
C#高效处理大数据的批次处理,以及最好的数据库设计
55 0
|
2月前
|
SQL 存储 数据管理
SQL Server数据库
SQL Server数据库
55 11
|
2月前
|
SQL 网络协议 数据库连接
已解决:连接SqlServer出现 provider: Shared Memory Provider, error: 0 - 管道的另一端上无任何进程【C#连接SqlServer踩坑记录】
本文介绍了解决连接SqlServer时出现“provider: Shared Memory Provider, error: 0 - 管道的另一端上无任何进程”错误的步骤,包括更改服务器验证模式、修改sa用户设置、启用TCP/IP协议,以及检查数据库连接语句中的实例名是否正确。此外,还解释了实例名mssqlserver和sqlserver之间的区别,包括它们在默认设置、功能和用途上的差异。
|
2月前
|
SQL 安全 数据库
基于SQL Server事务日志的数据库恢复技术及实战代码详解
基于事务日志的数据库恢复技术是SQL Server中一个非常强大的功能,它能够帮助数据库管理员在数据丢失或损坏的情况下,有效地恢复数据。通过定期备份数据库和事务日志,并在需要时按照正确的步骤恢复,可以最大限度地减少数据丢失的风险。需要注意的是,恢复数据是一个需要谨慎操作的过程,建议在执行恢复操作之前,详细了解相关的操作步骤和注意事项,以确保数据的安全和完整。
104 0
|
3月前
|
SQL 数据库 数据安全/隐私保护
SQL Server数据库Owner导致事务复制log reader job无法启动的解决办法
【8月更文挑战第14天】解决SQL Server事务复制Log Reader作业因数据库所有者问题无法启动的方法:首先验证数据库所有者是否有效并具足够权限;若非,使用`ALTER AUTHORIZATION`更改为有效登录名。其次,确认Log Reader使用的登录名拥有读取事务日志所需的角色权限。还需检查复制配置是否准确无误,并验证Log Reader代理的连接信息及参数。重启SQL Server Agent服务或手动启动Log Reader作业亦可能解决问题。最后,审查SQL Server错误日志及Windows事件查看器以获取更多线索。
|
3月前
|
SQL 数据库
Microsoft SQL Server 2014如何来备份数据库
Microsoft SQL Server 2014如何来备份数据库
326 3