sqlserver插入方法
2015-08-03 10:21
302 查看
在C#向sqlserver插入大量数据的时候,有几种方法的比较:
1.生成语句,然后执行语句。效率最差的一种;
2.使用存储过程,较之前一种方法,效率会有提高,但是比较繁琐的就是需要在sqlserver中也要写入相应的T-Sql语句;
3.使用SqlBulkCopy ,这是网上说的效率最高的一种,测试之后,也确实有较高的处理效率
有人做过统计:
写入十万笔资料10次的平均秒数
使用SqlBulkCopy:2.2051
使用AddWithValue:63.418
写入一万笔资料10次的平均秒数
使用SqlBulkCopy:0.2188
使用AddWithValue:6.3856
写入一千笔资料10次的平均秒数
使用SqlBulkCopy:0.0187
使用AddWithValue:0.5805
写入一百笔资料10次的平均秒数
使用SqlBulkCopy:0.0062
使用AddWithValue:0.0353
写入十笔资料10次的平均秒数
使用SqlBulkCopy:0.004
使用AddWithValue:0.004
所以今后在插入数据的时候首选SqlBulkCopy
实例:
首先,生成datatable:
然后循环复制数据:
最后设置sqlbulkcopy并执行:
附:
sqlbulkcopy常见错误:从bcp端接收到一个对colid X无效的长度
错误原因: 长度超过表字段设计长度;
数据为空,表字段要求不为空;
1.生成语句,然后执行语句。效率最差的一种;
2.使用存储过程,较之前一种方法,效率会有提高,但是比较繁琐的就是需要在sqlserver中也要写入相应的T-Sql语句;
3.使用SqlBulkCopy ,这是网上说的效率最高的一种,测试之后,也确实有较高的处理效率
有人做过统计:
写入十万笔资料10次的平均秒数
使用SqlBulkCopy:2.2051
使用AddWithValue:63.418
写入一万笔资料10次的平均秒数
使用SqlBulkCopy:0.2188
使用AddWithValue:6.3856
写入一千笔资料10次的平均秒数
使用SqlBulkCopy:0.0187
使用AddWithValue:0.5805
写入一百笔资料10次的平均秒数
使用SqlBulkCopy:0.0062
使用AddWithValue:0.0353
写入十笔资料10次的平均秒数
使用SqlBulkCopy:0.004
使用AddWithValue:0.004
所以今后在插入数据的时候首选SqlBulkCopy
实例:
首先,生成datatable:
<span style="white-space:pre"> </span> DataTable table = new DataTable(); table.Columns.Add("ori",typeof(string)); table.Columns.Add("desarea",typeof(string)); table.Columns.Add("desarearatio",typeof(string)); table.Columns.Add("desareanumber",typeof(string)); table.Columns.Add("despoint",typeof(string)); table.Columns.Add("despointnumber",typeof(string)); table.Columns.Add("despointratio",typeof(string));
然后循环复制数据:
<span style="white-space:pre"> </span> while (en.MoveNext()) { PointArea _pointarea = (PointArea)en.Value; DataRow mRow = table.NewRow(); mRow["ori"] = _pointarea.getStartNode(); mRow["desarea"] = this.area(_pointarea.getEndNode()); mRow["desarearatio"] = _pointarea.getPercent().ToString(); mRow["desareanumber"] = _pointarea.getNumber(); mRow["despoint"] = _pointarea.dpoint; mRow["despointnumber"] = _pointarea.pointnumber; mRow["despointratio"] = _pointarea.dpointratio; table.Rows.Add(mRow); }
最后设置sqlbulkcopy并执行:
using (SqlBulkCopy sqlBC = new SqlBulkCopy(mSqlConnection)) { //设定一个批次量写入多少笔资料 sqlBC.BatchSize = 10000; //设定逾时的秒数 sqlBC.BulkCopyTimeout = 30; //设定要写入的资料库 sqlBC.DestinationTableName = "dbo.PointArea"; //对应资料行 sqlBC.ColumnMappings.Add("ori","ORI"); sqlBC.ColumnMappings.Add("desarea","DESAREA"); sqlBC.ColumnMappings.Add("desarearatio", "DESAREARATIO"); sqlBC.ColumnMappings.Add("desareanumber", "DESAREANUMBER"); sqlBC.ColumnMappings.Add("despoint", "DESPOINT"); sqlBC.ColumnMappings.Add("despointnumber", "DESPOINTNUMBER"); sqlBC.ColumnMappings.Add("despointratio", "DESPOINTRATIO"); //开始写入 sqlBC.WriteToServer(table); }
附:
sqlbulkcopy常见错误:从bcp端接收到一个对colid X无效的长度
错误原因: 长度超过表字段设计长度;
数据为空,表字段要求不为空;
相关文章推荐
- vs2005(或是2010)下oracle 10g oci编程环境的配置
- Nosql/Redis/ttserver/Flare/memcache比较
- The database principal owns a schema in the database, and cannot be dropped. (.Net SqlClient Data Pr
- SQL关于日期的查询
- MySQL开发技巧——与Join相关的SQL技巧
- mysql 多条重复行,查询出一条,并说明列为最大的
- MySQL的联合查询
- mysql常用命令
- 数据库连接错误---------
- mysql 备份与还原
- limit是mysql的语法
- oracle存储过程定时执行简单例子
- MYSQL表分区操作错误1503解决方案
- MongoDB学习(8)驱动实践
- mysql架构由小变大的演变过程
- 2015年8月2日--第二三四天Oracle的sql文件
- MongoDB学习(6)分片技术
- MongoDB学习(7)运维技术
- 数据库优化
- MongoDB学习(5)主从复制