存储过程 Return

本节演示,ADO.NET 调用存储过程:ExecuteNonQuery 获取受影响行数 同时存储过程Return返回值

一、数据库存储过程定义

create procedure mynewproc(@id int)
as
begin
    declare @cout int
    -- 更新语句
    update Article set title = '111' where id = @id
    -- 统计id大于传入参数的记录数量
    select @cout = count(1) from Article where id > @id
    -- return 返回数值(SQL Server存储过程return只能返回int)
    return @cout
endCode language: PHP (php)

重点:return @cout 是存储过程返回值,区别于输出参数output

二、C# 中调用

string connectionString = "Data Source=.;Initial Catalog=db;Integrated Security=SSPI;";
using (SqlConnection connection = new SqlConnection(connectionString))
{
    connection.Open();
    SqlCommand command = new SqlCommand("mynewproc", connection);
    command.CommandType = CommandType.StoredProcedure;

    // 【关键】注册Return返回值参数,名称固定为 ReturnValue
    SqlParameter para = new SqlParameter(
        "ReturnValue",
        SqlDbType.Int,
        4,
        ParameterDirection.ReturnValue,
        false,0,0,string.Empty,DataRowVersion.Default,null);
    command.Parameters.Add(para);

    // 存储过程输入参数 @id
    SqlParameter param = new SqlParameter("@id", SqlDbType.Int, 8);
    param.Value = 4;
    param.Direction = ParameterDirection.Input;
    command.Parameters.Add(param);

    // ExecuteNonQuery:执行增删改,返回【update语句受影响行数】
    int rowsAffected = command.ExecuteNonQuery();
    // 获取存储过程 return 带回的值
    int result = (int)command.Parameters["ReturnValue"].Value;
}Code language: PHP (php)

推荐写法

string connectionString = "Data Source=.;Initial Catalog=db;Integrated Security=SSPI;";
using (SqlConnection conn = new SqlConnection(connectionString))
using (SqlCommand cmd = new SqlCommand("mynewproc", conn))
{
    conn.Open();
    cmd.CommandType = CommandType.StoredProcedure;

    // 注册返回值参数(名称固定:ReturnValue,方向必须ReturnValue)
    cmd.Parameters.Add("ReturnValue", SqlDbType.Int).Direction = ParameterDirection.ReturnValue;
    // 输入参数
    cmd.Parameters.Add("@id", SqlDbType.Int).Value = 4;

    // rowsAffected = update 语句修改了多少条数据
    int rowsAffected = cmd.ExecuteNonQuery();
    // 获取存储过程 return @cout 的数值
    int procReturnVal = (int)cmd.Parameters["ReturnValue"].Value;
}Code language: JavaScript (javascript)

注意

1. int rowsAffected = command.ExecuteNonQuery();
  • 含义:DML语句(update/delete/insert)受影响的行数
  • 在本案例:update Article set title='111' where id=@id 匹配并修改的记录条数
  • 不是存储过程return返回的值!两者完全独立
2. ReturnValue 返回值参数
  1. 参数名称强制固定字符串 ReturnValue,不能自定义名字
  2. Direction = ParameterDirection.ReturnValue
  3. SQL Server 存储过程 return 数值 只能传递int类型
  4. 执行完ExecuteNonQuery()之后,才能读取该参数的值

  • return 返回值:只能1个、int类型
  • output输出参数:可以多个,支持各种数据类型

区别

-- 存储过程内
update Article set title='111' where id=4; -- 假设修改1条
return 10; -- return返回值Code language: PHP (php)

执行后:

  • rowsAffected = 1 (update影响行数)
  • procReturnVal = 10(return带回的值)

汇总

方法返回内容适用场景
ExecuteReaderSqlDataReader(流式多行)查询多条数据
SqlDataAdapter.FillDataSet/DataTable(离线表)WinForm控件绑定表格
ExecuteScalarobject(单行首列)只需要单个聚合结果
ExecuteNonQueryint(受影响行数)+ReturnValue返回值新增/更新/删除,需要存储过程返回状态码

Previous:

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注