很多时侯,我们需要在数据库间复制大量数据,如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参数。