关闭IDENTITY_INSERT数据集插入
-
22-07-2019 - |
题
我使用一个数据集中插入数据的转换从旧的数据库。要求维持目前的Order_ID数字。
我已经试过使用:
SET IDENTITY_INSERT orders ON;
这个工作时我在Sql server管理工作室,我能成功
INSERT INTO orders (order_Id, ...) VALUES ( 1, ...);
然而,它不会允许我这样做过的数据集的插入的,我在使用我的转换脚本。这看起来基本上是这样的:
dsOrders.Insert(oldorderId, ...);
我已经运行SQL(SET IDENTITY_INSERT订单)过程中。我知道,我只能做到这一针对一个表格的时间和我。
我不断收到这个例外:
例外时,试图插入一个值到订单表 系统。数据。SqlClient.SqlException:不能插入明确的价值身份列表中的"订单"当IDENTITY_INSERT是设定至关。
任何想法?
更新
AlexS&AlexKuznetsov已经提到,Set Identity_Insert是一个连接水平的设置,但是,当我看SQL在SqlProfiler,我注意到几个命令。
- 第一-
SET IDENTITY_INSERT DEAL ON
- 第二-
exec sp_reset_connection
- 第三n-我各种各样的sql命令,包括选择&插入的
总是有一个 exec sp_reset_connection
之间的命令,我认为,这是负责损失的价值在Identity_Insert设置。
有没有办法阻止我的数据集的做连接的重置?
解决方案
你有选择的混合起来:
SET IDENTITY_INSERT orders ON
将会打开 上 插入能力的具体的值(指定)为表的身份柱。
SET IDENTITY_INSERT orders OFF
实证明这种行为再次关闭和正常行为(你不能指定值身份列,因为他们是自动生成)是恢复。
Marc
其他提示
你想要做SET IDENTITY_INSERT 上 让你插入身份列。
这似乎有点落后,但是它的工作方式。
看来你正在做的一切权利:SET IDENTITY_INSERT单上是正确的路上 SQL服务器的一侧.但问题是,你正在使用的数据集。从你的代码已经提供了我可以说,你使用 输入的数据集 -那个产生Visual Studio根据的数据库。
如果是这种情况(最有可能的),然后 这个数据集 包含约束,不会允许设定值为订单id领域,即它的代码,不允许指定明确的价值,而不SQL服务器。你应该去数据集的设计和编辑性质的订单id领域:设置自动增量和只读到错误的。但是,同样的变化能够进行运行时间。这将允许添加一个行与明确的价值,为订单id的数据集,后来保存到SQL服务器表(你将仍然需要SET IDENTITY_INSERT).
还注意到,IDENTITY_INSERT是一个连接级设置,所以你需要确保执行相应的设定完全相同的连接,你将用来保存更改数据库。
我会用探查,以确定是否SET IDENTITY_INSERT订单;是颁发的作为同一连接你的后续插入的,以及的确切SQL正在执行期间的插入。
AlexS是正确的,该问题是Insert_Identity的工作,但它是一个连接水平的设置,所以我需要设置Insert_Identity内的事务。
我用瑞恩*惠特克 TableAdapterHelper 代码
我创造了一个更新命令我的库中,删除跑的Identity_Insert.然后我不得不创建一个新的插入件指令与标识列的规定。然后我跑了这个代码
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();
}
在情况下,你仍然有的问题"insert_identity",你可以尝试使用 完全插入的发言 如:
插入用户(Id,Name)values(1,'杰夫*')