首页 > 代码库 > .Net中批量添加数据的几种实现方法比较
.Net中批量添加数据的几种实现方法比较
在.Net中经常会遇到批量添加数据,如将Excel中的数据导入数据库,直接在DataGridView控件中添加数据再保存到数据库等等。
方法一:一条一条循环添加
通常我们的第一反应是采用for或foreach循环一条一条的添加。
for (int i = 0; i < dgv.Rows.Count; i++){ string sql = "insert into ....."; SqlHelper.ExcuteNonQuery(CommandType.Text, sql, null);}
这样的方法可想而知,效率肯定很低,可以慢到操作人员无法接受的那种。经过测试(局域网),1W条数据将会耗时3分42秒842毫秒
方法二:每一千条循环添加
也许马上会有人想到Insert多条记录,即"Insert into TableName Values(‘ ‘,‘ ‘,‘ ‘),Values(‘ ‘,‘ ‘,‘ ‘)",这种方法在一定程度上提高不少的效率,但是这种方法有几个弊端。比如说,在SQL Server 2000中它就不支持这种语法,会提示"第 2 行: ‘,‘ 附近有语法错误。"的警告,批量操作也就无从谈起。再比如,这种方法么次最多也只能Insert 1000条数据,如果超过了1000条就会报错:"INSERT 语句中行值表达式的数目超出了 1000 行值的最大允许值。"。当然了,我们可以分为几次,每次添加一千条数据,这样还是比方法一的效率高不少。经过测试(局域网),1W条数据将会耗时0分14秒766毫秒
int rowCount = dataGridView1.Rows.Count;int quotient = rowCount / 1000; //商int remainder = rowCount % 1000; //余数StringBuilder str = new StringBuilder(); for (int j = 0; j < quotient; j++){ str.Append("insert into BatchTable values"); for (int i = 0; i < 1000; i++) { str.AppendFormat("(‘{0}‘,‘{1}‘,‘{2}‘,‘{3}‘,‘{4}‘,‘{5}‘,‘{6}‘,‘{7}‘,‘{8}‘,‘{9}‘,‘{10}‘)," , dataGridView1[0, i].Value, dataGridView1[1, i].Value, dataGridView1[2, i].Value, dataGridView1[3, i].Value, dataGridView1[4, i].Value , dataGridView1[5, i].Value, dataGridView1[6, i].Value, dataGridView1[7, i].Value, dataGridView1[8, i].Value, dataGridView1[9, i].Value, dataGridView1[10, i].Value); } string sql = str.ToString().TrimEnd(‘,‘); SqlHelper.ExcuteNonQuery(CommandType.Text, sql, null); str.Clear();}if (remainder > 0){ str.Append("insert into BatchTable values"); for (int i = 0; i < remainder; i++) { str.AppendFormat("(‘{0}‘,‘{1}‘,‘{2}‘,‘{3}‘,‘{4}‘,‘{5}‘,‘{6}‘,‘{7}‘,‘{8}‘,‘{9}‘,‘{10}‘)," , dataGridView1[0, i].Value, dataGridView1[1, i].Value, dataGridView1[2, i].Value, dataGridView1[3, i].Value , dataGridView1[4, i].Value, dataGridView1[5, i].Value, dataGridView1[6, i].Value, dataGridView1[7, i].Value, dataGridView1[8, i].Value, dataGridView1[9, i].Value, dataGridView1[10, i].Value); } string sql = str.ToString().TrimEnd(‘,‘); SqlHelper.ExcuteNonQuery(CommandType.Text, sql, null); str.Clear();}
方法三:使用SqlBulkCopy类批量添加数据
SqlBulkCopy类位于System.Data.SqlClient命名空间下,摘自MSDN:Microsoft SQL Server 提供一个称为 bcp 的流行的命令提示符实用工具,用于将数据从一个表移动到另一个表(表既可以在同一个服务器上,也可以在不同服务器上)。SqlBulkCopy 类允许编写提供类似功能的托管代码解决方案。还有其他将数据加载到 SQL Server 表的方法(例如 INSERT 语句),但相比之下SqlBulkCopy 提供明显的性能优势。使用 SqlBulkCopy 类只能向 SQL Server 表写入数据。但是,数据源不限于 SQL Server;可以使用任何数据源,只要数据可加载到 DataTable 实例或可使用IDataReader 实例读取数据。
采用 SqlBulkCopy类进行批量添加数据将会大大调高效率。经过测试(局域网),1W条数据将会耗时0分0秒292毫秒
public static bool ExcuteNonQuery(DataTable dt){ SqlConnection connection = new SqlConnection(connString); connection.Open(); SqlBulkCopy sqlbulkcopy = new SqlBulkCopy(connection); sqlbulkcopy.BulkCopyTimeout = 100; //超时之前操作完成所允许的秒数 sqlbulkcopy.BatchSize = dt.Rows.Count; //每一批次中的行数 sqlbulkcopy.DestinationTableName = dt.TableName; //服务器上目标表的名称 for (int i = 0; i < dt.Columns.Count; i++) { sqlbulkcopy.ColumnMappings.Add(i, i); //映射定义数据源中的列和目标表中的列之间的关系 } sqlbulkcopy.WriteToServer(dt); // 将DataTable数据上传到数据表中 connection.Close(); return true;}
.Net中批量添加数据的几种实现方法比较