为数据集插入关闭IDENTITY_INSERT

时间:2009-08-05 18:02:01

标签: sql-server dataset uniqueidentifier

我正在使用数据集插入从旧数据库转换的数据。要求是维护当前的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
  • 第三到n - 我的各种sql命令,包括select&刀片的

但命令之间总是有exec sp_reset_connection,我相信这会导致Identity_Insert设置中的值丢失。

有没有办法阻止我的数据集重置连接?

6 个答案:

答案 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')