SqlBulkCopy(大数据量拷贝)

本文介绍了一种使用SqlBulkCopy进行数据批量迁移的方法,包括执行前的预处理脚本及事务回滚处理机制。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

/// <summary>
/// 批量执行SqlBulkCopy数据迁移操作
/// </summary>
/// <param name="dtblSource">数据源</param>
/// <param name="strPreSqlSentence">执行前需要执行的脚本,如先清空表等,可为空</param>
/// <param name="strDestinationTablesName">目标数据库表名称</param>
/// <returns></returns>
public static bool ExeSqlBulkCopy(DataTable dtblSource, string strPreSqlSentence,string strDestinationTablesName)
{
    
using (SqlConnection connection = new SqlConnection(connectionString))
    {
        
bool blReturnValue = false; connection.Open();

        
//请在插入数据的同时检查约束,如果发生错误调用 sqlbulkTransaction事务
        SqlTransaction sqlbulkTransaction = connection.BeginTransaction();
        
        
if (strPreSqlSentence != "")
        {
            SqlCommand sqlCmd 
= new SqlCommand();
            sqlCmd.Connection 
= connection; sqlCmd.Transaction = sqlbulkTransaction;

            
try
            {
                sqlCmd.CommandText 
= strPreSqlSentence; sqlCmd.ExecuteNonQuery(); blReturnValue = true;
            }
            
catch (Exception exc)
            {
                Log.WriteLog(
"批量插入前语句失败", exc); sqlbulkTransaction.Rollback(); connection.Close(); return false;
            }
        }

        SqlBulkCopy BulkCopy 
= new SqlBulkCopy(connection, SqlBulkCopyOptions.CheckConstraints, sqlbulkTransaction);

        BulkCopy.DestinationTableName 
= strDestinationTablesName; BulkCopy.BulkCopyTimeout = 1200;

        
try
        {
            BulkCopy.WriteToServer(dtblSource); sqlbulkTransaction.Commit(); blReturnValue 
= true;
        }
        
catch (Exception exp)
        {
            sqlbulkTransaction.Rollback(); Log.WriteLog(
"批量插入语句失败", exp); blReturnValue = false;
        }
        
finally
        {
            BulkCopy.Close(); connection.Close();
        }

        
return blReturnValue;
    }
}

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值