很多时侯,我们需要在数据库间复制大量数据,如SQLSERVER提供的BCP.EXE命令行工具,在ADO.NET下SqlBulkCopy类提供了一个高性能的方法WriteToServer来复制数据。该方法可以接受一个DataRow对像数据、一个实现IDbDataReader接口的对像和一个DataTable,或者接受一个DataTable对像和一个DataRowState枚举值,以实现从大多数位置中获取数据。
/// <summary> /// 在目标数据库与源数据库之间批量复制数据 /// </summary> /// <param name="SourceConnectionstr">源数据库连接字符串</param> /// <param name="TargetConnectionstr">目标数据库连接字符串</param> /// <param name="SourceSQLstr">查询数据的SQL语句,必须包含主键,否则更新不成功,并无错误提示</param> /// <param name="TargetTableName">更新目标数据库中的表名</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)) { //超时之前操作所允许完成的秒数 bc.BulkCopyTimeout = 360; //目标服务器上的表名 bc.DestinationTableName = TargetTableName; bc.WriteToServer(rdr); } } } catch { throw; } finally {
//关闭连接 SourceConn.Close(); TargetConn.Close(); }
return true;
}
如果想以最少资源获取最佳性能,就考滤使用IDbDateReader参数。
|