我正在使用SqlBulkCopy
将数据从一个表复制到另一个表。有很多表可以做到这一点。
我正在使用for循环为每个表复制数据。
但是,我遇到了一个问题,每当我将数据从源表复制到目标表时,身份列值就会发生变化。
假设在源表的标识列中有这样的值
301
305
605
但是当我复制数据时,它将导入目标表中,就像那样
1
2
3
我试过了:
set identity_insert [tablename] ON
//COPY Data from source to destination
set identity_insert [tablename] OFF
我还设置SqlBulkCopyOption.KeepIdentity
我的c#代码
// Dataservice.KeepIdentity2("SET IDENTITY_INSERT "+tableName+" ON");
using (SqlBulkCopy bulkCopy =
new SqlBulkCopy(ConfigurationManager.ConnectionStrings["ConnectionDatabase2"].ConnectionString, SqlBulkCopyOptions.KeepNulls & SqlBulkCopyOptions.KeepIdentity))
{
bulkCopy.SqlRowsCopied +=
new SqlRowsCopiedEventHandler(OnSqlRowsTransfer);
bulkCopy.BatchSize = 5000;
bulkCopy.DestinationTableName = tableName;
bulkCopy.WriteToServer(DestinationDatatable);
}
//Set Identity insert OFF
// Dataservice.KeepIdentity2("SET IDENTITY_INSERT " + tableName + " OFF");
任何解决方案都将受到高度赞赏
答案 0 :(得分:3)
我相信你有正确的想法。问题似乎是一个布尔逻辑问题。 你有:SqlBulkCopyOptions.KeepNulls& SqlBulkCopyOptions.KeepIdentity 这两个项的值是:
SqlBulkCopyOptions.KeepNulls = 8 = 00001000
SqlBulkCopyOptions.KeepIdentity = 1 = 00000001
布尔"&"运算符将两个值放在一起(意味着保留二进制中常见的位)。该操作的值导致零。 你真正想要的是一个OR:8 | 1 = 9
new SqlBulkCopy(ConfigurationManager.ConnectionStrings [" ConnectionDatabase2"] .ConnectionString,SqlBulkCopyOptions.KeepNulls | SqlBulkCopyOptions.KeepIdentity))
与英语措辞相比,布尔运算符有点落后:如果你想要KeepNulls并想要KeepIdentity,那么你需要将这两个值组合在一起。