很多時(shí)侯,我們需要在數(shù)據(jù)庫間復(fù)制大量數(shù)據(jù),如SQLSERVER提供的BCP.EXE命令行工具,在ADO.NET下SqlBulkCopy類提供了一個(gè)高性能的方法WriteToServer來復(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ù)庫與源數(shù)據(jù)庫之間批量復(fù)制數(shù)據(jù)
/// </summary>
/// <param name="SourceConnectionstr">源數(shù)據(jù)庫連接字符串</param>
/// <param name="TargetConnectionstr">目標(biāo)數(shù)據(jù)庫連接字符串</param>
/// <param name="SourceSQLstr">查詢數(shù)據(jù)的SQL語句,必須包含主鍵,否則更新不成功,并無錯(cuò)誤提示</param>
/// <param name="TargetTableName">更新目標(biāo)數(shù)據(jù)庫中的表名</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ù)。
聯(lián)系客服