| 很多時(shí)侯,我們需要在數(shù)據(jù)庫(kù)間復(fù)制大量數(shù)據(jù),如SQLSERVER提供的BCP.EXE命令行工具,在ADO.NET下SqlBulkCopy類提供了一個(gè)高性能的方法WriteToServer來(lái)復(fù)制數(shù)據(jù)。該方法可以接受一個(gè)DataRow對(duì)像數(shù)據(jù)、一個(gè)實(shí)現(xiàn)IDbDataReader接口的對(duì)像和一個(gè)DataTable,或者接受一個(gè)DataTable對(duì)像和一個(gè)DataRowState枚舉值,以實(shí)現(xiàn)從大多數(shù)位置中獲取數(shù)據(jù)。         /// <summary>/// 在目標(biāo)數(shù)據(jù)庫(kù)與源數(shù)據(jù)庫(kù)之間批量復(fù)制數(shù)據(jù)
 /// </summary>
 /// <param name="SourceConnectionstr">源數(shù)據(jù)庫(kù)連接字符串</param>
 /// <param name="TargetConnectionstr">目標(biāo)數(shù)據(jù)庫(kù)連接字符串</param>
 /// <param name="SourceSQLstr">查詢數(shù)據(jù)的SQL語(yǔ)句,必須包含主鍵,否則更新不成功,并無(wú)錯(cuò)誤提示</param>
 /// <param name="TargetTableName">更新目標(biāo)數(shù)據(jù)庫(kù)中的表名</param>
 /// <returns>Boolean</returns>
 public static Boolean dbtodb(string SourceConnectionstr,  string TargetConnectionstr, string SourceSQLstr,  string TargetTableName)
 {
 System.Data.SqlClient.SqlConnection SourceConn= new  System.Data.SqlClient.SqlConnection();
 System.Data.SqlClient.SqlConnection TargetConn = new System.Data.SqlClient.SqlConnection();
 try
 {
 SourceConn.ConnectionString = SourceConnectionstr;
 TargetConn.ConnectionString = TargetConnectionstr;
 System.Data.SqlClient.SqlCommand cmd = SourceConn.CreateCommand();
 cmd.CommandType = CommandType.Text;
 cmd.CommandText = SourceSQLstr;
                 SourceConn.Open();TargetConn.Open();
                 using (System.Data.SqlClient.SqlDataReader rdr = cmd.ExecuteReader()){
 //MessageBox.Show (rdr.HasRows.ToString()) ;
 if (!rdr.HasRows)
 {
 return false;
 }
 using (System.Data.SqlClient.SqlBulkCopy bc = new System.Data.SqlClient.SqlBulkCopy(TargetConn))
 {
 //超時(shí)之前操作所允許完成的秒數(shù)
 bc.BulkCopyTimeout = 360;
 //目標(biāo)服務(wù)器上的表名
 bc.DestinationTableName = TargetTableName;
 bc.WriteToServer(rdr);
 }
 }
 }
 catch
 {
 throw;
 }
 finally
 {
                 //關(guān)閉連接SourceConn.Close();
 TargetConn.Close();
 }
             return true; } 如果想以最少資源獲取最佳性能,就考濾使用IDbDateReader參數(shù)。 |