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 [这不会真正影响任何用户],但我们将实现一些全新的东西,这会搞砸您曾经使用过的所有代码”。
| 归档时间: |
|
| 查看次数: |
9983 次 |
| 最近记录: |