C# 如何在SQL批量复制到另一个表期间维护标识列值?
我正在使用C# 如何在SQL批量复制到另一个表期间维护标识列值?,c#,sql,asp.net,sql-server,C#,Sql,Asp.net,Sql Server,我正在使用SqlBulkCopy将数据从一个表复制到另一个表。有那么多桌子可以做这个 我正在复制每个表的for循环数据 但是,我面临一个问题,每当我将数据从源表复制到目标表时,标识列值就会发生变化 假设在源表的标识列中有这样的值 301 305 605 但当我复制数据时,它会像这样导入到目标表中 1 2 3 我试过: set identity_insert [tablename] ON //COPY Data from source to destination s
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代码
任何解决方案都将受到高度赞赏我相信您的想法是正确的。这个问题似乎是一个布尔逻辑问题。 您有:SqlBulkCopyOptions.KeepNulls和SqlBulkCopyOptions.KeepIdentity 这两项的值为: SqlBulkCopyOptions.KeepNulls=8=00001000 SqlBulkCopyOptions.KeepIdentity=1=0000000 1 布尔“&”运算符将两个值相加(意味着保留二进制中的公共位)。此操作的值将导致零。 你真正想要的是OR:8 | 1=9 新的SqlBulkCopy(ConfigurationManager.ConnectionString[“ConnectionDatabase2”]。ConnectionString,SqlBulkCopyOptions.KeepNulls | SqlBulkCopyOptions.KeepIdentity))
与英语相比,布尔运算符有点落后:如果要保留ulls和KeepIdentity,则需要将这两个值合并在一起。KeepIdentity是解决这一问题的标准解决方案。您的代码中有一个bug。没人,代码看起来很完美,但每次在目标表关闭问题中,标识列都会重置,因为OP不愿意提供诊断问题所需的信息。这使得这个问题无法回答。如果你的代码是完美的,为什么会有问题?好吧,对不起,我不是指你说的“展示”这个词我已经粘贴了我的代码,请看一下。
// 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");