我试图从一个文本文件中获取数千张发票(和其他东西)并将它们插入 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 */
)
在我开始插入发票之前,我调用了一个包含以下行的存储过程:
SET IDENTITY_INSERT [dbo].[Invoice] ON;
/* Other lines for setup elided */
提交更改后,我使用以下行调用另一个存储过程:
SET IDENTITY_INSERT [dbo].[Invoice] OFF;
/* Other lines for clean up elided */
当我尝试插入发票并提交更改时,出现以下异常:
SQLException:当 IDENTITY_INSERT 设置为 OFF 时,无法在表“发票”中插入标识列的显式值。
我运行了 SQL Profiler,我可以看到它在尝试执行插入之前确实设置IDENTITY_INSERT
为。ON
我没有看到它被设置到OFF
任何地方。我对 SQL Profiler 很陌生,所以也许我可以启用一个事件,它会为我提供更多信息来尝试和调试它。有任何想法吗?
我尝试调整 LINQ to SQL 使用的 .dbml 文件中的值。我将Invoice
表Auto 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()) 作为 [值]
而不是插入Invoice_ID
我提供的。