如何更新DataTable中的所有自增列?

Ale*_*ter 2 c# datatable ado.net auto-increment

我有一个带有“Id”列的 DataTable,它是 SQL Server 2005 数据库中的标识列。该列的 AutoIncrement 属性设置为 true。我不会用数据库中的数据填充表,因为我仅将其用于插入,因此它会从 1 开始分配虚假 ID。

但是在我调用 tableAdapter.Update() 后,我希望在该列中包含数据库分配的 REAL Ids 。

由于某种原因,只有第一行得到更新,其余的都没有更新。该表使用级联 DataRelation(分层结构)引用自身,并且对第一行的引用也会更新。

请告诉我如何使所有 Id 相应更新。

提前致谢!

插入语句:

INSERT INTO Components (ComponentId, OrderNo, SerialNo) 
VALUES (@ComponentId, @OrderNo, @SerialNo) 
Run Code Online (Sandbox Code Playgroud)

这里是组件表的架构:

Id BIGINT PK, 
ComponentId BIGINT FK, 
OrderNo int, 
SerialNo int 
Run Code Online (Sandbox Code Playgroud)

请注意,Id 列的名称是“Id”,“ComponentId”是 FK 引用列。

小智 5

这曾经非常容易。您只需将 Column.AutoIncrementSeed 和 Column.AutoIncrementStep 两者都设置为“-1”。这样,添加的新行的 ID 将为 -1、-2,依此类推。那么您的存储过程或 TSQL 代码将简单地是:

UPDATE Table
SET 
    Col1 = @Col1
    Col2 = @Col2
WHERE (ID = @ID) -- If this is -1, -2, etc, it won't update

IF (@@ROWCOUNT = 0)
    BEGIN
    INSERT INTO Table(Col1, Col2) VALUES(Col1, Col2)
    SET @ID = SCOPE_IDENTITY();  -- @ID would now change from -1 to 1, 2, 3, etc.
END
Run Code Online (Sandbox Code Playgroud)

然而,微软以其无限的智慧通过 ADO.NET 4.0 改变了这一切。我不太确定它何时改变,但他们现在在自动增量列上有一个底层私有字段,用于存储该列的当前值。因此,假设在数据库中,最后插入的值为“52”,那么,它现在将隐藏在 AutoIncrement 列中。这现在会导致多用户应用程序出现巨大问题,我不能再使用“-1”技巧了,因为它开始从最后一个自动增量值开始向后计数。我什至尝试通过反思来改变这一点,但效果不佳。我讨厌微软在 ADO.NET 中打破了这一点,但他们仍然坚持自己的口号:“不,我们不会修复 bug X [这不会真正影响任何用户],但我们将实现一些全新的东西,这会搞砸您曾经使用过的所有代码”。