我有一个带有“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)
这里是组件表的架构:
Id BIGINT PK,
ComponentId BIGINT FK,
OrderNo int,
SerialNo int
请注意,Id 列的名称是“Id”,“ComponentId”是 FK 引用列。
最佳答案
这曾经非常简单。您只需将 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
然而,微软以其无限的智慧通过 ADO.NET 4.0 使这一切变得更糟。我不太确定它何时改变,但他们现在在自动增量列上有一个底层私有(private)字段,用于存储该列的当前值。因此,假设在数据库中,最后插入的值为“52”,那么,它现在将隐藏在 AutoIncrement 列中。这现在会导致多用户应用程序出现巨大问题,我不能再使用“-1”技巧了,因为它开始从最后一个自动增量值开始向后计数。我什至尝试通过反射(reflection)来改变这一点,但效果不佳。我讨厌微软在 ADO.NET 中打破了这一点,但他们仍然坚持自己的口号:“不,我们不会修复 bug X [这不会真正影响任何用户],但我们将实现一些全新的东西,这会搞砸您曾经使用过的所有代码”。
关于c# - 如何更新DataTable中的所有自增列?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1393208/