我正尝试在主键为Identity字段的表上插入记录。
我试着给你打电话
mycontext.ExecuteCommand("SET identity_insert myTable ON")
但这不会有任何好处。
当我提交更改时,我收到一个错误,告诉我IDENTITY_INSERT是OFF。
在提交更改之前,如何从C#代码中将其转换为ON?
编辑
我读到这是因为ExecuteCommand的代码是在不同的会话中执行的。
编辑2
有没有办法我可以执行一些动态链接库来从我的C#代码中删除身份规范,执行插入,然后打开身份规范?
发布于 2009-09-02 17:19:39
您需要在单个T-SQL代码块中完成所有步骤-如果您想打开它,然后执行LINQ- to -SQL查询,然后再关闭它,这将是非常困难的,如果不是不可能的话:(
我看到的唯一真正的解决方案是将整个SQL打包到一个SQL语句中并执行该语句:
SET IDENTITY_INSERT MyTable ON
(do your update here)
SET IDENTITY_INSERT MyTable OFF并使用.ExecuteContext()将其作为单个代码块执行
Marc
PS:对于你的EDIT#2 :不,不幸的是,没有(简单的)方法可以从一列中删除身份,并将其重新打开。基本情况下,您必须创建一个没有标识的新列,复制值,删除标识列,然后在完成后反向执行相同的操作-对不起!:-(
PS #2:这确实回避了一个问题:到底要做什么才能做“身份插入”?在常规的基础上,从应用程序?诚然-你可能偶尔会遇到这种需要,但我总是在SQL Mgmt Studio中单独做这件事-当然不是在我的应用程序中.(只是好奇你的用例/动机是什么)。
发布于 2010-03-19 01:28:16
另一种选择是将所有Linq2Sql调用包装在一个TransactionScope()中。这应该会强制它们都在同一个连接中运行。
using System.Transactions; // Be sure to add a reference to System.Transactions.dll to your project.
// ... in a method somewhere ...
using (System.Transaction.TransactionScope trans = new TransactionScope())
{
using(YourDataContext context = new YourDataContext())
{
context.ExecuteCommand("SET IDENTITY_INSERT MyTable ON");
context.ExecuteCommand("yourInsertCommand");
context.ExecuteCommand("SET IDENTITY_INSERT MyTable OFF");
}
trans.Complete();
}
// ...尽管如此,如果您正在尝试执行以下操作:
context.ExecuteCommand("SET IDENTITY_INSERT MyTable ON");
context.MyTable.InsertOnSubmit(myTableObject)
context.SubmitChanges()
context.ExecuteCommand("SET IDENTITY_INSERT MyTable OFF");您可能会遇到其他问题,特别是当identity列的IsDbGenerated属性设置为true时。由Linq2Sql生成的SQL命令将不知道是否包含标识列和值。
发布于 2013-06-03 16:08:02
在执行命令之前手动打开连接应该就足够了。这会使命令在同一会话中运行:
context.Connection.Open();
context.ExecuteCommand("SET IDENTITY_INSERT MyTable ON");
// make changes
// ...
context.SubmitChanges();https://stackoverflow.com/questions/1368987
复制相似问题