我有一个简单的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”作为解决方法,但许多人建议不要这样做。
答案 0 :(得分:0)
我相信你绑定了来自Sql server表的数据。在SQL Server Engine本身中设置IDENTITY属性。这是在服务器上的表中。 将种子设置为1,将增量设置为1 有关身份的更多信息:Click here
答案 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)";
由于这些更改位于自动生成的代码中,因此如果重新生成数据集代码,则需要重新应用这些更改。