咨询区

  • GurdeepS

我有下面的查询语句:

set ANSI_NULLS ON
set QUOTED_IDENTIFIER ON
goALTER PROCEDURE [dbo].[Validate]
@a varchar(50),
@b varchar(50) outputASSET @Password =
(SELECT Password
FROM dbo.tblUser
WHERE Login = @a)RETURN @b
GO

编译都是没有问题的,现在我想执行这条sql并获取最后的返回值,我的代码是这样的。

SqlConnection SqlConn = new SqlConnection(System.Configuration.ConfigurationManager.ConnectionStrings["MyLocalSQLServer"].ConnectionString.ToString());System.Data.SqlClient.SqlCommand sqlcomm = new System.Data.SqlClient.SqlCommand("Validate", SqlConn);string returnValue = string.Empty;try{SqlConn.Open();sqlcomm.CommandType = CommandType.StoredProcedure;SqlParameter param = new SqlParameter("@a", SqlDbType.VarChar);param.Direction = ParameterDirection.Input;param.Value = Username;sqlcomm.Parameters.Add(param);SqlParameter retval = sqlcomm.Parameters.Add("@b", SqlDbType.VarChar);retval.Direction = ParameterDirection.ReturnValue;string retunvalue = (string)sqlcomm.Parameters["@b"].Value;

为了简洁,我去掉了所有的异常判断,不知道为啥 retunvalue 一直都返回  null ,请问这段代码是否有逻辑错误?

回答区

  • Ravindra Vairagi

如果你不通过 select 语句 还要获取 存储过程 的返回值,你就必须要指定 ParameterDirection.ReturnValue 枚举并通过 ExecuteScalar 获取返回值,参考我的案例。

CREATE PROCEDURE IsEmailExists@Email NVARCHAR(20)
AS
BEGIN-- SET NOCOUNT ON added to prevent extra result sets from-- interfering with SELECT statements.SET NOCOUNT ON;-- Insert statements for procedure hereIF EXISTS(SELECT Email FROM Users where Email = @Email)BEGINRETURN 0 ENDELSEBEGINRETURN 1END
END

然后是 C# 代码。

GetOutputParaByCommand("IsEmailExists")public int GetOutputParaByCommand(string Command){object identity = 0;try{mobj_SqlCommand.CommandText = Command;SqlParameter SQP = new SqlParameter("returnVal", SqlDbType.Int);SQP.Direction = ParameterDirection.ReturnValue;mobj_SqlCommand.Parameters.Add(SQP);mobj_SqlCommand.Connection = mobj_SqlConnection;mobj_SqlCommand.ExecuteScalar();identity = Convert.ToInt32(SQP.Value);CloseConnection();}catch (Exception ex){CloseConnection();}return Convert.ToInt32(identity);}

这样就可以成功获取 存储过程 的返回值了。

  • Dean

如果你的项目采用的是 Dapper 的话,可以参考我的实现。

  1. 假如下面是你存储过程的语句

select ID, FILE_NAME from dbo.FileStorage where ID = (select max(ID) from dbo.FileStorage);
  1. Dapper 写法

var data = (_dbConnection.Query<FileUploadQueryResponse>("dbo.insertFile", whateverParameters, commandType: CommandType.StoredProcedure)).ToList();var storedFileName = data[0].FILE_NAME;var id = data[0].ID;

为了能获取返回值,这里我定义了一个复杂类型 FileUploadQueryResponse 来接受存储过程的 return value。

public class FileUploadQueryResponse{public string ID { get; set; }public string FILE_NAME { get; set; }}

点评区

虽然现代开发中很少用存储过程了,但现实项目中还是有很多遗留的 存储过程 存在,所以如何获取返回值还是有必要了解一下。

在 C# 中如何获取存储过程的返回值 ?相关推荐

  1. SQLServer存储过程的返回值 查询分析器/程序

    1.存储过程没有返回值的情况(即存储过程语句中没有return之类的语句) 用方法 int count = ExecuteNonQuery(..)执行存储过程其返回值只有两种情况  (1)如果通过查询 ...

  2. 关于ExecuteNonQuery执行存储过程的返回值 、、实例讲解存储过程的返回值与传出参数、、、C#获取存储过程的 Return返回值和Output输出参数值...

    关于ExecuteNonQuery执行存储过程的返回值 用到过ExecuteNonQuery()函数的朋友们在开发的时候肯定这么用过. if(cmd.ExecuteNonQuery("xxx ...

  3. SpringAop切面中获取方法的返回值

    场景: 需要用到aop统一接口异常的返回值 当接口抛出异常的时候封装成response对象,但是如果不同接口要返回的response不同,需要在执行前获取到接口返回值的类型 如果要取到方法的返回值,需 ...

  4. 将存储过程的返回值赋给变量

    1.OUPUT参数返回值 复制代码代码如下: CREATE PROCEDURE [dbo].[nb_order_insert]( @o_buyerid int , @o_id bigint OUTPU ...

  5. 统计文件种类数+获取子shell返回值的其它方法

    前言 只是作为一个shell的小小练习和日常统计用,瞎折腾的过程中也是摸到了获取子shell返回值的几种方法: 肯定还有别的方法,跟进程间的通信相关,希望你能提出建议和补充,谢谢~ 完整程序: #! ...

  6. ajax成功进入success但是获取不到返回值

    一.前言 最近做前端的时候,发现个奇怪的问题,ajax获取不到返回值了,问题是还是会到success中,也是可以正常打印的,就是没有response,奇怪. 二.正文 1.首先是不走success的问 ...

  7. python 多进程multiprocessing 如何获取子进程的返回值?进程池pool,apply_async(),get(),

    案例1 # -*- coding: utf-8 -*- """ @File : 20200318_摄像头多进程流传输.py @Time : 2020/3/18 14:58 ...

  8. python3 协程 返回值_python asyncio 获取协程返回值和使用callback

    1. 获取协程返回值,实质就是future中的task import asyncio import time async def get_html(url): print("start ge ...

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

    $?是一个特殊变量,用来获取上一个命令的退出状态,或者上一个函数的返回值. 所谓退出状态,就是上一个命令执行后的返回结果.退出状态是一个数字,一般情况下,大部分命令执行成功会返回0,失败返回1,这和C ...

最新文章

  1. linux最常用的目录表示,Linux磁盘分区的命名方式和常用目录?【每日一个知识点第84期-Linux】...
  2. 相似图片搜索的原理(转)
  3. 中秋主题html,中秋节活动主题标语
  4. (9)Node.js 内置模块
  5. .NET Core中Quartz.NET的依赖注入
  6. python int函数和二进制、八进制、十进制转换
  7. hive if函数_数据仓库,Hive中使用 != 或 lt;gt;; 符号进行条件过滤时的坑
  8. 三角网导线平差实例_附合导线平差步骤
  9. Lottie动画测试工具
  10. java.util.TaskQueue的最小堆排序算法的应用
  11. 英:常见符号英文读法
  12. Modeling and Enhancing Low-Quality Retinal Fundus Images
  13. 伦斯勒理工大学计算机专业,伦斯勒理工学院计算机科学硕士排名第60(2020年TFE Times排名)...
  14. 中国无糖牛奶巧克力行业市场供需与战略研究报告
  15. 51单片机LCD1602显示电子时钟 带按键设置和星期显示
  16. FPGA的矩阵键盘驱动( 修正版)
  17. 龙族幻想微信一区哪个服务器人多,龙族幻想哪个区人最多_龙族幻想哪个区人多一点...
  18. 从商品溯源到历史载录,区块链技术的革新
  19. 判断奇偶性。输入一个整数n,判断n是奇函数还是偶数,若为奇函数输出“奇数”,若为偶函数输出“偶数”
  20. 腾讯百度阿里,三巨头谁最开放?

热门文章

  1. php实现pdf文件的生成与下载
  2. unix环境高级编程基础知识之第二篇(3)
  3. (转)svn检出的时候报 Unable to connect to a repository at URL错误
  4. AM335x 添加 HUAWEI MU609 Mini PCIe Module,并用pppd 启动相关设备
  5. 基于tiny4412的Linux内核移植 -- MMA7660驱动移植(九)
  6. 面向对象——一起来复习托付与事件!
  7. php 输出缓冲区清理
  8. 图解一步步安装SharePoint Foundation 2010
  9. 在Windows 7或Vista资源管理器中禁用缩略图预览
  10. java部分服务出现异常_Java web service 异常