C#中的ref和out与SQL中的output
什么时候会需要使用ref和out
- 有时,我们会需要获取某个值在方法中的运行状态,根据定义的方法,我们仅仅能够获得一个返回值,但是,有时我们也许想获取多个值,通过返回值就不能返回这样的信息,我们可以通过在参数前使用ref或out,以得到多个返回值.
- 在执行Sql存储过程时,我们可以通过sql语句在存储过程中的运行状态,返回相应的值.sql的return只支持Int格式的返回值,通过使用ref或out我们就可以获取多个返回值,并提示给页面
ref和out有什么区别:
示例
例1:在asp.net页面使用ref和out
protected void Page_Load(object sender, EventArgs e)
{
string str1, str2, s1 = "第一个参数", s2 = "第二个参数"; //运行下面一行代码,会提示以下错误:
// 使用了未赋值的局部变量“str1”
UseRef(ref str1, ref str2);
//输出结果:
// 第一个参数使用ref
// 第二个参数使用ref
UseRef(ref s1, ref s2);
Response.Write(s1 + "<br/>");
Response.Write(s2 + "<br/>");
//输出结果:
// 使用out的第一个参数
// 使用out的第二个参数
UseOut(out str1, out str2);
Response.Write(str1 + "<br/>");
Response.Write(str2 + "<br/>");
//输出结果:
// 使用out的第一个参数
// 使用out的第二个参数
UseOut(out s1, out s2);
Response.Write(s1 + "<br/>");
Response.Write(s2 + "<br/>");
} public void UseOut(out string str1, out string str2)
{
str1 = "使用out的第一个参数";
str2 = "使用out的第二个参数";
} public void UseRef(ref string s1, ref string s2)
{
s1 += "使用ref";
s2 += "使用ref";
}
根据上面的示例可以看出ref和out的区别:
当方法中的代码运行时,需要用到该参数,并且通过该参数返回所需要的值时,我们就需要使用ref, 同时,ref是需要声明并赋值的。
如果仅仅是为了获取多个返回值,而方法中又不需要使用这些参数时,我们可以使用out,同时,out只需要声明,但可以不用赋值。
例2:在存储过程中的参数使用output关键字时,对应到c#代码中,则是ref和out.
ref和out与output关系如下:
| ParameterDirection取值 | 描述 | 对应C# | 对应SQL |
| Input | 输入 | ||
| InputOutput | 输入输出 | ref | 对应output |
| Output | 输出 | out | |
| ReturnValue | 返回值 |
开始例子:
建立Employee表:

表内数据如下:

建立存储过程如下:
ALTER PROCEDURE dbo.InsertEmployee
(
@EmployeeName nvarchar(20),
@EmployeeAge int=null,
@EmployeeDepartmentID int=null,
@EmployeeScore int=null,
@outValue nvarchar(20) output
) AS
/* SET NOCOUNT ON */
if exists(select * from Employee where EmployeeName=@EmployeeName)
begin
set @outValue='用户名'+@EmployeeName+'重复!'
return
end insert into Employee (EmployeeName,EmployeeAge,EmployeeDeparmentID,EmployeeScore)
values (@EmployeeName,@EmployeeAge,@EmployeeDepartmentID,@EmployeeScore) set @outValue='用户'+@EmployeeName+'建立成功!' return
页面代码如下:
string connectionString = ConfigurationManager.ConnectionStrings["dbstconnectionstring"].ConnectionString; SqlConnection conn = new SqlConnection(connectionString); SqlCommand cmd = conn.CreateCommand(); cmd.CommandType = CommandType.StoredProcedure;
cmd.CommandText = "InsertEmployee"; cmd.Parameters.AddWithValue("@EmployeeName", "宋八");
cmd.Parameters.AddWithValue("@EmployeeAge", );
cmd.Parameters.AddWithValue("@EmployeeDepartmentID", );
cmd.Parameters.AddWithValue("@EmployeeScore", ); //注意param_outValue.Direction
// 设置param_outValue.Direction=Output,参数只需被声明即可
// 对应数据库中output
//SqlParameter param_outValue = new SqlParameter("@outValue", SqlDbType.NVarChar, 20);
//param_outValue.Direction = ParameterDirection.Output;
//cmd.Parameters.Add(param_outValue); //注意param_outValue.Direction
// 设置为param_outValue.Direction=InputOutput,参数需要被初始化
// 对应数据库中output
SqlParameter param_outValue = new SqlParameter("@outValue", SqlDbType.NVarChar,);
param_outValue.Direction = ParameterDirection.InputOutput;
param_outValue.Value = string.Empty;
cmd.Parameters.Add(param_outValue); conn.Open();
cmd.ExecuteNonQuery();
conn.Close(); Response.Write(param_outValue.Value);
第一次运行输出结果:
用户宋八建立成功!
第二次运行输出结果:
用户名宋八重复!
本文转自:https://www.cnblogs.com/oneword/archive/2010/07/29/1787569.html
C#中的ref和out与SQL中的output的更多相关文章
- Oracle中的内置函数在sql中的转换整理
程序里面经常会即支持Oracle数据库,又支持sql数据库.而有些Oracle内置函数用的比较多,但在sql中语法有些不同,我做了些整理,希望可以帮助大家.... 1.oracle中的内置函数:ora ...
- 问题:PLS-00204: 函数或伪列 'EXISTS' 只能在 SQL 语句中使用;结果:PL/SQL中不能用exists函数?
怎么写了一个语句带出这样的结果. 语句: if exists (select * from sysdatabases where name='omni') then 结果: ERROR 位于第 4 行 ...
- ref和out与SQL中的output
什么时候会需要使用ref和out 有时,我们会需要获取某个值在方法中的运行状态,根据定义的方法,我们仅仅能够获得一个返回值,但是,有时我们也许想获取多个值,通过返回值就不能返回这样的信息,我们可以通过 ...
- SQL WHILE 循环中的游标 用例,SQL中实现循环操作
--声明两个应用变量 declare @USERID_ int declare @ORGANISEUNITID_ int --声明一个变量计数用,开发中可以忽略 declare @i int=0 -- ...
- Qt调用Server SQL中的存储过程
Server SQL中的存储过程如下: CREATE procedure PINSERTPC @pcnum int, @pcname varchar(50), @pctype int, @ipaddr ...
- (转)SQL中的ISNULL函数介绍
SQL中有多种多样的函数,下面将为您介绍SQL中的ISNULL函数,包括其语法.注释.返回类型等,供您参考,希望对您学习SQL能够有所帮助. ISNULL 使用指定的替换值替换 NULL. 语法ISN ...
- SQL 中的一些小巧但常用的关键字
前面的几篇文章中,我们大体上介绍了 SQL 中基本的创建.查询语句,甚至也学习了相对复杂的连接查询和子查询,这些基本功相信你也一定掌握的不错,那么本篇则着重介绍几个技巧方面的关键字,能够让你更快更有效 ...
- SQL中那么多函数,Java8为什么还要提供重复的Stream方法,多此一举?
有个同学提出一个这样的疑问; 在业务系统中,数据一般都从sql中查询,类似使用where,order by,limit,聚合函数等,为什么还要用java8的Stream方法? 对这个问题,大家有什么见 ...
- 浅谈c#的三个高级参数ref out 和Params C#中is与as的区别分析 “登陆”与“登录”有何区别 经典SQL语句大全(绝对的经典)
浅谈c#的三个高级参数ref out 和Params c#的三个高级参数ref out 和Params 前言:在我们学习c#基础的时候,我们会学习到c#的三个高级的参数,分别是out .ref 和 ...
随机推荐
- Elasticsearch(一)基础入门
介绍 Elasticsearch 是一个实时的分布式搜索分析引擎, 它能让你以前所未有的速度和规模,去探索你的数据. 它被用作全文检索.结构化搜索.分析以及这三个功能的组合: Elasticsearc ...
- js的原型与模板类型
原型处于复用(原型)链上: 模版类型属于构造概念: 对象复用原型的数据和函数: 对象由模版类型+原型构造而成: 模版类型属于构造对象的临时变量,包含了对象空间的所有信息: 原型包含了对象所引用的原型空 ...
- POJ3616-Milking Time-(dp)
题意:牛有m个时间段可以挤奶,每个时间段的开始时间,结束时间,挤奶量不尽相同,寄完一次需要休息r时间,求在n时间内如何安排牛挤奶产量最大. 解题: 1.休息r时间,当做结束时间需要+r 2.以结束时间 ...
- yolov3
YOLOv3没有太多的创新,主要是借鉴一些好的方案融合到YOLO里面.不过效果还是不错的,在保持速度优势的前提下,提升了预测精度,尤其是加强了对小物体的识别能力(yolov1在这方面是有缺陷的). 本 ...
- Django 基础篇(一)
创建虚拟环境 创建:mkvirtualenv [虚拟环境名称] 删除:rmvirtualenv [虚拟环境名称] 进入:workon [虚拟环境名称] 退出:deactivate 所有的虚拟环境,都位 ...
- C++ Boost
Boost库是一个可移植.提供源代码的C++库,作为标准库的后备,是C++标准化进程的开发引擎之一. Boost库由C++标准委员会库工作组成员发起,其中有些内容有望成为下一代C++标准库内容.在C+ ...
- 如何实现大麦场在线选座 svg js
本实例来源于此网站,内有Demo,可查看 <!DOCTYPE html> <html lang="en"> <head> <meta ch ...
- Powershell基础学习
从吐司偷来的图片,拿来当做引导吧: 0x01 简介 Windows PowerShell 是一种命令行外壳程序和脚本环境,使命令行用户和脚本编写者可以利用 .NET Framework的强大功能.当然 ...
- yum -y install pip No package pip available. Error: Nothing to do
centos下安装pip时失败: [root@wfm ~]# yum -y install pipLoaded plugins: fastestmirror, refresh-packagekit, ...
- C# 简单通信(实现文件传输)
https://blog.csdn.net/Sayesan/article/details/82185772 之前写过一个简单通信传输,不过只有聊天的功能,现在实现了文件传输的功能,借鉴于网上一篇博客 ...