C # / SQL получает автоматически сохраняемое значение поля
-
05-07-2019 - |
Вопрос
У меня есть таблица с автоматически сохраняемым первичным ключом.В моем коде я пытаюсь получить новое автоматически добавляемое значение при выполнении каждого запроса 'insert'.Есть ли способ сделать это программно?
Спасибо.
UPD:Предположим, у меня есть таблица:Пользователь ТАБЛИЦЫ ( ЗНАЧЕНИЕ идентификатора пользователя НЕ РАВНО НУЛЮ AUTO_INCREMENT, значение переменной имени ( 25 ) НЕ РАВНО НУЛЮ , значение переменной электронной почты ( 50 ) НЕ РАВНО НУЛЮ , УНИКАЛЬНЫЙ ( идентификатор пользователя ) );
И я, когда я вставляю новые значения (имя и адрес электронной почты) в эту таблицу, я хочу автоматически получать вновь сгенерированный идентификатор пользователя.В идеале я ищу любые способы сделать это с помощью одной транзакции и без хранимых процедур.
Решение
Верните ваш sql / сохраненный proc scope_identity() область действия() или, если вы используете Linq2SQL или EF, объект, используемый для вставки, получает новый идентификатор.
Другие советы
В сохраненной процедуре это:
ALTER proc [dbo].[SaveBuild](
@ID int = 0 output,
@Name varchar(150)=null,
@StageID int,
@Status char(1)=null
)
as
SET NOCOUNT ON
Insert into Builds
(name, StageID, status)
values (@Name, @StageID, @Status)
select @ID = scope_identity()
RETURN @ID
В коде C # у вас есть:
public int SaveBuild(ref int id, ref string Name)
{
SqlCommand cmd = GetNewCmd("dbo.SaveBuild");
cmd.Parameters.Add("@ID", SqlDbType.Int).Value = id;
cmd.Parameters["@ID"].Direction = ParameterDirection.InputOutput;
cmd.Parameters.Add("@Name", SqlDbType.VarChar).Value = Name;
cmd.Parameters.Add("@StageID", SqlDbType.Int).Value = 0;
ExecuteNonQuery(cmd);
id = (int)cmd.Parameters["@ID"].Value;
return id;
}
В зависимости от вашей ситуации, возможно, вам было бы лучше использовать параметры с табличным значением чтобы передать ваши вставки в хранимую процедуру, затем используйте ВСТАВЛЕННЫЙ ВЫХОДНОЙ СИГНАЛ чтобы вернуть параметр с табличным значением из вашей хранимой процедуры.
Это значительно сократит количество обращений, необходимых, если вы обрабатываете несколько элементов.
Ограничены ли вы созданием SQL на клиенте и отправкой его на сервер?Потому что, если вы можете использовать хранимую процедуру, это легко сделать.В сохраненной процедуре выполните вставку, а затем, либо
- Выберите Scope_Identity() в качестве последнего оператора в сохраненной процедуре. , или
Используйте выходной параметр для сохраненной процедуры (скажем, с именем @NewPKValue) и выполните последнее утверждение:
Установите @NewPKValue = Scope_Identity области видимости()
В противном случае вам необходимо отправить пакет команд на сервер, который включает в себя два оператора insert и Select Scope_Identity() и выполнить пакет, как если бы это был оператор select
Вы могли бы использовать инструкцию SQL SELECT scope_identity()
.