SqlCommand.ExecuteReader 无法获取 sqlserver 存储过程 OUTPUT 返回的参数值问题

本文介绍了一种使用C#和SQL存储过程实现的产品列表分页查询方法。具体包括:构造SQL命令对象并设置存储过程名称及参数,通过读取数据并解析形成产品对象列表,确保关闭数据读取器后获取输出参数的值。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

public List<Product> GetProducts(long companyId, int pageSize, int pageIndex, out int rowCount)
{
List<Product> list = new List<Product>();
using (SqlConnection conn = new SqlConnection(SQLHelp.DBConnectionString))
{
SqlCommand cmd = new SqlCommand();

cmd.Connection = conn;
cmd.CommandText = "proc_Care365_ProductPage";
cmd.CommandType = CommandType.StoredProcedure;

cmd.Parameters.Add(new SqlParameter("@CompanyId", companyId));
cmd.Parameters.Add(new SqlParameter("@PageSize", pageSize));
cmd.Parameters.Add(new SqlParameter("@PageIndex", pageIndex));

SqlParameter param = new SqlParameter("@RowCount", SqlDbType.Int);
param.Direction = ParameterDirection.Output;
cmd.Parameters.Add(param);

try
{
conn.Open();
SqlDataReader reader = cmd.ExecuteReader();
if (reader != null && !reader.IsClosed && reader.HasRows)
{
while (reader.Read())
{
Product p = FabricateProduct(reader);
p.Tags = new ProductTageDAL().GetProductTags(p.Id);
p.Images = new ProductImageDAL().GetImagesByProductId(p.Id);

list.Add(p);
}

reader.Close();
reader.Dispose();
rowCount = Convert.ToInt32(cmd.Parameters["@RowCount"].Value.ToString());
cmd.Dispose();
conn.Close();
conn.Dispose();

return list;
}
else
{
rowCount = 0;
return null;
}
}
catch
{
rowCount = 0;
return null;
}
}
}

这里要注意的是,在获取output类型参数的值的时候,必须要把reader关掉,否则无法获取值.

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值