我想使用C#ADO.Net从此插入命令接收所有输出主键。
我在SQL Server 2012 Studio中运行它,我看到了包含所有值的结果表,那么是否可以从C#获取该表?
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);
我在C#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代码。它工作正常。 (不确定'this。'来自哪里,但它没有引起任何问题)
在调试器中,insertedOutput中有cmd.ExecuteReader()的结果,但是我无法从dt(一个DataTable变量)复制那些结果。
答案 0 :(得分:2)
您的查询看起来很好(this.created_by
/ this.updated_by
除外,令我感到困惑,但......如果您说它有效......)
因此,我最初的想法是:你是否有一个错误的只触发一行的触发器?虽然我希望报告:
如果语句包含没有INTO子句的OUTPUT子句,则DML语句的目标表'dbo.Suspension'不能具有任何已启用的触发器。
以下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
}
答案 1 :(得分:0)
您可以使用插入行中标识列的值并将其存储在表中,然后从中获取值。
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是你的标识栏:)