再论c#获取存储过程返回值(包括SqlSugar)
其实这个问题好多年以前研究过:
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、参数的名称无关紧要,只要不会干扰到其它传入、传出参数就行。
再论c#获取存储过程返回值(包括SqlSugar)的更多相关文章
- C# 获取 存储过程 返回值
C#获取存储过程的返回值,这一方法,总是容易忘,今天给贴出来,以方便下次使用 存储过程: CREATE PROCEDURE [dbo].[Proc_GetInfo] ), ) out ...
- C#获取存储过程返回值和输出参数值的方法
//转自网络,先留个底 1.获取Return返回值 //存储过程 //Create PROCEDURE MYSQL // @a int, // @b int //AS // return @a + @ ...
- SqlDataReader 获取存储过程返回值
编写存储过程,获取不到返回值 附上代码: SqlDataReader reader = null;// totalRecords = ; try { SqlConnectionHolder conne ...
- 【转】SQL SERVER 获取存储过程返回值
1.OUPUT参数返回值 CREATE PROCEDURE [dbo].[nb_order_insert]( @o_buyerid int , @o_id bigint OUTPUT ) AS BEG ...
- EF中执行存储过程,获取output返回值
EF不能直接支持执行存储过程,于是使用转化成执行SQL语句的形式,却怎么也获取不到output的值,折腾的好久,终于解决了,分享下曲折的经历: public int AddVote(int title ...
- 用jquery的ajax方法获取return返回值的正确姿势
如果jquery中,想要获取ajax的return返回值,必须注意两方面,ajax的同步异步问题,在ajax方法里面还是外面进行return返回值. 下面列举了三种写法,如果想成功获取到返回值,参考第 ...
- SQL存储过程返回值
1 SQL存储过程返回值有3种 1.1 直接return返回(例如 return 1): 1.2 通过参数output返回(例如字符串类型): 1.3 直接返回程序集(Dataset程序集). 2 用 ...
- Shell $?获取函数返回值或者上一个命令的退出状态
Shell $?获取函数返回值或者上一个命令的退出状态 来自:互联网 时间:2021-01-12 阅读:2 $? 是一个特殊变量,用来获取上一个命令的退出状态,或者上一个函数的返回值. 所谓退出状态, ...
- python获取线程返回值
python获取线程返回值 前言 工作中的需求 将前端传过来的字符串信息通过算法转换成语音,并将语音文件返回回去 由于算法不是我写的,只需要调用即可,但是算法执行速度相当缓慢 我的优化思路是,将前端的 ...
随机推荐
- 【足迹C++primer】35、特定容器算法
版权声明:本文为博主原创文章,未经博主同意不得转载. https://blog.csdn.net/cutter_point/article/details/33732681 特定容器算法 lst.me ...
- JAVA 水果机游戏及编码
[转自 http://tech.it168.com/j/2007-11-07/200711070910328_1.shtml] 3. 游戏的开发与编码 在我们开发这个游戏之前,我们先讲一个这 ...
- Arcgis SOE学习
http://blog.csdn.net/lovecarpenter/article/details/53178233 http://blog.csdn.net/lovecarpenter/artic ...
- Java基础教程:面向对象编程[3]
Java基础教程:面向对象编程[3] 内容大纲 基础编程 获取用户输入 java.util.Scanner 是 Java5 的新特征,我们可以通过 Scanner 类来获取用户的输入.我们可以查看Ja ...
- systemclock sleep 睡眠
- 7-3 堆栈模拟队列(25 point(s)) 【数据结构】
7-3 堆栈模拟队列(25 point(s)) 设已知有两个堆栈S1和S2,请用这两个堆栈模拟出一个队列Q. 所谓用堆栈模拟队列,实际上就是通过调用堆栈的下列操作函数: int IsFull(Stac ...
- Django 之 Paginator 分页功能
Django Paginator Django 分页官方文档 https://docs.djangoproject.com/en/1.10/topics/pagination/ 此分页方法没有限制显 ...
- Linux (ubuntu和redhat) 常用命令及细节
1.关闭防火墙(Ubuntu) sudo ufw disable 2.vi 拷贝 参考http://blog.sina.com.cn/s/blog_601331150100ecfr.html 一) ...
- 分享知识-快乐自己:论 Mybatis中的关联关系(一对多,多对一,多对多)
论:一对多:(举例一个省有多个市)就是实体类中有(市)类型集合属性:多对一:(多个市有一个共同的省)就是类中有(省)类型的属性.下面来介绍:一对一.多对一的使用方式. 一对多方: package ml ...
- linux进程学习-进程描述符的存储
当进程被新建时,内核会给进程分配一个8K的空间作为进程的内核堆栈.同时我们知道task_struct结构体也会被创建,但有意思的是,内核不会给task_struct单独分别空间,而是直接将其扔到8k的 ...