其实这个问题好多年以前研究过:
https://blog.csdn.net/xpnew/article/details/6909902
最近因为需要统计日结月结, 给同事写了一套调用存储过程的代码. 同时因为项目 ORM 层是通过 SqlSugar 实现的, 就又研究了一下 SqlSugar 调用存储过程的内容.
折腾了一番之后, 对于[c# 获取存储过程返回值] 这个技术点, 又有了新一层认识. 下面写一下要点总结:
一, 核心内容是指定 Command 参数的 Direction
MyCommand.Parameters["@return"].Direction = ParameterDirection.ReturnValue;
这个和以前的的看法是一样的. 只是这次经历的研究, 发现有很多细节在里面, 在后面逐一列出
二, 调用存储过程的方法: GetScalar 和 ExecuteCommand
在 SqlSugar 当中, 使用 Direction 的办法, 这两种调用方法都能正确地返回值.
但是这两个方法, 实际上是不一样的:
GetScalar 返回的是结果集 (表格) 的第一行, 第一列.
ExecuteCommand 是执行了存储过程, 成功更新 / 添加多少条.
具体来说:
■完全没有执行任何更新, 插入, 返回 - 1
■只有 UPDATE DELET INSERT 执行的结果会算在内, 上图的 2/3/3 分别是随便添加了一个 update 更新了 2 行, 删除了原来的统计结果 3 条, 重新计算了统计结果再插入也是 3 条.
■包含多个 UPDATE DELET INSERT 操作的时候, 返回的结果是全部操作行数之和.
三, 存储过程里面的 Select/Update 和 Return
在不太严谨的使用当中, 可以用 Select 代替 Return Value(前提是通过 GetScalar 调用 )
存储过程当中 这样写:
执行结果:
c# 代码调试:
不过当我做了一个简单的干扰就不行了.
比如说我在最终返回之前添加了一个 select
在 SQL Server 管理器里面:
C# 代码调试:
也就是说, 使用 Select 返回结果是有局限的, 不能在最终返回之前有任何其它的 SELECT.
当然, UPDATE 就更不行了. 参见上一节.
总之, 假如想把存储过程当作一个有返回代码的 "函数","方法" 看待的话, 还是要用 OUTPUT 或者 ReturnValue
四, ReturnValue 的其它细节
1, 需要在执行之前添加到 Command 参数里.
以前在 c# 通过 ADO.NET 连接数据库的时候, 我好像验证过, 执行之前指定了返回参数才有这个处理, ADO.NET 不会自动处理.
SqlSugar 里面这次验证过了, 不添加是不会自动生成这个参数的, 看了源代码也是这样.
2,ReturnValue 是 "额外的" 参数数量, 如果出现了 "使用了过多的参数数量" 一类的异常, 请检查其它参数, 从其它的参数上寻找问题.
3, 参数的名称无关紧要, 只要不会干扰到其它传入, 传出参数就行.
来源: https://www.cnblogs.com/xpnew/p/CSharp_GET_StoreProcedure_ReturnValue_2.html