Часто используется термин «переполнение стека» (переполнение), но неправильное обозначение; атаки не переполняют стек, а буферы в стеке.
- из слайдов слайдов Prof. Доктор Дитер Голманн
INSERT INTO YourTable(val1, val2, val3 ...)
VALUES(@val1, @val2, @val3...);
SELECT SCOPE_IDENTITY();
не забывают точки с запятой в конце каждого оператора.
Добавьте следующую строку до конца запроса SQL...
SELECT SCOPE_IDENTITY()
И затем используют метод ExecuteScalar на объекте SqlCommand...
var rowCount = command.ExecuteScalar()
insert into Yourtable()
values()
SELECT SCOPE_IDENTITY()
я просто запустил тест и проверил, что точки с запятой являются дополнительным SQL Server 2005 SP2 использования и.Net 3.5
Добавьте выходной параметр к объекту команды и затем установите значение к новому идентификатору в хранимой процедуре.
Хранимая процедура:
@ID AS INT OUTPUT
[Insert Command]
SET @ID = SCOPE_IDENTITY()
.NET:
cmd.CommandText = "stored_procedure";
SqlParameter pID = new SqlParameter("ID", DBType.Int32, 4);
pID.Direction = ParameterDirection.Output;
cmd.ExecuteScalar();
int id = Convert.ToInt32(cmd.Parameters["ID"].Value.ToString());
Не используйте @@ ИДЕНТИФИКАЦИОННЫЕ ДАННЫЕ, однако простые, это может казаться. Это может возвратить неправильные значения.
SELECT SCOPE_IDENTITY()
, кажется, очевидный выбор.
Сразу после Вашей вставки stmt, используйте
SELECT CAST(scope_identity() AS bigint) ---- incase you have a return result as int64
, Это возвратится, столбец создал идентификатор/идентификационные данные.
Прямо из Джакузи :
при использовании SQL MS можно использовать "ВЫБОР @@ ИДЕНТИФИКАЦИОННЫЕ ДАННЫЕ как Значение" после того, как вставка для получения последнего идентификатора генерировала
и:
@@IDENTITY
иSCOPE_IDENTITY
возвращают последнее значение идентификационных данных, сгенерированное в любой таблице на текущей сессии. ОднакоSCOPE_IDENTITY
возвраты значение только в текущей области;@@IDENTITY
не ограничен определенным объемом.
Редактирование: , Как указано в комментариях, необходимо всегда использовать SCOPE_IDENTITY
, не @@IDENTITY
.
Хотя мне нравится Dave Markle ответ, (и я вижу, что Вы сделали также, так как Вы отметили его как свой ответ), тот метод может перестать работать, если Вы имеете, включает Вашу базу данных, тот контрольный CUD операции, и Ваша контрольная таблица имеет столбец IDENTITY. Это возвратило бы значение идентификационных данных таблицы Audit, не таблица Вы просто вставили в, так как контрольная таблица на самом деле происходит после.
В этом случае, больше общего метода может использоваться, который будет работать в обоих случаях, независимо от любого аудита. Это немного более многословно, но Вы получаете то, за что Вы платите.
пример:
@"DECLARE @tmp AS TABLE ( id int )
INSERT INTO case
(
caseID,
partID,
serialNumber,
hardware,
software,
firmware
)
OUTPUT Inserted.ID into @tmp
VALUES
(
@caseID,
@partItemID,
@serialNumber,
@hardware,
@software,
@firmware
)
Select ID from @tmp" )