微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

关于数据的导入问题

class Program  
   {  
      
static volatile bool result;  
      
static void Main(string[] args)  
       {  
          DataSet ds
= ExportDataSet();  
 
         
//使用2个线程模拟并发操作  
          Thread t = new Thread(delegate() { result = Insert(ds); Console.WriteLine(result ? "导入成功" : "导入失败"); });  
          t.Start();  
          Thread t1
= new Thread(delegate() { result = Insert(ds); Console.WriteLine(result ? "导入成功" : "导入失败"); });  
          t1.Start();  
          Console.ReadLine();  
       }  
 
      
/// <summary>  
      
/// 获取数据DataSet  
      
/// </summary>  
      
/// <returns></returns>  
 
      
static private DataSet ExportDataSet()  
       {  
 
          
//局域网的某服务器模拟数据库远程连接  
           sqlConnection RemoteConn = new sqlConnection("Data Source=192.168.0.183;Initial Catalog=northwind;User ID=sa;Password=sa");  
 
 
 
          
using (  
 
           
/*目标表与源表结构并不相同,目标表只包含OrderID、CustomerID、EmployeeID、ShipCountry这四个字段。注意这里字段是区分大小写的,不然sqlBulkcopy的WritetoServer方法会报运行时异常:“给定的 ColumnMapping 与源或目标中的任意列均不匹配”的处理方法。这个地方浪费了我1个小时才发现*/ 
            sqlDataAdapter oda
= new sqlDataAdapter("SELECT [OrderID],[CustomerID],[EmployeeID],[ShipCountry] FROM [northwind].[dbo].[Orders]",RemoteConn))  
 
          
//如果目标表与源表结构完全一致,则用下面语句即可,msdn的例子也只是这样  
 
           
//sqlDataAdapter oda = new sqlDataAdapter("SELECT * FROM [ednoland].[dbo].[score]",RemoteConn))  
           {  
               DataSet ds
= new DataSet();  
 
               oda.Fill(ds,
"Orders");//给定表名  
 
                
return ds;  
 
           }  
 
       }  
 
      
/// <summary>  
      
/// 将DataSet导入远程数据库(未来放在WebService中)  
      
/// </summary>  
      
/// <param name="ds"></param>  
      
/// <returns></returns>  
       public static bool Insert(DataSet ds)  
       {  
 
 
          
using (sqlConnection sqlconn = new sqlConnection("Data Source=.;Initial Catalog=northwind;User ID=sa;Password=sa"))  
           {  
               sqlconn.open();  
               sqlTransaction sqlbulkTransaction
= sqlconn.BeginTransaction(IsolationLevel.ReadCommitted);  
 
 
 
              
using (sqlBulkcopy sbc = new sqlBulkcopy(sqlconn,sqlBulkcopyOptions.KeepIdentity,sqlbulkTransaction))  
               {  
                   sbc.BatchSize
= 20000;//20000行每连接  
                   sbc.BulkcopyTimeout = 50;//50秒超时  
                   if (ds.Tables == null || ds.Tables.Count == 0)  
                      
return false;  
 
                  
if (ds.Tables.Count == 1)  
                   {  
 
 
                      
return BulkInsert(sbc,ds.Tables[0],sqlbulkTransaction); ;  
 
                   }  
                  
else 
                   {  
                      
bool res = true;  
                      
foreach (DataTable dt in ds.Tables)  
                       {  
 
                           res
= BulkInsert(sbc,dt,sqlbulkTransaction);  
 
                       }  
                      
return res;  
                   }  
 
               }  
           }  
 
       }  
 
      
private static bool BulkInsert(sqlBulkcopy sbc,DataTable dt,sqlTransaction sqlbulkTransaction)  
       {  
          
          
bool res = true;  
                     
try 
           {  
 
            
//将DataTable表名作为待导入库中的目标表名  
               sbc.DestinationTableName = dt.TableName;  
 
 
 
             
//将数据集合和目标服务器库表中的字段对应  
               for (int i = 0; i < dt.Columns.Count; i++)  
               {  
                  
//sbc.columnmappings.Add(dt.Columns[i].ColumnName,dt.Columns[i].ColumnName);  
                     sbc.columnmappings.Add(i,i);//可以避免字段大小写不一致造成无法映射的问题  
               }  
 
               sbc.WritetoServer(dt);  
 
              
//提交事务  
               sqlbulkTransaction.Commit();  
               res
= true;  
           }  
          
catch (sqlException ex)  
           {  
               res
= false;  
               sqlbulkTransaction.Rollback();  
           }  
 
          
return res;          }      } 

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 [email protected] 举报,一经查实,本站将立刻删除。

相关推荐