Как я могу найти значение NEXT таблицы автоматической инкреции databse или текущего, без открытия нового соединения, на первичном ключе в С#?
Есть ли способ в С#?
Нет надежного способа сделать это, потому что это автоматически будет состоянием гонки. На самом деле, более того: это может привести к фантомным значениям. В частности: если вы вставляете требуемое новое значение IDENTITY
, а затем откатываете транзакцию, то идентификатор таблицы не возвращается: будет пробел. Это снова: преднамеренно.
В SQL Server есть IDENT_CURRENT(object)
которая возвращает предыдущее значение идентификатора для таблицы, но существует очень мало сценариев (кроме информационных инструментов), где вы должны их использовать. Вы, конечно же, не должны использовать его для первичных вставок.
Обычный подход здесь:
IDENTITY
(SCOPE_IDENTITY()
в SQL Server) В качестве альтернативы вы можете сделать несколько вкладок для нескольких частей, используя предложение OUTPUT
Это зависит от вашей СУБД.
Для 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
может измениться между моментом, когда вы его last_value
и в тот момент, когда вы его используете. Однако есть способы избежать этой проблемы, хотя я не рекомендую ее использовать: