博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
SQL Server 批量写入(BuldInsert)的例子
阅读量:4042 次
发布时间:2019-05-24

本文共 6939 字,大约阅读时间需要 23 分钟。

///         ///大批量数据插入        ///         /// 数据表        /// 数据库连接字符串        /// 
public bool SqlServerBulkInsert(DataTable table, string connectionString) {
try {
using (SqlConnection conn = new SqlConnection(connectionString)) {
conn.Open(); SqlTransaction trans = conn.BeginTransaction(); SqlBulkCopy sqlbulkCopy = new SqlBulkCopy(conn, SqlBulkCopyOptions.Default, trans); // 设置源表名称 sqlbulkCopy.DestinationTableName = table.TableName; //分几次拷贝 //sqlbulkCopy.BatchSize = 10; // 设置超时限制 sqlbulkCopy.BulkCopyTimeout = CommandTimeOut; foreach (DataColumn dtColumn in table.Columns) {
sqlbulkCopy.ColumnMappings.Add(dtColumn.ColumnName, dtColumn.ColumnName); } try {
// 写入 sqlbulkCopy.WriteToServer(table); // 提交事务(经测试2021-01-02,事务是起作用的,要么全部成功写入,要么零写入) trans.Commit(); return true; } catch {
trans.Rollback(); sqlbulkCopy.Close(); return false; } finally {
conn.Close(); conn.Dispose(); sqlbulkCopy.Close(); } } } catch (Exception e) {
DbLog.WriteException(e); return false; } }

VB.

'     '大批量数据插入    '     ' Dataset    ' Connection String    ' Exec Command text before BulkInsert     ' Parameters of exec Command     ' Prepare Command Type (SQL / PRO)    ' 
Public Function BulkInsert(ByVal insertDataSet As DataSet, ByVal connString As String, ByVal preCmdTxt As String, ByVal preSqlPara() As SqlParameter, ByVal preCmdType As String) As Boolean Try Using conn As New SqlConnection(connString) If conn.State = ConnectionState.Closed Then conn.Open() End If Dim trans = conn.BeginTransaction() Dim sqlBulkCopy = New SqlBulkCopy(conn, SqlBulkCopyOptions.Default, trans) sqlBulkCopy.BulkCopyTimeout = 100 'time out seconds Try 'exec pre command before bulk insert If Not String.IsNullOrEmpty(preCmdTxt) Then Dim cmd As SqlCommand = conn.CreateCommand() cmd.CommandText = preCmdTxt cmd.Transaction = trans If preCmdType.ToUpper() = "PRO" Then ' Stored procedure cmd.CommandType = CommandType.StoredProcedure End If If Not preSqlPara Is Nothing Then cmd.Parameters.AddRange(preSqlPara) End If cmd.ExecuteNonQuery() End If ' ForLoop to bulk insert the table in the dataset For Each insertTable In insertDataSet.Tables.OfType(Of DataTable) sqlBulkCopy.DestinationTableName = insertTable.TableName sqlBulkCopy.ColumnMappings.Clear() For Each dtColumn In insertTable.Columns.OfType(Of DataColumn) sqlBulkCopy.ColumnMappings.Add(dtColumn.ColumnName, dtColumn.ColumnName) '注意:1.两个表的列名要相同;当然,改一下传入参数为两个表(源表,目标表),则可以做到列名不一样,只要求字段类型一样;2.可以只批量插入部分字段,须留意非空字段和已设默认值 Next sqlBulkCopy.WriteToServer(insertTable) 'insert to table Next trans.Commit() Return True Catch ex As Exception trans.Rollback() Return False Finally conn.Close() conn.Dispose() sqlBulkCopy.Close() End Try End Using Catch ex As Exception Return False End Try End Function ' '大批量数据插入 ' ' Dataset ' Connection String ' Exec Command text before BulkInsert ' Parameters of exec Command ' Prepare Command Type (SQL / PRO) '
Public Function BulkInsert(ByVal insertDataSet As DataSet, ByVal connString As String, ByVal preCmdTxt As String, ByVal preSqlPara() As SqlParameter, ByVal preCmdType As String) As Boolean Try Using conn As New SqlConnection(connString) If conn.State = ConnectionState.Closed Then conn.Open() End If Dim trans = conn.BeginTransaction() Dim sqlBulkCopy = New SqlBulkCopy(conn, SqlBulkCopyOptions.Default, trans) sqlBulkCopy.BulkCopyTimeout = 100 'time out seconds Try 'exec pre command before bulk insert If Not String.IsNullOrEmpty(preCmdTxt) Then Dim cmd As SqlCommand = conn.CreateCommand() cmd.CommandText = preCmdTxt cmd.Transaction = trans If preCmdType.ToUpper() = "PRO" Then ' Stored procedure cmd.CommandType = CommandType.StoredProcedure End If If Not preSqlPara Is Nothing Then cmd.Parameters.AddRange(preSqlPara) End If cmd.ExecuteNonQuery() End If ' ForLoop to bulk insert the table in the dataset For Each insertTable In insertDataSet.Tables.OfType(Of DataTable) sqlBulkCopy.DestinationTableName = insertTable.TableName sqlBulkCopy.ColumnMappings.Clear() For Each dtColumn In insertTable.Columns.OfType(Of DataColumn) sqlBulkCopy.ColumnMappings.Add(dtColumn.ColumnName, dtColumn.ColumnName) Next sqlBulkCopy.WriteToServer(insertTable) 'insert to table Next trans.Commit() Return True Catch ex As Exception trans.Rollback() Return False Finally conn.Close() conn.Dispose() sqlBulkCopy.Close() End Try End Using Catch ex As Exception Return False End Try End Function

转载地址:http://himdi.baihongyu.com/

你可能感兴趣的文章
UIColor 转换为 UIImage 《转》
查看>>
<iOS4>Switching between front an…
查看>>
opencv pca
查看>>
OpenCV做PCA的一个详尽的介…
查看>>
iOS 中用代码写字体,并加入…
查看>>
《转》深入浅出 Cocoa 多线程编程…
查看>>
多target
查看>>
用 HTTP 压缩加快 Web 数据…
查看>>
iOS学习笔记——字符串编码转…
查看>>
GDataXMLNode应用小谈
查看>>
做彩票客户端里涉及支付宝相关收获
查看>>
GData 解析Xml以及写xml到文…
查看>>
In App Purchase 详细介绍
查看>>
iOS运行回路(RunLoop)总结
查看>>
《转》iphone线程中使用异步网络的…
查看>>
iPhone开发中静态库中的Category使…
查看>>
去掉字符串中不能作为文件名的特殊…
查看>>
常用SQL说明
查看>>
在iOS中使用重定向,把控制台内容…
查看>>
SQLibs iOS开发常用代码库
查看>>