【问题标题】:Turn off IDENTITY_INSERT for Dataset insert为数据集插入关闭 IDENTITY_INSERT
【发布时间】:2010-11-17 02:43:06
【问题描述】:

我正在使用数据集插入从旧数据库转换的数据。要求是保持当前的 Order_ID 编号。

我尝试过使用:

SET IDENTITY_INSERT orders ON;

当我在 SqlServer Management Studio 中时,这有效,我能够成功

INSERT INTO orders (order_Id, ...) VALUES ( 1, ...);

但是,它不允许我通过我在转换脚本中使用的数据集插入来执行此操作。基本上是这样的:

dsOrders.Insert(oldorderId, ...);

在此过程中我也运行了 SQL(SET IDENTITY_INSERT 命令打开)。我知道我一次只能对一张桌子这样做,而且我是。

我不断收到此异常:

尝试向订单表中插入值时出现异常 System.Data.SqlClient.SqlException:当 IDENTITY_INSERT 设置为 OFF 时,无法在表“订单”中插入标识列的显式值。

有什么想法吗?

更新

AlexS 和 AlexKuznetsov 提到 Set Identity_Insert 是一个连接级别设置,但是,当我查看 SqlProfiler 中的 SQL 时,我注意到几个命令。

  • 首先 - SET IDENTITY_INSERT DEAL ON
  • 第二个-exec sp_reset_connection
  • 第三到 n - 我的各种 sql 命令,包括选择和插入的

虽然命令之间总是有一个exec sp_reset_connection,但我相信这是导致 Identity_Insert 设置值丢失的原因。

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

【问题讨论】:

    标签: sql-server dataset uniqueidentifier


    【解决方案1】:

    如果您仍然对 "insert_identity" 有问题,您可以尝试使用 完整的插入语句,例如:

    插入 User(Id, Name) 值 (1,'jeff')

    【讨论】:

      【解决方案2】:

      AlexS 是正确的,问题是 Insert_Identity 有效,但它是连接级别设置,所以我需要在事务中设置 Insert_Identity。

      我使用了 Ryan Whitaker 的 TableAdapterHelper 代码

      我在运行 Identity_Insert 的 tableadapter 上创建了一个更新命令。然后,我必须创建一个新的插入命令,并指定 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();
       }
      

      【讨论】:

        【解决方案3】:

        我会使用 Profiler 来确定您的 SET IDENTITY_INSERT 是否命令为 ON; 从与您后续插入相同的连接发出,以及在插入期间执行的确切 SQL。

        【讨论】:

          【解决方案4】:

          看来您做的一切都是正确的:SET IDENTITY_INSERT 命令 ON 是 SQL Server 方面的正确方法。但问题是您正在使用数据集。从您提供的代码中,我可以说您使用的是类型化数据集——它是在 Visual Studio 中基于数据库生成的。

          如果是这种情况(很可能),那么 此数据集 包含一个不允许您为 orderId 字段设置值的约束,即它是执行此操作的代码不允许指定显式值,而不是 SQL Server。您应该转到数据集设计器并编辑 orderId 字段的属性:将 AutoIncrement 和 ReadOnly 设置为 false。但是可以在运行时执行相同的更改。这将允许您将具有明确 orderId 值的行添加到数据集,然后将其保存到 SQL Server 表中(您仍然需要 SET IDENTITY_INSERT)。

          另请注意,IDENTITY_INSERT 是一个连接级别的设置,因此您需要确保您正在为将用于保存对数据库的更改的同一连接执行相应的 SET。

          【讨论】:

            【解决方案5】:

            您希望执行 SET IDENTITY_INSERT ON 以允许您插入身份列。

            它看起来有点倒退,但它就是这样工作的。

            【讨论】:

            • 你说得对,我把选项弄混了,但是当我改变它们时,它并没有解决我的问题。还有其他想法吗?
            【解决方案6】:

            您的选项混淆了:

            SET IDENTITY_INSERT orders ON
            

            开启将特定值(您指定)插入到具有 IDENTITY 列的表中的功能。

            SET IDENTITY_INSERT orders OFF
            

            再次关闭该行为并恢复正常行为(您不能为 IDENTITY 列指定值,因为它们是自动生成的)。

            马克

            【讨论】:

              猜你喜欢
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              • 2017-03-03
              • 1970-01-01
              • 2011-02-20
              • 1970-01-01
              • 2012-08-21
              • 1970-01-01
              相关资源
              最近更新 更多