上篇博客我们介绍了通过拼接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字符串来进行批量添加,现在才发现有一种更方便快捷性能高的方法来做之前的工作,还能解决之前遇到的问题,不将就才是发现的原动力啊。