C#和MS SQL交互使用的技术叫做 ADO.NET。 使用ADO.NET可以方便的对SQL SERVER 进行 *** 作。
(如果你对ADO.NET不了解,建议先MSDN一下)
1,数据比较复杂但是量不是很大,(这个大小的概念要视你的硬件、网络而定,一般在100万条以上才叫大)。
使用FOR循环进行插入, 即声明连接(conn.Open)然后进行遍历,
一条一条插入数据库(执行Insert语句),
一般来说,100W条数据,如果插入本机数据库的话, 耗时一般在40S-1分钟左右,
也可以在SqlServer中创建一个存储过程来执行Insert命令, 遍历时只需要调用存储过程即可, 存储过程的执行效率比Sql语句要高很多,因为不需要每次都编译。
100W条数据用存储过程来执行的话,一般耗时在20S左右,。
2数据量巨大,但是类型较简单,(一般指上百万条数据)
使用ADO.NET提供的BulkCopy,即批量导入,
语法:
public static void BulkToDB(DataTable dt, string TableName){
SqlConnection sqlConn = new SqlConnection(
ConfigurationManager.ConnectionStrings["dbconnstr"].ConnectionString)
SqlBulkCopy bulkCopy = new SqlBulkCopy(sqlConn)
bulkCopy.BulkCopyTimeout = 600
bulkCopy.DestinationTableName = TableName
bulkCopy.BatchSize = dt.Rows.Count
try
{
sqlConn.Open()
if (dt != null && dt.Rows.Count != 0)
bulkCopy.WriteToServer(dt)
}
catch (Exception ex)
{
throw ex
}
finally
{
sqlConn.Close()
if (bulkCopy != null)
bulkCopy.Close()
}
}
需要传入一个DataTable,一个表名。
这种方式速度非常快,同样100W条数据,本机导入,大概3-5秒就可以完成,
但是需要注意,传入的DataTable必须和Sql Server中的表结构一模一样,
比如你的表有3列,分别是Name, Age, Sex。 你传入的DataTable也必须是如此,所以这种方式只适合导入一些基础数据, 并不适合作为数据层的常用方法。
如果数据量巨大又要求很高的效率,更建议使用NoSql数据库
SqlBulkCopy是个不错的选择,直接由DataTable可以导入到数据库,但要注意(1)列名与目标表一致(2)数据类型一致(3)空值容错处理,参考代码:///<summary///将<see cref="DataTable"/的数据批量插入到数据库中。///</summary///<param name="dataTable"
要批量插入的
<see cref="DataTable"/。
</param///<param name="batchSize"
每批次写入的数据量。
</parampublicboolInsertBatchDataTable(DataTable dataTable,
stringtableName,
intbatchSize =10000){using(SqlConnection connection =newSqlConnection(myConnectionString)){try{connection.Open()//给表名加上前后导符using(varbulk =newSqlBulkCopy(connection, SqlBulkCopyOptions.KeepIdentity,
null){DestinationTableName=tableName,
BatchSize=batchSize}){//循环所有列,为bulk添加映射//dataTable.EachColumn(c = bulk.ColumnMappings.Add(c.ColumnName, c.ColumnName), c = !c.AutoIncrement)foreach(DataColumn dcindataTable.Columns){bulk.ColumnMappings.Add(dc.ColumnName, dc.ColumnName)}bulk.WriteToServer(dataTable)
bulk.Close()}returntrue}catch(Exception exp){returnfalse}finally{connection.Close()}}}
如果是数据量非常大,超过10W以上的数据,可以考虑生成.dtsx文件,然后由C#代码直接调用,效率还是不错的。
方案一、循环导入实现方式是利用数据库访问类调用存储过程,利用循环逐条插入。很明显,这种方式效率并不高
方案二、使用Bulk插入
bulk方法主要思想是通过在客户端把数据都缓存在Table中,然后利用SqlBulkCopy一次性把Table中的数据插入到数据库,效率非常高
方案三:
利用SQLServer2008的新特性--表值参数(Table-Valued Parameter)。表值参数是SQLServer2008才有的一个新特性,使用这个新特性,我们可以把一个表类型作为参数传递到函数或存储过程里。
方案四:
对于单列字段,可以把要插入的数据进行字符串拼接,最后再在存储过程中拆分成数组,然后逐条插入。查了一下存储过程中参数的字符串的最大长度,然后除以字段的长度,算出一个值,很明显是可以满足要求的,只是这种方式跟第一种方式比起来,似乎没什么提高,因为原理都是一样的。
方案五:
考虑异步创建、消息队列等等。这种方案无论从设计上还是开发上,难度都是有的。
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)