由于身份冲突,无法向数据源添加行

时间:2013-03-02 15:54:51

标签: c# sql-server visual-studio-2012

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

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

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

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

保存按钮附带的代码:

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

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

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

2 个答案:

答案 0 :(得分:0)

  

我相信你绑定了来自Sql server表的数据。在SQL Server Engine本身中设置IDENTITY属性。这是在服务器上的表中。   将种子设置为1,将增量设置为1   有关身份的更多信息:Click here

     

SQL Fiddle Demo

答案 1 :(得分:0)

我确实遇到了这个问题。将表的Identity_Insert设置为ON并未更改错误,并在SQL Server Management Studio中创建了不一致的行为。插入带有标识字段的记录时,记录显然已成功插入,但在select语句的结果中无法看到。

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

//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)";

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