C # / SQL получить значение автоинкрементного поля - PullRequest
2 голосов
/ 10 сентября 2009

У меня есть таблица с автоинкрементным первичным ключом. В моем коде я пытаюсь получить новое автоинкрементное значение при выполнении каждого запроса на вставку. Есть ли способ сделать это программно?

Спасибо.

UPD: Предположим, у меня есть таблица: TABLE Пользователь (userID INT NOT NULL AUTO_INCREMENT, имя VARCHAR (25) NOT NULL, электронная почта VARCHAR (50) NOT NULL, UNIQUE (userID));

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

Ответы [ 5 ]

4 голосов
/ 10 сентября 2009

В хранимых процессах это:

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;

}
4 голосов
/ 10 сентября 2009

Ваш sql / сохраненный процесс возвращает scope_identity () или, если вы используете Linq2SQL или EF, объект, используемый для вставки, получает новый идентификатор.

3 голосов
/ 10 сентября 2009

В зависимости от вашей ситуации, вам может быть лучше использовать табличные параметры для передачи вставок в хранимую процедуру, а затем использовать OUTPUT INSERTED для возврата табличного параметра из вашей хранимой процедуры.

Это значительно сократит количество требуемых ударов, если вы обрабатываете несколько предметов.

1 голос
/ 10 сентября 2009

Вы ограничены в создании SQL на клиенте и отправке его на сервер? Потому что, если вы можете использовать хранимую процедуру, это легко сделать. В сохраненном процессе выполните вставку, а затем либо

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

    Set @NewPKValue = Scope_Identity ()

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

1 голос
/ 10 сентября 2009

Вы можете использовать оператор SQL SELECT scope_identity().

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