本节演示,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 返回值参数
- 参数名称强制固定字符串
ReturnValue,不能自定义名字 Direction = ParameterDirection.ReturnValue- SQL Server 存储过程
return 数值只能传递int类型 - 执行完
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带回的值)
汇总
| 方法 | 返回内容 | 适用场景 |
|---|---|---|
| ExecuteReader | SqlDataReader(流式多行) | 查询多条数据 |
| SqlDataAdapter.Fill | DataSet/DataTable(离线表) | WinForm控件绑定表格 |
| ExecuteScalar | object(单行首列) | 只需要单个聚合结果 |
| ExecuteNonQuery | int(受影响行数)+ReturnValue返回值 | 新增/更新/删除,需要存储过程返回状态码 |
Previous: SqlDataAdapter