我可以在ASP.NET中显示存储过程的结果吗?

本文关键字:结果 存储过程 显示 ASP NET 我可以 | 更新日期: 2023-09-27 18:13:53

这是我的存储过程,我在其中向数据库插入记录,如果存在记录,则更新记录。我能否得到结果,比如有多少条记录被更新了,有多少条记录被插入了?

// 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();
    }
}

我可以在ASP.NET中显示存储过程的结果吗?

要获得两个不同的数字,插入和更新,您可以更改存储过程以允许一对输出变量,并将它们作为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

在代码体中,声明一个表变量来保存merge的输出;

BEGIN
    SET NOCOUNT ON;
    declare @outputtable table ([action] nvarchar(10), [count] int);

然后在merge中添加(最后)行来填充这个表:

    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

(到目前为止发布的所有代码行组成了新的存储过程。)

你现在需要添加2个额外的参数到你的c#代码:

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();
    }
}

基于MSDN:

对于UPDATE、INSERT和DELETE语句,返回值是受该命令影响的行数。当正在插入或更新的表上存在触发器时,返回值包括受插入或更新操作影响的行数以及受一个或多个触发器影响的行数。对于所有其他类型的语句,返回值为-1。如果发生回滚,返回值也是-1。

所以你只需要将ExecuteNonQuery的返回值存储在一个变量中,就像这样:

int count = cmd.ExecuteNonQuery();