这是我的存储过程,其中我在数据库中插入记录,如果记录存在,则会更新。所以我的问题是,我可以获得更新的记录数以及插入的记录数吗?
// stored procedure
ALTER PROCEDURE [dbo].[Update_F3_BC_Column_Mapping]
@tblF3_BC_Column_Mapping F3_BC_Column_MappingType READONLY
AS
BEGIN
SET NOCOUNT ON;
MERGE INTO F3_BC_Column_Mapping c1
USING @tblF3_BC_Column_Mapping c2
ON c1.Id=c2.Id
WHEN MATCHED THEN
UPDATE SET c1.Source = c2.Source
,c1.Destination = c2.Destination
WHEN NOT MATCHED THEN
INSERT VALUES(c2.Id, c2.Source, c2.Destination);
END
//c# code
connection();
{
using (SqlCommand cmd = new SqlCommand("Update_F3_BC_Column_Mapping"))
{
cmd.CommandType = CommandType.StoredProcedure;
cmd.Connection = con;
cmd.Parameters.AddWithValue("@tblF3_BC_Column_Mapping", dtMap);
con.Open();
cmd.ExecuteNonQuery();
con.Close();
}
}
答案 0 :(得分:3)
要获得2个不同的数字,插入和更新,您可以更改存储过程以允许几个输出变量,并将它们作为参数在c#中处理。
在程序的标题中,添加2个输出参数:
ALTER PROCEDURE [dbo].[Update_F3_BC_Column_Mapping]
@tblF3_BC_Column_Mapping F3_BC_Column_MappingType READONLY,
@updated_count int output,
@inserted_count int output
AS
在正文中,声明一个表变量来保存合并的输出;
BEGIN
SET NOCOUNT ON;
declare @outputtable table ([action] nvarchar(10), [count] int);
然后在合并中添加(最后一行)以填充此表:
MERGE INTO F3_BC_Column_Mapping c1
USING @tblF3_BC_Column_Mapping c2
ON c1.Id=c2.Id
WHEN MATCHED THEN
UPDATE SET c1.Source = c2.Source
,c1.Destination = c2.Destination
WHEN NOT MATCHED THEN
INSERT VALUES(c2.Id, c2.Source, c2.Destination)
OUTPUT $action , 1 INTO @outputtable;
现在,您可以通过计算此输出表中的行来填充输出变量,以结束存储过程:
select @updated_count = sum([count]) from @outputtable where [action] = 'UPDATE';
select @inserted_count = sum([count]) from @outputtable where [action] = 'INSERT';
END
(到目前为止发布的所有代码行都构成了新的存储过程。)
您现在需要为c#code添加2个附加参数:
connection();
{
using (SqlCommand cmd = new SqlCommand("Update_F3_BC_Column_Mapping"))
{
cmd.CommandType = CommandType.StoredProcedure;
cmd.Connection = con;
cmd.Parameters.AddWithValue("@tblF3_BC_Column_Mapping", dtMap);
cmd.Parameters.Add("@updated_count", SqlDbType.Int).Direction = ParameterDirection.Output;
cmd.Parameters.Add("@inserted_count", SqlDbType.Int).Direction = ParameterDirection.Output;
运行查询后,可以使用value属性访问输出:
con.Open();
cmd.ExecuteNonQuery();
int updated = Convert.ToInt32(cmd.Parameters["@updated_count"].Value);
int inserted = Convert.ToInt32(cmd.Parameters["@inserted_count"].Value);
然后完成代码:
con.Close();
}
}
答案 1 :(得分:2)
基于MSDN:
对于UPDATE,INSERT和DELETE语句,返回值是受命令影响的行数。当插入或更新的表上存在触发器时,返回值包括插入或更新操作影响的行数以及受触发器或触发器影响的行数。对于所有其他类型的语句,返回值为-1。如果发生回滚,则返回值也为-1。
所以你只需要将ExecuteNonQuery
的返回值存储在这样的变量中:
int count = cmd.ExecuteNonQuery();