如何在c#中的主键上找到自动增量数据库表的NEXT值或当前的,没有打开新连接?
C#中有方法吗?
答案 0 :(得分:4)
没有可靠的方法可以做到这一点,因为它会自动成为竞争条件。事实上,不止于此:它可能导致幻影价值。具体来说:如果您执行的插入需要新的IDENTITY
值,然后回滚事务,则表的标识不会还原:会有差距。这又是:故意。
在SQL Server中,有IDENT_CURRENT(object)
函数返回表的之前的标识值 - 但是应该使用的场景很少(信息工具除外)它。你当然不应该用它来填充辅助插入物。
通常的做法是:
IDENTITY
值是什么(SQL Server中的SCOPE_IDENTITY()
)或者,您可以使用OUTPUT
clause
答案 1 :(得分:0)
这取决于您的DBMS。
对于SQL Server 2008或更高版本,您可以从sys.index
,sys.index_columns
和sys.identity_columns
获取有用的信息:
select object_name(i.object_id) tableName
, i.name indexName
, c.name columnName
, c.is_identity
, idc.seed_value
, idc.increment_value
, idc.last_value
from sys.indexes i
inner join
sys.index_columns ic on ic.object_id = i.object_id
and ic.index_id = i.index_id
inner join
sys.columns c on c.object_id = ic.object_id
and c.column_id = ic.column_id
left outer join
sys.identity_columns idc on idc.object_id = c.object_id
and idc.column_id = c.column_id
where i.is_primary_key = 1
正如其他人在评论中提到的那样,last_value
可以在您获取它的那一刻与您使用它的那一刻之间发生变化。但是,有一些方法可以避免这个问题,尽管我不建议使用它: