C # SqlParameter - предоставить SQL (Microsoft SQL) - PullRequest
2 голосов
/ 07 сентября 2011

В настоящее время мне поручено проект в базе данных, схема которого не может быть изменена.Мне нужно вставить новую строку в таблицу, которая требует уникальности идентификатора, но первоначальные создатели структуры не установили это значение в автоинкремент.Чтобы обойти это, я использовал код, похожий на:

(SELECT TOP 1 [ID] from [Table] ORDER BY [ID] DESC) + 1

при указании значения поля идентификатора, в основном с внутренним запросом.Проблема в том, что на несколько строк мне нужен только что введенный идентификатор.Если бы я мог установить SQLParameter для вывода для этого столбца, я мог бы получить значение, в котором он был установлен, проблема в том, что я использую SQL, а не жесткое значение, как в других SQLParameters.Разве я не могу использовать SQL вместо просто значения?

Это потенциальный обмен большого объема, поэтому я бы не стал делать 2 разных запроса (один для получения идентификатора, а другой для вставки).

Ответы [ 4 ]

3 голосов
/ 07 сентября 2011

Вы говорите, что не можете изменить схему, но можете ли вы добавить в проект дополнительную таблицу, в которой есть столбец автоинкремента?Затем вы можете использовать эту таблицу для (безопасного) создания новых идентификаторов и возврата их в свой код.

Это похоже на то, как Oracle выполняет идентификаторы, и иногда приложения-поставщики для сервера SQL, которые также работают на Oracle, будут использоватьэтот подход просто помогает минимизировать различия между двумя базами данных.

Обновление:
Ах, я только что заметил ваш комментарий к другому ответу здесь.В этом случае единственное, что я могу сработать, - это поместить ваши два оператора (вставить новый идентификатор и затем прочитать новый идентификатор) в транзакцию с уровнем изоляции SERIALIZABLE .И это просто отстой, потому что это оставляет вас открытыми для производительности и блокировки ошибок.

1 голос
/ 07 сентября 2011

Я немного озадачен тем, где вам нужно использовать этот идентификатор. Если он внутри того же хранимого процесса, просто используйте этот метод:

DECLARE @NewId int
SELECT TOP 1 @NewId =  [ID] + 1 from [Table] ORDER BY [ID] DESC
SELECT @NewId
1 голос
/ 07 сентября 2011

Возможно ли для вас создать хранимую процедуру в базе данных, чтобы сделать это, и возвращаемое значение хранимой процедуры вернет нужный вам идентификатор?

0 голосов
/ 07 сентября 2011

Вы можете поместить более одного оператора SQL в одну команду SqlCommand.Таким образом, вы можете легко сделать что-то в соответствии с тем, что предложил Abe :

DECLARE @NewId int
SELECT TOP 1 @NewId =  [ID] + 1 from [Table] ORDER BY [ID] DESC
INSERT INTO [Table] (ID, ...) VALUES (@NewId, ...)
SELECT @NewId

Затем вы просто вызываете ExecuteScalar для вашей SqlCommand, и он выполняет INSERT и затем возвращает IDб.

...