我将IDENTITY_INSERT设置为ON,但是我得到一个SqlException,表示它已关闭

Ecy*_*yrb 2 .net c# identity identity-insert linq-to-sql

我试图从文本文件中获取数千张发票(和其他东西)并将它们插入SQL Server 2008.我写了一个小控制台应用程序来执行此操作并使用LINQ to SQL.在我插入所有现有发票之后,我希望它Invoice_ID是一个标识列并自动增加,所以我将它设计为:

CREATE TABLE [dbo].[Invoice]
(
 [Invoice_ID] int IDENTITY(1,1) NOT NULL PRIMARY KEY, 
    /* Other fields elided */
)
Run Code Online (Sandbox Code Playgroud)

在我开始插入发票之前,我调用包含以下行的存储过程:

SET IDENTITY_INSERT [dbo].[Invoice] ON;
/* Other lines for setup elided */
Run Code Online (Sandbox Code Playgroud)

在我提交更改后,我使用以下行调用另一个存储过程:

SET IDENTITY_INSERT [dbo].[Invoice] OFF;
/* Other lines for clean up elided */
Run Code Online (Sandbox Code Playgroud)

当我尝试插入发票并提交更改时,我收到以下异常:

SQLException:当IDENTITY_INSERT设置为OFF时,无法在表'Invoice'中为identity列插入显式值.

我运行SQL事件探查器,我可以看到它确实设置IDENTITY_INSERTON尝试执行插入之前.我不认为它被设置在OFF任何地方.我是SQL Profiler的新手,所以也许我可以启用一个事件,它将为我提供更多信息来尝试和调试它.有任何想法吗?

我已经尝试调整LINQ to SQL使用的.dbml文件中的值.我将InvoiceAuto Generated Value设置为"False",Auto-Sync设置为"Never",Server Data Type设置为"Int NOT NULL".通常我会将它们分别设置为"True","On Insert"和"Int NOT NULL IDENTITY",但是当我这样做时,我可以看到SQL Server正在执行:

SELECT CONVERT(Int,SCOPE_IDENTITY())AS [value]

而不是插入Invoice_ID我提供的.

Kev*_*yon 5

http://msdn.microsoft.com/en-us/library/ms190356.aspx

如果向下看,你可以看到:

如果在存储过程或触发器中运行SET语句,则在从存储过程或触发器返回控制之后,将恢复SET选项的值.此外,如果在使用sp_executesql或EXECUTE运行的动态SQL字符串中指定了SET语句,则在从动态SQL字符串中指定的批处理返回控制后,将恢复SET选项的值.