在 C# 中如何获取存储过程的返回值 ?
咨询区
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 的话,可以参考我的实现。
假如下面是你存储过程的语句
select ID, FILE_NAME from dbo.FileStorage where ID = (select max(ID) from dbo.FileStorage);
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# 中如何获取存储过程的返回值 ?相关推荐
- SQLServer存储过程的返回值 查询分析器/程序
1.存储过程没有返回值的情况(即存储过程语句中没有return之类的语句) 用方法 int count = ExecuteNonQuery(..)执行存储过程其返回值只有两种情况 (1)如果通过查询 ...
- 关于ExecuteNonQuery执行存储过程的返回值 、、实例讲解存储过程的返回值与传出参数、、、C#获取存储过程的 Return返回值和Output输出参数值...
关于ExecuteNonQuery执行存储过程的返回值 用到过ExecuteNonQuery()函数的朋友们在开发的时候肯定这么用过. if(cmd.ExecuteNonQuery("xxx ...
- SpringAop切面中获取方法的返回值
场景: 需要用到aop统一接口异常的返回值 当接口抛出异常的时候封装成response对象,但是如果不同接口要返回的response不同,需要在执行前获取到接口返回值的类型 如果要取到方法的返回值,需 ...
- 将存储过程的返回值赋给变量
1.OUPUT参数返回值 复制代码代码如下: CREATE PROCEDURE [dbo].[nb_order_insert]( @o_buyerid int , @o_id bigint OUTPU ...
- 统计文件种类数+获取子shell返回值的其它方法
前言 只是作为一个shell的小小练习和日常统计用,瞎折腾的过程中也是摸到了获取子shell返回值的几种方法: 肯定还有别的方法,跟进程间的通信相关,希望你能提出建议和补充,谢谢~ 完整程序: #! ...
- ajax成功进入success但是获取不到返回值
一.前言 最近做前端的时候,发现个奇怪的问题,ajax获取不到返回值了,问题是还是会到success中,也是可以正常打印的,就是没有response,奇怪. 二.正文 1.首先是不走success的问 ...
- python 多进程multiprocessing 如何获取子进程的返回值?进程池pool,apply_async(),get(),
案例1 # -*- coding: utf-8 -*- """ @File : 20200318_摄像头多进程流传输.py @Time : 2020/3/18 14:58 ...
- python3 协程 返回值_python asyncio 获取协程返回值和使用callback
1. 获取协程返回值,实质就是future中的task import asyncio import time async def get_html(url): print("start ge ...
- linux获取命令的返回值,Shell $?:获取函数返回值或者上一个命令的退出状态
$?是一个特殊变量,用来获取上一个命令的退出状态,或者上一个函数的返回值. 所谓退出状态,就是上一个命令执行后的返回结果.退出状态是一个数字,一般情况下,大部分命令执行成功会返回0,失败返回1,这和C ...
最新文章
- linux最常用的目录表示,Linux磁盘分区的命名方式和常用目录?【每日一个知识点第84期-Linux】...
- 相似图片搜索的原理(转)
- 中秋主题html,中秋节活动主题标语
- (9)Node.js 内置模块
- .NET Core中Quartz.NET的依赖注入
- python int函数和二进制、八进制、十进制转换
- hive if函数_数据仓库,Hive中使用 != 或 lt;gt;; 符号进行条件过滤时的坑
- 三角网导线平差实例_附合导线平差步骤
- Lottie动画测试工具
- java.util.TaskQueue的最小堆排序算法的应用
- 英:常见符号英文读法
- Modeling and Enhancing Low-Quality Retinal Fundus Images
- 伦斯勒理工大学计算机专业,伦斯勒理工学院计算机科学硕士排名第60(2020年TFE Times排名)...
- 中国无糖牛奶巧克力行业市场供需与战略研究报告
- 51单片机LCD1602显示电子时钟 带按键设置和星期显示
- FPGA的矩阵键盘驱动( 修正版)
- 龙族幻想微信一区哪个服务器人多,龙族幻想哪个区人最多_龙族幻想哪个区人多一点...
- 从商品溯源到历史载录,区块链技术的革新
- 判断奇偶性。输入一个整数n,判断n是奇函数还是偶数,若为奇函数输出“奇数”,若为偶函数输出“偶数”
- 腾讯百度阿里,三巨头谁最开放?
热门文章
- php实现pdf文件的生成与下载
- unix环境高级编程基础知识之第二篇(3)
- (转)svn检出的时候报 Unable to connect to a repository at URL错误
- AM335x 添加 HUAWEI MU609 Mini PCIe Module,并用pppd 启动相关设备
- 基于tiny4412的Linux内核移植 -- MMA7660驱动移植(九)
- 面向对象——一起来复习托付与事件!
- php 输出缓冲区清理
- 图解一步步安装SharePoint Foundation 2010
- 在Windows 7或Vista资源管理器中禁用缩略图预览
- java部分服务出现异常_Java web service 异常