C# 批量插入表SQLSERVER 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往数据库中批量插入数据,根据不同程度封装,时候不同程度技术人员存档查阅。

时间: 2024-11-02 05:20:18

C# 批量插入表SQLSERVER SqlBulkCopy往数据库中批量插入数据的相关文章

SqlBulkCopy与触发器,批量插入表(存在则更新,不存在则插入)

原文:SqlBulkCopy与触发器,批量插入表(存在则更新,不存在则插入) 临时表:Test /****** 对象: Table [dbo].[Test] 脚本日期: 05/10/2013 11:42:07 ******/ SET ANSI_NULLS ON GO SET QUOTED_IDENTIFIER ON GO CREATE TABLE [dbo].[Test]( [ID] [int] IDENTITY(1,1) NOT NULL, [UserID] [int] NOT NULL, [

sql server-按条件从数据库中批量导出excel表

问题描述 按条件从数据库中批量导出excel表 一张表中有58万条记录,产地(产地为字符型)也有200个,按产地(如产地为北京的为一个excel表)分类导出带表头的excel表,excel表名与导出的产地一致.求各位大侠帮忙,万分感谢!(用oracle,sql server都可) 解决方案 http://blog.csdn.net/yongsheng0550/article/details/6714111 解决方案二: 数据库数据批量导出到excel利用POI将数据库表导出到Excel 解决方案

sql server-sqlserver中导入数据库后,把由windowds验证改成sqlserver后,数据库中的表消失

问题描述 sqlserver中导入数据库后,把由windowds验证改成sqlserver后,数据库中的表消失 解决方案 数据库选对了吗?如果选不对,肯定找不到表的 解决方案二: 新手表示没遇到过这种问题 解决方案三: 用windows账号重新登陆查看下表是否真的消失.然后检查下你使用的sql server账号的权限.

SQL Server数据库中批量导入数据的2种方法_MsSql

在软件项目实施的时候,数据导入一直是项目人员比较头疼的问题.其实,在SQL Server中集成了很多成批导入数据的方法.有些项目实施顾问头疼的问题,在我们数据库管理员眼中,是小菜一碟.现在的重点就是,如何让用户了解这些方法,让数据导入变得轻松一些.相信以下方法大家都用过了,温故而知新哈,如果有更好的方法希望大家都提出来~ 一.使用Select Into语句 若企业数据库都采用的是SQL Server数据库的话,则可以利用Select Into语句来实现数据的导入.Select Into语句,他的

SQL Server数据库中批量导入数据的2种方法

在软件项目实施的时候,数据导入一直是项目人员比较头疼的问题.其实,在SQL Server中集成了很多成批导入数据的方法.有些项目实施顾问头疼的问题,在我们数据库管理员眼中,是小菜一碟.现在的重点就是,如何让用户了解这些方法,让数据导入变得轻松一些.相信以下方法大家都用过了,温故而知新哈,如果有更好的方法希望大家都提出来~ 一.使用Select Into语句 若企业数据库都采用的是SQL Server数据库的话,则可以利用Select Into语句来实现数据的导入.Select Into语句,他的

server-用C#代码写一个数据库导入系统,只是将excel表导入到SQL2008数据库中

问题描述 用C#代码写一个数据库导入系统,只是将excel表导入到SQL2008数据库中 用C#代码写一个数据库导入系统,只是将excel表导入到SQL2008数据库中, 我用的是offices 2010 前台是一个fileupload控件,一个button控件,选择excel文件,点击button按钮,直接把excel表中的内容导入到SQL数据库中.请问怎么实现这个功能?详细一些,谢谢 解决方案 建议你建两个数据库连接,一个连接excel,一个连接sql2008,然后把excel里数据取出来,

mfc-MFC使用ADO往数据库中如何插入带有毫秒格式的时间(2015-7-10 12:32:12.123)

问题描述 MFC使用ADO往数据库中如何插入带有毫秒格式的时间(2015-7-10 12:32:12.123) 在MFC下利用ADO中的PutCollect函数向数据库中插入带有毫秒格式的时间,如:2015-7-10 12:32:12.123. 目前我自己测试该函数仅能够插入不带毫秒的时间(2015-7-10 12:32:12),但是不能插入带有毫秒的时间(2015-7-10 12:32:12.123). 请问各位有什么办法吗? 解决方案 自己把时间转换为数字等,然后再存入数据库,读取的时候也读

oracle10g-oracle的表是放在那个数据库中

问题描述 oracle的表是放在那个数据库中 如图片知道表的名字,但是由于是导入进来的不知道他是属于那个数据库,求大神帮忙指导一下怎么查看这些表属于那个数据库. 解决方案 楼主有 sqlplus 工具吗?有的话.. desc dba_data_files 查看字段名称. 找到有关tablespace字段,并且输入字段 select 字段名 from dba_data_files where table = TBL_PURVIEW : 复制这个字段,就能知道表属于哪个数据库了... 解决方案二:

ado-MFC使用ADO往数据库中如何插入带有毫秒的时间格式??

问题描述 MFC使用ADO往数据库中如何插入带有毫秒的时间格式?? MFC使用ADO往数据库中如何插入带有毫秒的时间格式?? 请教各位大牛 解决方案 看你要用哪个时间 1个mysql时间 1个是sql一句的时间的 insert 解决方案二: 可以把时间格式化为字符串,然后插入数据库字符串字段.读取的时候,读取字符串,然后转换回时间格式. 解决方案三: C# 中,取当前时间 是 DataTime(),而在SQL中,getdate(),特别是转换的时候要用一个COVERNT的函数,具体方法 你可以百