1

我有一个简单的 VS 2012 C# 表单,其中包含绑定到绑定源的数据网格控件。这绑定到的 SQL Server 数据源具有一个标识列 (ID),它也是主键。

在此 ID 字段的数据集属性中,我有 AutoIncrement = true、AutoIncrement Seed = -1(默认)和 AutoIncrementStep = -1(默认)

我无法将新行保存到数据库中。

如果我使用工具条添加新记录,清除 ID 字段,然后单击保存图标,我会收到此异常:“当 IDENTITY INSERT 设置为关闭时,无法在表 xxxx 中插入标识列的显式值”。如果我将自动生成的值“-1”留在字段中,我会得到同样的异常。

附加到保存按钮的代码:

private void tblClassificationBindingNavigatorSaveItem_Click(object sender, EventArgs e)
    {         
        this.Validate();
        this.tblClassificationBindingSource.EndEdit();
        this.tableAdapterManager.UpdateAll(this.exportComplianceSISVTDataSet);
    }

执行最后一步会导致异常。

一些论坛回复者建议将 IDENTITY INSERT 设置为“ON”作为解决方法,但许多人建议不要这样做。

4

2 回答 2

0

我相信您正在绑定 Sql server 表中的数据。在 SQL Server 引擎本身中设置 IDENTITY 属性。那是在服务器中的表上。将种子设置为 1,将增量设置为 1。
有关身份的更多信息:单击此处

SQL 小提琴演示

于 2013-03-02T16:03:31.793 回答
0

我正是这个问题。将表的 Identity_Insert 设置为 ON 不会更改错误,并且会在 SQL Server Management Studio 中创建不一致的行为。在插入定义了标识字段的记录时,记录显然已成功插入,但在 select 语句的结果中看不到。

我通过更改 DataSetDesigner.cs 的 InitAdapter 函数中定义的 Update 和 Insert 语句来排除 Identity 字段,从而解决了这个问题。下面显示了一个示例,其中 ID 是更新命令的标识字段。

//this._adapter.UpdateCommand.CommandText = @"UPDATE [dbo].[Stopwords] SET [ID] = @ID, [Stopword] = @Stopword, [DateAdded] = @DateAdded WHERE (([ID] = @Original_ID) AND ([Stopword] = @Original_Stopword) AND ((@IsNull_DateAdded = 1 AND [DateAdded] IS NULL) OR ([DateAdded] = @Original_DateAdded))); //SELECT ID, Stopword, DateAdded FROM Stopwords WHERE (Stopword = @Stopword)"; this._adapter.UpdateCommand.CommandText = @"UPDATE [dbo].[Stopwords] SET [Stopword] = @Stopword, [DateAdded] = @DateAdded WHERE (([ID] = @Original_ID) AND ([Stopword] = @Original_Stopword) AND ((@IsNull_DateAdded = 1 AND [DateAdded] IS NULL) OR ([DateAdded] = @Original_DateAdded))); SELECT ID, Stopword, DateAdded FROM Stopwords WHERE (Stopword = @Stopword)";

由于这些更改在自动生成的代码中,因此如果重新生成数据集代码,则需要重新应用它们。

于 2014-10-13T02:20:47.900 回答