【发布时间】:2017-01-05 01:03:16
【问题描述】:
我基本上来自数据库背景和 .net 的新手。如果我的问题听起来很愚蠢,请多多包涵。
我在代码中使用 SqlBulkCopy 将数据从一个 SQL Server 传输到另一个。但由于网络问题,它经常失败。为了避免这种情况,我打算做两件事
减少批量大小(从 5000 到 1000)并增加超时(从 3 分钟到 1 分钟)
实现重试逻辑
我的问题是
- 实现重试的最佳方式是什么,即在表级别或批处理级别(如果可能的话)?
- 我在这里找到了一些用于弹性 SQL Azure 的框架:https://msdn.microsoft.com/en-us/library/hh680934(v=pandp.50).aspx SQL Server 2008 R2 有类似的东西吗?
我正在使用的示例代码:
private void BulkCopyTable(string schemaName, string tableName)
{using (var reader = srcConnection.ExecuteReader($"select * from [{SourceDBName}].[{schemaName}].[{tableName}]"))
{
const SqlBulkCopyOptions bulkCopyOptions = SqlBulkCopyOptions.TableLock | SqlBulkCopyOptions.FireTriggers |
SqlBulkCopyOptions.KeepNulls |
SqlBulkCopyOptions.KeepIdentity;
using (var bcp = new SqlBulkCopy(dstConnection.ConnectionString, bulkCopyOptions))
{
const int threeMinutes = 60*3;
bcp.BulkCopyTimeout = threeMinutes; //Timeout is for a single batch
bcp.BatchSize = 5000;
bcp.DestinationTableName = $"[{DestinationDB}].[{schemaName}].[{tableName}]";
bcp.EnableStreaming = true;
foreach (var col in table.Columns.Cast<Column>().Where(c => !c.Computed))
{
bcp.ColumnMappings.Add(col.Name, col.Name);
}
bcp.WriteToServer(reader);
}
}
}
【问题讨论】:
-
显示一些您正在执行 SqlBulkCopy 的 C# 代码。
-
@SarveshMishra,用代码更新了描述。
标签: c# .net sql-server sql-server-2008-r2 sqlbulkcopy