使用事务和SqlBulkCopy导入大批量数据

时间:2022-01-08 06:38:04
使用事务和SqlBulkCopy导入大批量数据
个人测试所用。调用请修改。
///   <summary>
///  使用事务和SqlBulkCopy批量导入数据 示例
///  By Conan304 2009年8月29日21:51:02        
///   </summary>
///   <param name="phone"></param>
///   <param name="smsInfo"></param>
private   static   void  SqlBulkCopyData( string [] phone,  string  smsInfo)
{

    
if  (phone  ==   null return ;

    
// 生成DataTable
    DataTable dataTable  =   new  DataTable();

    DataColumn column 
=   new  DataColumn();

    
// qy_id            
    column.DataType  =  System.Type.GetType( " System.Int32 " );
    column.ColumnName 
=   " QY_ID " ;
    dataTable.Columns.Add(column);

    
// Info_ID
    column  =   new  DataColumn();
    column.DataType 
=  System.Type.GetType( " System.String " );
    column.MaxLength 
=   32 ;
    column.ColumnName 
=   " Info_ID " ;
    dataTable.Columns.Add(column);

    
// SP_Port
    column  =   new  DataColumn();
    column.DataType 
=  System.Type.GetType( " System.String " );
    column.MaxLength 
=   24 ;
    column.ColumnName 
=   " SP_Port " ;
    dataTable.Columns.Add(column);

    
// Phone
    column  =   new  DataColumn();
    column.DataType 
=  System.Type.GetType( " System.String " );
    column.MaxLength 
=   11 ;
    column.ColumnName 
=   " Phone " ;
    dataTable.Columns.Add(column);

    
// Content
    column  =   new  DataColumn();
    column.DataType 
=  System.Type.GetType( " System.String " );
    column.MaxLength 
=   300 ;
    column.ColumnName 
=   " Content " ;
    dataTable.Columns.Add(column);

    
// SendTime
    column  =   new  DataColumn();
    column.DataType 
=  System.Type.GetType( " System.DateTime " );
    column.ColumnName 
=   " SendTime " ;
    column.DefaultValue 
=  DateTime.Now;
    dataTable.Columns.Add(column);

    
// SendLevel
    column  =   new  DataColumn();
    column.DataType 
=  System.Type.GetType( " System.Int32 " );
    column.ColumnName 
=   " SendLevel " ;
    column.DefaultValue 
=   4 ;
    dataTable.Columns.Add(column);

    
// IsLong
    column  =   new  DataColumn();
    column.DataType 
=  System.Type.GetType( " System.Int32 " );
    column.ColumnName 
=   " IsLong " ;
    dataTable.Columns.Add(column);

    
// AdminID
    column  =   new  DataColumn();
    column.DataType 
=  System.Type.GetType( " System.Int32 " );
    column.ColumnName 
=   " AdminID " ;
    column.DefaultValue 
=   0 ;
    dataTable.Columns.Add(column);

    
string [] result  =   new   string [phone.Length];

    
for  ( int  i  =   0 ; i  <  phone.Length; i ++ )
    {
        
// 生成GUID
         string  Guid  =  System.Guid.NewGuid().ToString( " N " ).ToUpper();
        
string  phoneNew  =   string .Empty;
        
int  phoneType  =  GetMobileType(phone[i],  out  phoneNew);
        
if  (phoneType  ==   0 )
        {
            result[i] 
=  phoneNew  +   " -0-0 " ;
        }
        
else
        {
            DataRow dataRow 
=  dataTable.NewRow();
            dataRow[
" qy_id " =   16 ;
            dataRow[
" Info_ID " =  Guid;
            dataRow[
" SP_Port " =   " 10657027014211 " ;
            dataRow[
" Phone " =  phoneNew;
            dataRow[
" Content " =  smsInfo;
            dataRow[
" IsLong " =   0 ;
            dataTable.Rows.Add(dataRow);
            result[i] 
=  phoneNew  +   " -1- "   +  Guid;
        }
    }

    
// BCP copy
    SqlConnection conn  =   new  SqlConnection();
    conn.ConnectionString 
=   " server=.;uid=dmkj_hpc;pwd=#$wlh*&1110h%c;database=DMKJ_SMS " ;
    conn.Open();

    SqlTransaction sqlbulkTransaction 
=  conn.BeginTransaction();

    
// 请在插入数据的同时检查约束,如果发生错误调用sqlbulkTransaction事务
    SqlBulkCopy copy  =   new  SqlBulkCopy(conn, SqlBulkCopyOptions.CheckConstraints, sqlbulkTransaction);


    copy.DestinationTableName 
=   " T_SMS_SendInfo " ;
    
foreach  (DataColumn dc  in  dataTable.Columns)
    {
        copy.ColumnMappings.Add(dc.ColumnName, dc.ColumnName);

    }
    
try
    {
        copy.WriteToServer(dataTable);
        sqlbulkTransaction.Commit();
    }
    
catch  (Exception ex)
    {
        sqlbulkTransaction.Rollback();
        Console.WriteLine(ex.ToString());
    }
    
finally
    {
        copy.Close();
        conn.Close();
    }


    
// for (int x = 0; x < dataTable.Rows.Count; x++)
    
// {
    
//     for (int i = 0; i < dataTable.Columns.Count; i++)
    
//     {
    
//         Console.WriteLine("Column Name:{0},and value is:{1}",dataTable.Columns[i].ColumnName.ToString(),dataTable.Rows[x][i].ToString());
    
//     }
    
//     Console.WriteLine();
    
// }

    
// foreach (string str in result)
    
// {
    
//     Console.WriteLine(str.ToString());
    
// }
}


昨天(2009.8.28)看到网易的新闻,大傻(成奎安)患鼻咽癌过世。一路走好,永远的大傻。