其实这个问题好多年以前研究过:

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)的更多相关文章

  1. C# 获取 存储过程 返回值

    C#获取存储过程的返回值,这一方法,总是容易忘,今天给贴出来,以方便下次使用 存储过程: CREATE  PROCEDURE [dbo].[Proc_GetInfo]     ),     ) out ...

  2. C#获取存储过程返回值和输出参数值的方法

    //转自网络,先留个底 1.获取Return返回值 //存储过程 //Create PROCEDURE MYSQL // @a int, // @b int //AS // return @a + @ ...

  3. SqlDataReader 获取存储过程返回值

    编写存储过程,获取不到返回值 附上代码: SqlDataReader reader = null;// totalRecords = ; try { SqlConnectionHolder conne ...

  4. 【转】SQL SERVER 获取存储过程返回值

    1.OUPUT参数返回值 CREATE PROCEDURE [dbo].[nb_order_insert]( @o_buyerid int , @o_id bigint OUTPUT ) AS BEG ...

  5. EF中执行存储过程,获取output返回值

    EF不能直接支持执行存储过程,于是使用转化成执行SQL语句的形式,却怎么也获取不到output的值,折腾的好久,终于解决了,分享下曲折的经历: public int AddVote(int title ...

  6. 用jquery的ajax方法获取return返回值的正确姿势

    如果jquery中,想要获取ajax的return返回值,必须注意两方面,ajax的同步异步问题,在ajax方法里面还是外面进行return返回值. 下面列举了三种写法,如果想成功获取到返回值,参考第 ...

  7. SQL存储过程返回值

    1 SQL存储过程返回值有3种 1.1 直接return返回(例如 return 1): 1.2 通过参数output返回(例如字符串类型): 1.3 直接返回程序集(Dataset程序集). 2 用 ...

  8. Shell $?获取函数返回值或者上一个命令的退出状态

    Shell $?获取函数返回值或者上一个命令的退出状态 来自:互联网 时间:2021-01-12 阅读:2 $? 是一个特殊变量,用来获取上一个命令的退出状态,或者上一个函数的返回值. 所谓退出状态, ...

  9. python获取线程返回值

    python获取线程返回值 前言 工作中的需求 将前端传过来的字符串信息通过算法转换成语音,并将语音文件返回回去 由于算法不是我写的,只需要调用即可,但是算法执行速度相当缓慢 我的优化思路是,将前端的 ...

随机推荐

  1. python+NLTK 自然语言学习处理三:如何在nltk/matplotlib中的图片中显示中文

    我们首先来加载我们自己的文本文件,并统计出排名前20的字符频率 if __name__=="__main__": corpus_root='/home/zhf/word' word ...

  2. ubuntun下安装sublime text

    Sublime Text 3 是一款轻量级.跨平台的文本编辑器.可安装在ubuntu,Windows和MAC OS X上高级文本编辑软件,有一个专有的许可证,但该程序也可以免费使用,无需做逆向工程.如 ...

  3. Oozie-1-安装、配置 让Hadoop流动起来

    版权声明:本文为博主原创文章,未经博主同意不得转载. https://blog.csdn.net/wl101yjx/article/details/27881739 写在前面一: 本文总结 基于Had ...

  4. High Performance Browser Networking

    Chapter 1. Primer on Latency and Bandwidth As a result, to improve performance of our applications, ...

  5. Java for LeetCode 117 Populating Next Right Pointers in Each Node II

    Follow up for problem "Populating Next Right Pointers in Each Node". What if the given tre ...

  6. python3用pdfminer3k在线读取pdf文件

    import importlib import sys import random from urllib.request import urlopen from urllib.request imp ...

  7. Java基础教程:多线程基础(4)——Lock的使用

    Java基础教程:多线程基础(4)——Lock的使用 快速开始 Java 5中Lock对象的也能实现同步的效果,而且在使用上更加方便. 本节重点的2个知识点是:ReentrantLock类的使用和Re ...

  8. 在win7下使用git和gitlab进行code review

    1.安装 Git-2.6.3-64-bit.exe  下载地址:http://pan.baidu.com/s/1hqGvwnq 2.根据收到的邮件进入gitlab网站,并修改密码登陆 3.新建一个文件 ...

  9. html中css的三种样式

    在html中定义CSS样式的方法有三种,新建CSS文件 使用link 关联 这种是最常用的外部引用样式,第二种讲样式写在 head 头部里面 这种是页面样式 ,第三中样式直接写在行内  style里面 ...

  10. python- python内置模块 面向对象

    1.configparser模块 configparser用于处理特定格式的文件,其本质上是利用open来操作文件 # 注释1 ; 注释2 [section1] # 节点 k1 = v1 # 值 k2 ...