【批量添加】-SqlBulkCopy语句 标签: sql批量添加 2015-12-20 14:39 1367人阅读 评论(33)

     上篇博客我们介绍了通过拼接sql字符串的方法来对sql数据库进行批量添加,但是通过语句拼接insert语句有个缺点,就是每次最多只能添加1000条。当时我们另外一个界面也用到了批量添加,但是这个界面轻轻一点就需要添加上千条数据,这可如何是好呢,通过查找,我找到了另外一种批量添加的方法,就是通过SqlBulkCopy语句来实现批量添加。


     使用SqlBulkCopy语句的效率比使用insert语句来进行批量添加的速度更快,具体的数据我没有记录下来,但是从感觉上来说,效果很明显。


     那么什么是SqlBulkCopy语句呢?


     Microsoft SQL Server 提供一个称为 bcp 的流行的命令提示符实用工具,用于将数据从一个表移动到另一个表(表既可以在同一个服务器上,也可以在不同服务器上)。 SqlBulkCopy 类允许编写提供类似功能的托管代码解决方案。还有其他将数据加载到 SQL Server 表的方法(例如 INSERT 语句),但相比之下 SqlBulkCopy 有明显的性能优势。


     使用 SqlBulkCopy 类只能向 SQL Server 表写入数据。但是,数据源不限于 SQL Server;可以使用任何数据源,只要数据可加载到 DataTable 实例或可使用 IDataReader 实例读取数据。


     如何使用SqlBulkCopy语句呢?


#region  批量添加DataTable
        /// <summary>
        /// 批量添加datatable
        /// </summary>
        /// <param name="data"></param>
        /// <returns></returns>
        public bool Insert(DataTable data)
        {
            try 
            {
                //连接sql数据库语句
                using (SqlConnection conn = new SqlConnection("data source=.;initial catalog=YzSystem;persist security info=True;user id=sa;password=xxx;"))
            {
                if (conn.State != ConnectionState.Open)
                    conn.Open();
                using (SqlBulkCopy sqlBulkCopy = new SqlBulkCopy(conn))
                {

                    //     列映射集合。
                    sqlBulkCopy.ColumnMappings.Add(0, "ID");
                    sqlBulkCopy.ColumnMappings.Add(1, "EvaluatorID");
                    sqlBulkCopy.ColumnMappings.Add(2, "CriticID");
                    sqlBulkCopy.ColumnMappings.Add(3, "IsEvaluated");
                    sqlBulkCopy.ColumnMappings.Add(4, "Weight");
                    sqlBulkCopy.ColumnMappings.Add(5, "Year");
                    sqlBulkCopy.ColumnMappings.Add(6, "EvaluationInfoID");
                    sqlBulkCopy.ColumnMappings.Add(7, "IsUsed");

                    //     每一批次中的行数。在每一批次结束时,将该批次中的行发送到服务器。
                    sqlBulkCopy.BatchSize = data.Rows.Count;

                    //     超时之前操作完成所允许的秒数。
                    sqlBulkCopy.BulkCopyTimeout = 60;
                    //     服务器上目标表的名称。
                    sqlBulkCopy.DestinationTableName ="YzSettingEvaluationEntity";

                    //     将data这个datatable中的表复制到目标表中。
                    sqlBulkCopy.WriteToServer(data);
                }
                if (conn.State != ConnectionState.Closed)
                    conn.Close();
                return true;
            }
            }
            catch (Exception ex)
            {

                return false;
            }

            }

        #endregion

     之前一直用的拼接sql字符串来进行批量添加,现在才发现有一种更方便快捷性能高的方法来做之前的工作,还能解决之前遇到的问题,不将就才是发现的原动力啊。

posted @ 2015-12-20 14:39  kingsaytay  阅读(166)  评论(0编辑  收藏  举报