Возвращаемое значение из команды SQL Server Insert с использованием С#
Используя С# в Visual Studio, я вставляю строку в таблицу следующим образом:
INSERT INTO foo (column_name)
VALUES ('bar')
Я хочу сделать что-то подобное, но я не знаю правильного синтаксиса:
INSERT INTO foo (column_name)
VALUES ('bar')
RETURNING foo_id
Это вернет столбец foo_id
из недавно вставленной строки.
Кроме того, даже если я нахожу правильный синтаксис для этого, у меня есть другая проблема: у меня есть SqlDataReader
и SqlDataAdapter
в моем распоряжении. Насколько мне известно, первая предназначена для чтения данных, вторая предназначена для манипулирования данными. При вставке строки с оператором return я обрабатываю и считываю данные, поэтому я не уверен, что использовать. Может быть, есть что-то совершенно другое, что я должен использовать для этого?
Ответы
Ответ 1
SCOPE_IDENTITY возвращает последнее значение идентичности, вставленное в столбец идентификатора в той же области. Объем - это модуль: хранимая процедура, триггер, функция или партия. Поэтому два оператора находятся в одной и той же области, если они находятся в одной и той же хранимой процедуре, функции или партии.
Вы можете использовать SqlCommand.ExecuteScalar для выполнения команды insert и получения нового идентификатора в одном запросе.
using (var con = new SqlConnection(ConnectionString)) {
int newID;
var cmd = "INSERT INTO foo (column_name)VALUES (@Value);SELECT CAST(scope_identity() AS int)";
using (var insertCommand = new SqlCommand(cmd, con)) {
insertCommand.Parameters.AddWithValue("@Value", "bar");
con.Open();
newID = (int)insertCommand.ExecuteScalar();
}
}
Ответ 2
попробуйте следующее:
INSERT INTO foo (column_name)
OUTPUT INSERTED.column_name,column_name,...
VALUES ('bar')
OUTPUT может возвращать набор результатов (среди прочего), см. Предложение OUTPUT (Transact-SQL). Кроме того, если вы вставляете несколько значений (INSERT SELECT), этот метод возвращает одну строку на вставленную строку, где другие методы возвращают только информацию в последней строке.
рабочий пример:
declare @YourTable table (YourID int identity(1,1), YourCol1 varchar(5))
INSERT INTO @YourTable (YourCol1)
OUTPUT INSERTED.YourID
VALUES ('Bar')
ВЫВОД:
YourID
-----------
1
(1 row(s) affected)
Ответ 3
Я думаю, вы можете использовать @@IDENTITY для этого, но я думаю, что вокруг него есть специальные правила/ограничения?
using (var con = new SqlConnection("connection string"))
{
con.Open();
string query = "INSERT INTO table (column) VALUES (@value)";
var command = new SqlCommand(query, con);
command.Parameters.Add("@value", value);
command.ExecuteNonQuery();
command.Parameters.Clear();
command.CommandText = "SELECT @@IDENTITY";
int identity = Convert.ToInt32(command.ExecuteScalar());
}