Я хочу получить весь выходной первичный ключ из этой команды вставки с помощью С# ADO.Net.
Я запускаю это в SQL Server 2012 Studio, и я видел таблицу результатов со всеми значениями, так можно ли получить эту таблицу из С#?
INSERT INTO dbo.Suspension
(pallet_position, processing_pallet_pkey, datetime_created, datetime_updated,
created_by, updated_by)
OUTPUT INSERTED.pkey VALUES
(1, 2, '20141013 16:27:25.000', '20141013 16:27:25.000', 2, 2),
(2, 2, '20141013 16:27:25.000', '20141013 16:27:25.000', 2, 2),
(3, 2, '20141013 16:27:25.000', '20141013 16:27:25.000', 2, 2),
(4, 2, '20141013 16:27:25.000', '20141013 16:27:25.000', 2, 2);
Что я пробовал в С# ADO.NET. Но DataTable не получал никакого значения от insertedOutput
.
SqlCommand cmd = new SqlCommand(insertQuery, this.conn);
var insertedOutput = cmd.ExecuteReader();
DataTable dt = new DataTable();
dt.Load(insertedOutput); // something wrong here
Отметил, что я скопировал код SQL из отладчика. Он работает нормально. (не знаю, откуда это взялось, но это не вызвало никаких проблем)
В отладчике есть результаты cmd.ExecuteReader() в insertOutput, но я не могу скопировать результат из dt (переменная DataTable).
Ваш запрос выглядит отлично (за исключением this.created_by
/this.updated_by
, что меня сбивает с толку, но... если вы говорите, что это работает...)
Поэтому моя первоначальная мысль: возможно, у вас есть вместо триггера, который неправильно обрабатывает только одну строку? Хотя я ожидаю, что сообщаю:
Целевая таблица "dbo.Suspension" оператора DML не может иметь активированных триггеров, если оператор содержит предложение OUTPUT без предложения INTO.
Следующие 3 способа чтения этого sql (или очень похожей версии) работают отлично:
using (var conn = new SqlConnection(connectionString))
{
conn.Open();
const string insertQuery = @"
INSERT INTO dbo.Suspension
(pallet_position, processing_pallet_pkey, datetime_created, datetime_updated,
[this.created_by], [this.updated_by])
OUTPUT INSERTED.pkey VALUES
(1, 2, '20141013 16:27:25.000', '20141013 16:27:25.000', 2, 2),
(2, 2, '20141013 16:27:25.000', '20141013 16:27:25.000', 2, 2),
(3, 2, '20141013 16:27:25.000', '20141013 16:27:25.000', 2, 2),
(4, 2, '20141013 16:27:25.000', '20141013 16:27:25.000', 2, 2);";
// via datatable
DataTable dt = new DataTable();
using (SqlCommand cmd = new SqlCommand(insertQuery, conn))
using (var insertedOutput = cmd.ExecuteReader())
{
dt.Load(insertedOutput);
}
Console.WriteLine(dt.Rows.Count); // 4
// via manual read
var list = new List<int>();
using (SqlCommand cmd = new SqlCommand(insertQuery, conn))
using (var insertedOutput = cmd.ExecuteReader())
{
while(insertedOutput.Read())
{
list.Add(insertedOutput.GetInt32(0));
}
}
Console.WriteLine(list.Count); // 4
// via dapper
var ids = conn.Query<int>(insertQuery).ToList();
Console.WriteLine(ids.Count); // 4
}
create table Suspension (pkey int not null identity(1,1), pallet_position int, processing_pallet_pkey int, datetime_created datetime, datetime_updated datetime, [this.created_by] int, [this.updated_by] int);
Вы можете использовать значение столбца идентификации во вставленной строке и сохранить его в таблице, а затем извлечь из него значения.
DECLARE @tblIds TABLE (id int)
Insert into dbo.Suspension
(pallet_position, processing_pallet_pkey, datetime_created, datetime_updated,
created_by, updated_by)
OUTPUT inserted.pkey INTO @tblIds
values
(1, 2, '20141013 16:27:25.000', '20141013 16:27:25.000', 2, 2),
(2, 2, '20141013 16:27:25.000', '20141013 16:27:25.000', 2, 2),
(3, 2, '20141013 16:27:25.000', '20141013 16:27:25.000', 2, 2),
(4, 2, '20141013 16:27:25.000', '20141013 16:27:25.000', 2, 2)
select * from @tblIds
Здесь я предполагаю, что pkey - это ваш столбец идентичности :)
// this cause an error.
<=== что говорит ошибка?