本文介绍向RDS SQL Server数据库批量导入数据的三种方式,分别是通过BCP命令方式、通过JDBC SQLBulkCopy方式、通过ADO.NET SQLBulkCopy方式。
阿里云提醒您:
如果您对实例或数据有修改、变更等风险操作,务必注意实例的容灾、容错能力,确保数据安全。
如果您对实例(包括但不限于ECS、RDS)等进行配置与数据修改,建议提前创建快照或开启RDS日志备份等功能。
如果您在阿里云平台授权或者提交过登录账号、密码等安全信息,建议您及时修改。
背景信息
云数据库RDS SQL Server版支持Bulk Insert批量导入数据,但是存在一定限制,限制原因是因为会触发RDS SQL Server 2008 R2版本实例的一个Bug,需要在使用时将CheckConstraints选项开启。
本文提供的三种数据导入方法中,开启CheckConstraints
的方式各不相同:
使用BCP命令行工具时,需要在命令中包含
/h "CHECK_CONSTRAINTS"
参数。使用JDBC的
SQLServerBulkCopy
类时,需要通过SQLServerBulkCopyOptions
设置setCheckConstraints(true)
。使用ADO.NET的
SqlBulkCopy
类时,需在构造函数中指定SqlBulkCopyOptions.CheckConstraints
。
方式一:通过BCP命令方式
通过BCP命令生成一个XML格式文件,并利用生成的格式文件将数据文件批量导入数据库。
生成XML格式文件,命令如下:
bcp [数据库名].[架构名].表名 format nul /c /t"," /x /f "路径\格式文件名.xml" /U 用户名 /P 密码 /S "服务器地址,端口号"
示例如下:
bcp jacky.dbo.my_bcp_test format nul /c /t"," /x /f "d:\tmp\my_bcp_test.xml" /U jacky /P xxxx /S "xxx.sqlserver.rds.aliyuncs.com,3333"
导入数据,命令如下:
bcp [数据库名].[架构名].表名 in "数据文件路径" /f "格式文件路径" /q /k /h "CHECK_CONSTRAINTS" /U 用户名 /P 密码 /S "服务器地址,端口号"
示例如下:
bcp jacky.dbo.my_bcp_test in "d:\tmp\my_test_data_file.txt" /f "d:\tmp\my_bcp_test.xml" /q /k /h "CHECK_CONSTRAINTS" /U jacky /P xxx /S "rm-bp1sc****.sqlserver.rds.aliyuncs.com, 1433"
方式二:通过JDBC SQLBulkCopy方式
使用SQLServerBulkCopy
类来实现数据的批量导入。
SQLServerBulkCopyOptions copyOptions = new SQLServerBulkCopyOptions();
copyOptions.setCheckConstraints(true);
更多详情,请参见通过JDBC驱动程序使用大容量复制。
方式三:通过ADO.NET SQLBulkCopy方式
通过ADO.NET框架中的SQLBulkCopy
方式实现数据批量导入。
static void Main()
{
string srcConnString = "Data Source=(local);Integrated Security=true;Initial Catalog=testdb";
string desConnString = "Data Source=****.sqlserver.rds.aliyuncs.com,3433;User ID=**;Password=**;Initial Catalog=testdb";
SqlConnection srcConnection = new SqlConnection();
SqlConnection desConnection = new SqlConnection();
SqlCommand sqlcmd = new SqlCommand();
SqlDataAdapter da = new SqlDataAdapter();
DataTable dt = new DataTable();
srcConnection.ConnectionString = srcConnString;
desConnection.ConnectionString = desConnString;
sqlcmd.Connection = srcConnection;
sqlcmd.CommandText = @"SELECT top 1000000 [PersonType],[NameStyle],[Title],[FirstName],[MiddleName],[LastName],[Suffix],[EmailPromotion]
,[AdditionalContactInfo],[Demographics],NULL as rowguid,[ModifiedDate] FROM [testdb].[dbo].[Person]";
sqlcmd.CommandType = CommandType.Text;
sqlcmd.Connection.Open();
da.SelectCommand = sqlcmd;
da.Fill(dt);
using (SqlBulkCopy blkcpy = new SqlBulkCopy(desConnString, SqlBulkCopyOptions.CheckConstraints))
//using (SqlBulkCopy blkcpy = new SqlBulkCopy(desConnString, SqlBulkCopyOptions.Default))
{
blkcpy.BatchSize = 2000;
blkcpy.BulkCopyTimeout = 5000;
blkcpy.SqlRowsCopied += new SqlRowsCopiedEventHandler(OnSqlRowsCopied);
blkcpy.NotifyAfter = 2000;
foreach (DataColumn dc in dt.Columns)
{
blkcpy.ColumnMappings.Add(dc.ColumnName, dc.ColumnName);
}
try
{
blkcpy.DestinationTableName = "Person";
blkcpy.WriteToServer(dt);
}
catch (Exception ex)
{
Console.WriteLine(ex.Message);
}
finally
{
sqlcmd.Clone();
srcConnection.Close();
desConnection.Close();
}
}
}
private static void OnSqlRowsCopied(
object sender, SqlRowsCopiedEventArgs e)
{
Console.WriteLine("Copied {0} so far...", e.RowsCopied);
}
适用于
云数据库RDS SQL Server版