C # / SQL получает автоматически сохраняемое значение поля

StackOverflow https://stackoverflow.com/questions/1402684

  •  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 на клиенте и отправкой его на сервер?Потому что, если вы можете использовать хранимую процедуру, это легко сделать.В сохраненной процедуре выполните вставку, а затем, либо

  1. Выберите Scope_Identity() в качестве последнего оператора в сохраненной процедуре. , или
  2. Используйте выходной параметр для сохраненной процедуры (скажем, с именем @NewPKValue) и выполните последнее утверждение:

    Установите @NewPKValue = Scope_Identity области видимости()

В противном случае вам необходимо отправить пакет команд на сервер, который включает в себя два оператора insert и Select Scope_Identity() и выполнить пакет, как если бы это был оператор select

Вы могли бы использовать инструкцию SQL SELECT scope_identity().

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top