• 再论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、参数的名称无关紧要,只要不会干扰到其它传入、传出参数就行。

     

  • 相关阅读:
    将指定byte数组以16进制的形式打印到控制台
    Java输出当前的日期(年月日时分秒毫秒)
    JAVA API从MongoDB中读取数据
    Hbase API 写入操作代码,基于hbase-client 1.0.3版本
    关于ROW_NUMBER函数的使用(The use of ROW_NUMBER function )
    网络知识点
    C++学习笔记
    Linux网络编程--tinyhttpd
    Linux多线程编程
    inet_ntop返回值错误
  • 原文地址:https://www.cnblogs.com/xpnew/p/CSharp_GET_StoreProcedure_ReturnValue_2.html
Copyright © 2020-2023  润新知