我正在使用数据集插入从旧数据库转换的数据。要求是维护当前的Order_ID号码。
我尝试过使用:
SET IDENTITY_INSERT orders ON;
当我在SqlServer Management Studio中时,我能够成功
INSERT INTO orders (order_Id, ...) VALUES ( 1, ...);
但是,它不允许我通过我在转换脚本中使用的数据集插件来执行此操作。看起来基本上是这样的:
dsOrders.Insert(oldorderId, ...);
我也在这个过程中运行SQL(SET IDENTITY_INSERT命令为ON)。我知道我一次只能在一张桌子上这样做而且我是。
我一直得到这个例外:
尝试在orders表中插入值时出现异常 System.Data.SqlClient.SqlException:当IDENTITY_INSERT设置为OFF时,无法在表'orders'中为identity列插入显式值。
有什么想法吗?
更新
AlexS& AlexKuznetsov已经提到Set Identity_Insert是一个连接级别设置,但是,当我在SqlProfiler中查看SQL时,我注意到了几个命令。
SET IDENTITY_INSERT DEAL ON
exec sp_reset_connection
但命令之间总是有exec sp_reset_connection
,我相信这会导致Identity_Insert设置中的值丢失。
有没有办法阻止我的数据集重置连接?
答案 0 :(得分:52)
您可以选择混淆:
SET IDENTITY_INSERT orders ON
将开将特定值(您指定的值)插入带有IDENTITY列的表中。
SET IDENTITY_INSERT orders OFF
再次关闭该行为并恢复正常行为(您无法指定IDENTITY列的值,因为它们是自动生成的)。
马克
答案 1 :(得分:5)
您想要执行SET IDENTITY_INSERT 开启,以允许您插入标识列。
似乎有点倒退,但这就是它的工作方式。
答案 2 :(得分:3)
您似乎正在做的一切正确:SET IDENTITY_INSERT订单ON是 SQL Server端 的正确方法。但问题是你正在使用数据集。从您提供的代码中我可以说您正在使用 类型化数据集 - 基于数据库在Visual Studio中生成的那个。
如果是这种情况(最有可能),则 此数据集 包含一个约束,该约束不允许您为orderId字段设置值,即它是执行的代码不允许指定显式值,而不是SQL Server。您应该转到数据集设计器并编辑orderId字段的属性:将AutoIncrement和ReadOnly设置为false。但是可以在运行时执行相同的更改。这将允许您将orderId的显式值添加到数据集,然后将其保存到SQL Server表(您仍需要SET IDENTITY_INSERT)。
另请注意,IDENTITY_INSERT是一个连接级别的设置,因此您需要确保您正在执行相应的SET,以确保您将用于将更改保存到数据库的相同连接。
答案 3 :(得分:1)
我会使用Profiler来确定您的SET IDENTITY_INSERT命令是否为ON; 从与后续插入相同的连接发出,以及在插入期间执行的确切SQL。
答案 4 :(得分:1)
AlexS是正确的,问题是Insert_Identity工作,但它是一个连接级别设置,所以我需要在事务中设置Insert_Identity。
我使用了Ryan Whitaker的TableAdapterHelper代码
我在运行Identity_Insert的tableadapter上创建了一个更新命令。然后,我必须创建一个新的Insert命令,并指定Identity列。然后我运行了这段代码
SqlTransaction transaction = null;
try
{
using (myTableAdapter myAdapter = new myTableAdapter())
{
transaction = TableAdapterHelper.BeginTransaction(myAdapter);
myAdapter.SetIdentityInsert();
myAdapter.Insert(myPK,myColumn1,myColumn2,...);
}
transaction.Commit();
}
catch(Exception ex)
{
transaction.Rollback();
}
finally
{
transaction.Dispose();
}
答案 5 :(得分:0)
如果您仍然遇到" insert_identity" ,您可以尝试使用完整插入语句,如:
插入用户(Id,Name)值(1,' jeff')