28

我正在使用数据集插入从旧数据库转换的数据。要求是维护当前的 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 设置值丢失的原因。

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

4

6 回答 6

56

您有多种选择:

SET IDENTITY_INSERT orders ON

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

SET IDENTITY_INSERT orders OFF

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

马克

于 2009-08-05T18:04:29.610 回答
5

您想要执行 SET IDENTITY_INSERT ON以允许您插入身份列。

这似乎有点倒退,但这就是它的工作方式。

于 2009-08-05T18:04:51.637 回答
3

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

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

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

于 2009-08-05T19:23:35.643 回答
1

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

于 2009-08-05T19:44:55.943 回答
1

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();
 }
于 2009-09-01T18:59:28.570 回答
0

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

插入用户(Id,Name)值(1,'jeff')

于 2014-10-22T15:08:39.070 回答