【发布时间】:2012-02-21 20:37:22
【问题描述】:
我有一个 SQL Server 作为 asp.net 应用程序的后端。多个人可能会“同时...”在同一个表中插入数据。
当我从这篇文章中阅读解决方案/答案时:scope_identity vs ident_current
那么我不应该使用Ident_current,因为我可以获得另一个用户的插入ID。
但是使用Select Scope_Identity(); 会返回NULL,而Select IDENT_CURRENT('tableName') 会返回我使用SQL Server Management Studio 检查的正确ID。
我在SqlTransaction 中执行的插入语句。 Select IDENT_CURRENT('tableName') 是在事务之后完成的。
我做错了什么?
更新:
我的插入语句是由基类动态构建的:
INSERT INTO TEST (NAME) VALUES (@Name)
该命令的参数集合的值为“xxx”,并且一切都很好地插入到表中。
我不使用存储过程,只使用纯 SqlDataReader 和 C#。
commandText = "INSERT INTO TEST (NAME) VALUES ('Test1');Select Scopy_Identity();"
我如何才能获得运行上述语句的最后一个自动 inc id,我应该为上述语句调用 ExecuteNonQuery 或 ExecuteReader,因为它有一个 INSERT 和 SELECT,这令人困惑......
【问题讨论】:
-
向我们展示您的插入命令。看看我上周对类似问题的回答,也许会有所帮助:stackoverflow.com/questions/9319532/…您必须在同一范围内使用 scope_identity。
-
你可能完全独立地执行了这两个命令。
-
我独立执行它们。
-
那么
SCOPE_IDENTITY()将不起作用 - 它们必须在同一范围内(因此得名)。使用存储过程将生成的 ID 作为输出参数发回,然后您可以将其保留在会话中或任何地方,以便以后引用它。 -
@Pascal 那么您如何期望 SCOPE 身份从不同的范围中提取身份?出于非常明确的原因,它被称为 SCOPE 身份......