Получить новый идентификатор перед вставкой во время транзакции в .NET - PullRequest
5 голосов
/ 02 октября 2010

Я использую ADO.NET, чтобы попытаться получить значение, которое я собираюсь вставить до Я вставляю его в SQL Server 2005. SCOPE_IDENTITY () прекрасно работает после, но я тоже сделка, если это имеет значение. Мне буквально нужно выбрать следующий идентификатор, и только этот идентификатор, и сделать его доступным для C # до вставки.

Ответы [ 4 ]

3 голосов
/ 03 октября 2010

В качестве альтернативного решения вы можете изменить тип первичного ключа на тип GUID, что позволит вам вставить его с известным ключом.

Guid pk = Guid.NewGuid();

Я не вспоминаю метод для SQL-сервера, если класс поддерживается напрямую или если вам нужно преобразовать его в байт []. Для оракула мы конвертируем в символ (32).

Таким образом, вам не нужно беспокоиться о параллелизме.

2 голосов
/ 02 октября 2010

Какое бы решение вы ни выбрали, обязательно протестируйте его в условиях высокого параллелизма.скорее всего, он сломается - два или более разных соединения получат один и тот же идентификатор перед тем, как вставить.Прежде чем что-то делать, я бы использовал sp_getapplock для сериализации доступа, чтобы не было параллелизма.

1 голос
/ 02 октября 2010

SCOPE_IDENTITY будет работать только после того, как вы вставите строку в таблицу. Если вам нужно знать значение перед вставкой, вам нужно использовать IDENT_CURRENT ('имя_таблицы'). См. http://msdn.microsoft.com/en-us/library/ms175098.aspx для получения дополнительной информации.

0 голосов
/ 02 октября 2010

попробуйте использовать IDENT_CURRENT. Как говорится в MSDN, «он возвращает последнее значение идентификатора, сгенерированное для конкретной таблицы в любом сеансе и любой области видимости»

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...