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

标签 c# ado.net datatable 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) 

这里是组件表的架构:

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/

相关文章:

c# - Ninject - 管理泛型类型的不一致性?

c# - .NET - 添加图标 - 固定工具窗口

C# 和 PostgreSQL

datatable - Primefaces LazyModel 数据表始终要求first=0 pageSize=10

javascript - 使用下拉菜单显示 2 个不同的数据表

c# - SQL 差异 EF 6 与 EF Core

c# - 寻找类似 HashSet 的东西,但具有一系列键值?

c# - 在 C# 中从 SQL 数据库中读取值

c# - 在 C# 中, "SELECT TOP 0 * FROM (/* ... */) s"与 ADO.NET 结合使用是否是确定 SELECT 语句中的列信息的好方法?

C# - 合并两个行重复的数据表