c#怎样向sqlserver批量插入数据

c#怎样向sqlserver批量插入数据,第1张

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数据库

若只是需要大批量插入数据使用bcp是最好的,若同时需要插入、删除、更新建议使用SqlDataAdapter我测试过有很高的效率,一般情况下这两种就满足需求了

bcp方式

复制代码 代码如下:

/// <summary>

/// 大批量插入数据(2000每批次)

/// 已采用整体事物控制

/// </summary>

/// <param name="connString">数据库链接字符串</param>

/// <param name="tableName">数据库服务器上目标表名</param>

/// <param name="dt">含有和目标数据库表结构完全一致(所包含的字段名完全一致即可)的DataTable</param>

public static void BulkCopy(string connString, string tableName, DataTable dt)

{

using (SqlConnection conn = new SqlConnection(connString))

{

conn.Open()

using (SqlTransaction transaction = conn.BeginTransaction())

{

using (SqlBulkCopy bulkCopy = new SqlBulkCopy(conn, SqlBulkCopyOptions.Default, transaction))

{

bulkCopy.BatchSize = 2000

bulkCopy.BulkCopyTimeout = _CommandTimeOut

bulkCopy.DestinationTableName = tableName

try

{

foreach (DataColumn col in dt.Columns)

{

bulkCopy.ColumnMappings.Add(col.ColumnName, col.ColumnName)

}

bulkCopy.WriteToServer(dt)

transaction.Commit()

}

catch (Exception ex)

{

transaction.Rollback()

throw ex

}

finally

{

conn.Close()

}

}

}

}

}

SqlDataAdapter

复制代码 代码如下:

/// <summary>

/// 批量更新数据(每批次5000)

/// </summary>

/// <param name="connString">数据库链接字符串</param>

/// <param name="table"></param>

public static void Update(string connString, DataTable table)

{

SqlConnection conn = new SqlConnection(connString)

SqlCommand comm = conn.CreateCommand()

comm.CommandTimeout = _CommandTimeOut

comm.CommandType = CommandType.Text

SqlDataAdapter adapter = new SqlDataAdapter(comm)

SqlCommandBuilder commandBulider = new SqlCommandBuilder(adapter)

commandBulider.ConflictOption = ConflictOption.OverwriteChanges

try

{

conn.Open()

//设置批量更新的每次处理条数

adapter.UpdateBatchSize = 5000

adapter.SelectCommand.Transaction = conn.BeginTransaction()/////////////////开始事务

if (table.ExtendedProperties["SQL"] != null)

{

adapter.SelectCommand.CommandText = table.ExtendedProperties["SQL"].ToString()

}

adapter.Update(table)

adapter.SelectCommand.Transaction.Commit()/////提交事务

}

catch (Exception ex)

{

if (adapter.SelectCommand != null &&adapter.SelectCommand.Transaction != null)

{

adapter.SelectCommand.Transaction.Rollback()

}

throw ex

}

finally

{

conn.Close()

conn.Dispose()

}

}

结构不同,这个SqlBulkCopy方法也是能用的,看报错应该是哪个列没有写对,建议你可以一列一列的试,将其它的先注释掉,应该能解决的。

参考:http://www.cnblogs.com/scottckt/archive/2011/02/16/1955862.html


欢迎分享,转载请注明来源:内存溢出

原文地址:https://54852.com/bake/7895902.html

(0)
打赏 微信扫一扫微信扫一扫 支付宝扫一扫支付宝扫一扫
上一篇 2023-04-11
下一篇2023-04-11

发表评论

登录后才能评论

评论列表(0条)

    保存