【问题标题】:How to save a new record when the id key is auto incrementedid键自动递增时如何保存新记录
【发布时间】:2012-05-18 19:37:38
【问题描述】:

我在 sql server 2008 中创建了一个数据库和一个带有自动增量 id 字段的表

我还在 c#.net 2008 中开发了一个项目

在 BindingNavigator 中“添加新”后单击“保存数据”时会出现问题

例如,我点击“添加新”,填写除 id 文本(空白 id)以外的所有字段,然后点击“保存数据”,然后出现错误

运行时异常为“notNullAllowedException: 'id' 列不允许为空。

但用户不需要填写此字段,但必须在保存后从数据库中返回

我还设置了id的属性:(c#项目和sql server)

AutoIncrement = True
AutoIncrementStep = -1 (also I tested 1)
AutoIncrementSeed = -1 (also I tested 1)

没有结果。

我该如何处理?

谢谢

【问题讨论】:

  • 如果ID列设置为identity,只需传递0而不是空白/null
  • 设置 0 或 -1 时出现另一个错误“当 IDENTITY_INSERT 设置为 OFF 时,无法在表 'mytable' 中插入标识列的显式值。
  • 好吧,然后将其切换为“on” :) 如果 Id 列是 identity 并且可以插入自动增量,那么添加一个新对象并将 Id 设置为 0 应该可以工作很好 - Id 会自动递增。

标签: c# ado.net insert auto-increment


【解决方案1】:

不要在插入语句中包含标识列。

如果你的陈述是

INSERT INTO MyTable (ID, SomeField, SomeOtherField) VALUES (null, 'SomeValue', 'AnotherValue')

直接改成

INSERT INTO MyTable ( SomeField, SomeOtherField) VALUES ( 'SomeValue', 'AnotherValue')

【讨论】:

  • 问题是c#自动生成用于插入的sql查询。我删除了身份证并工作了! (当然我必须将-1设置为id)下次显示正常的id(或通过代码刷新记录)。但微软没有解决这个问题?谢谢
  • 我确定有解决方法,但我需要更具体的信息。 C# 本身并没有这样做。动态数据和基于 C# 构建的其他几种技术可以... Visual Studio 在使用 DataSet 设计器时会这样做... Linq to SQL ORM 生成可以做到... 我猜有很多可能的方式来访问数据从 C# 开始,很难确切地告诉您如何解决这个问题。如果您要解释如何创建数据访问层,那可能会有所帮助。
【解决方案2】:

听起来你有两个问题。

首先,您总是在插入 - 您使用什么逻辑来决定“保存”应该是插入还是更新?我认为这是因为您遇到的错误:“无法插入显式...”

其次,您需要获取 SQL 在插入时分配的 ID,以便将其写入 ID 字段以进行下一次保存 = 更新。有几种方法可以做到这一点,我更喜欢的方法是使用存储过程进行插入并传递获取 SCOPE_IDENTITY() 的 OUTPUT 参数。像这样的:

CREATE PROC xyz
(
    @data...
    @NEWID INT OUTPUT
)
AS
    ... do your INSERT ...
    SET @NewID = SCOPE_IDENTITY()

)

仔细检查我的语法 - 不确定您使用的是什么版本的 SQL

【讨论】:

  • 谢谢 :) 但我寻求一个没有程序的简单解决方案。 c# auto-generate (ado.net) 3-4 sql 查询(插入、更新、删除等)并自动调用适当的查询。问题是在sql中自动生成的c#代码添加不存在的id(插入表集id=@id name=@name,...)但这是错误的!我不知道为什么微软错过了......
猜你喜欢
  • 2013-05-11
  • 2011-11-21
  • 2013-08-27
  • 1970-01-01
  • 1970-01-01
  • 2011-11-03
  • 2014-02-25
  • 1970-01-01
  • 2020-01-15
相关资源
最近更新 更多