什么时候会需要使用ref和out

    1. 有时,我们会需要获取某个值在方法中的运行状态,根据定义的方法,我们仅仅能够获得一个返回值,但是,有时我们也许想获取多个值,通过返回值就不能返回这样的信息,我们可以通过在参数前使用ref或out,以得到多个返回值.
    2. 在执行Sql存储过程时,我们可以通过sql语句在存储过程中的运行状态,返回相应的值.sql的return只支持Int格式的返回值,通过使用ref或out我们就可以获取多个返回值,并提示给页面

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); //输出结果:
// 使用out的第一个参数
// 使用out的第二个参数
UseOut(out str1, out str2);
Response.Write(str1 + "<br/>");
Response.Write(str2 + "<br/>"); //输出结果:
// 第一个参数使用ref
// 第二个参数使用ref
UseRef(ref s1, ref 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";
}

例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", 20);
cmd.Parameters.AddWithValue("@EmployeeDepartmentID", 1);
cmd.Parameters.AddWithValue("@EmployeeScore", 95); //注意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,20);
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);

第一次运行输出结果:

用户宋八建立成功! 

第二次运行输出结果:

用户名宋八重复!

ref和out与SQL中的output的更多相关文章

  1. C#中的ref和out与SQL中的output

    什么时候会需要使用ref和out 有时,我们会需要获取某个值在方法中的运行状态,根据定义的方法,我们仅仅能够获得一个返回值,但是,有时我们也许想获取多个值,通过返回值就不能返回这样的信息,我们可以通过 ...

  2. C#调用SQL中的存储过程中有output参数,存储过程执行过程中返回信息

      C#调用SQL中的存储过程中有output参数,类型是字符型的时候一定要指定参数的长度.不然获取到的结果总是只有第一字符.本人就是由于这个原因,折腾了很久.在此记录一下,供大家以后参考! 例如: ...

  3. sql存储过程中使用 output

    1.sql存储过程中使用 output CREATE PROCEDURE [dbo].[P_Max] @a int, -- 输入 @b int, -- 输入 @Returnc int output - ...

  4. sql存储过程中使用 output、nvarchar(max)

    1.sql存储过程中使用 output CREATE PROCEDURE [dbo].[P_Max] @a int, -- 输入 @b int, -- 输入 @Returnc int output - ...

  5. 浅谈c#的三个高级参数ref out 和Params C#中is与as的区别分析 “登陆”与“登录”有何区别 经典SQL语句大全(绝对的经典)

    浅谈c#的三个高级参数ref out 和Params   c#的三个高级参数ref out 和Params 前言:在我们学习c#基础的时候,我们会学习到c#的三个高级的参数,分别是out .ref 和 ...

  6. Qt调用Server SQL中的存储过程

    Server SQL中的存储过程如下: CREATE procedure PINSERTPC @pcnum int, @pcname varchar(50), @pctype int, @ipaddr ...

  7. sql server 带有OUTPUT的INSERT,DELETE,UPDATE

    原文:sql server 带有OUTPUT的INSERT,DELETE,UPDATE OUTPUT是SQL SERVER2005的新特性.可以从数据修改语句中返回输出.可以看作是"返回结果 ...

  8. My SQL中show命令--MySQL中帮助查看

    My SQL中show命令--MySQL中帮助查看 学习了:http://hahaxiao.techweb.com.cn/archives/477.html 在mysql命令界面内,输入help或者? ...

  9. SQL中 decode()函数简介

    SQL中 decode()函数简介 今天看别人的SQL时看这里面还有decode()函数,以前从来没接触到,上网查了一下,还挺好用的一个函数,写下来希望对朋友们有帮助哈! decode()函数简介: ...

随机推荐

  1. CSS定位与浮动

    定位的基本思想很简单,它允许你定义元素框相对于其正常位置应该出现的位置,或者相对于父元素.另一个元素甚至浏览器窗口本身的位置.显然,这个功能非常强大,也很让人吃惊.要知道,用户代理对 CSS2 中定位 ...

  2. ServerInfo.INI解密

    [GlobalInfo]LastServerName=000781ED2D127FBA074D97444DC82F216443034E66BB341A428B14E326A656B9LastServe ...

  3. 关于PHP加速eAccelerator、Xcache、APC和Zend Optimizer

    以前只关注过Zend Optimizer,因为高胖子的书就是这样教的,但是遇到奇葩公司的面试题提问你知道多少个php加速器/缓存,我一下子楞了,因为我所知道的php5.2.x只用过Zend Optim ...

  4. awk的思维导图

  5. STL之优先队列(priority_queue)

    转自网上大牛博客,原文地址:http://www.cnblogs.com/summerRQ/articles/2470130.html 先回顾队列的定义:队列(queue)维护了一组对象,进入队列的对 ...

  6. css、js的相互阻塞

    先决条件:脚本前面存在外部样式 以下试验虽然是在chrome下,但是对于IE8+以及其他浏览器也适用. 1.内联脚本(http://jsbin.com/mudab/1) <!DOCTYPE ht ...

  7. Matlab 矩阵运算

    1.Syms 和sym的区别: syms是定义多个符号是符号变量的意思 sym只能定义一个符号变量,但可以具体到这个符号变量的内容 例:syms f z; %定义下x和y f=sym('a+b+c') ...

  8. quartz2.2.1-测试02-通过servlet动态修改定时任务运行时间

    /* * To change this license header, choose License Headers in Project Properties. * To change this t ...

  9. Android listview局部刷新和模拟应用下载(zhu)

    在android开发中,listview是比较常用的一个组件,在listview的数据需要更新的时候,一般会用notifyDataSetChanged()这个函数,但是它会更新listview中所有可 ...

  10. COJ 0036 数数happy有多少个?

    数数happy有多少个? 难度级别:B: 运行时间限制:1000ms: 运行空间限制:51200KB: 代码长度限制:2000000B 试题描述 图图是个爱动脑子.观察能力很强的好学生.近期他正学英语 ...