ref和out与SQL中的output
什么时候会需要使用ref和out
- 有时,我们会需要获取某个值在方法中的运行状态,根据定义的方法,我们仅仅能够获得一个返回值,但是,有时我们也许想获取多个值,通过返回值就不能返回这样的信息,我们可以通过在参数前使用ref或out,以得到多个返回值.
- 在执行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的更多相关文章
- C#中的ref和out与SQL中的output
什么时候会需要使用ref和out 有时,我们会需要获取某个值在方法中的运行状态,根据定义的方法,我们仅仅能够获得一个返回值,但是,有时我们也许想获取多个值,通过返回值就不能返回这样的信息,我们可以通过 ...
- C#调用SQL中的存储过程中有output参数,存储过程执行过程中返回信息
C#调用SQL中的存储过程中有output参数,类型是字符型的时候一定要指定参数的长度.不然获取到的结果总是只有第一字符.本人就是由于这个原因,折腾了很久.在此记录一下,供大家以后参考! 例如: ...
- sql存储过程中使用 output
1.sql存储过程中使用 output CREATE PROCEDURE [dbo].[P_Max] @a int, -- 输入 @b int, -- 输入 @Returnc int output - ...
- sql存储过程中使用 output、nvarchar(max)
1.sql存储过程中使用 output CREATE PROCEDURE [dbo].[P_Max] @a int, -- 输入 @b int, -- 输入 @Returnc int output - ...
- 浅谈c#的三个高级参数ref out 和Params C#中is与as的区别分析 “登陆”与“登录”有何区别 经典SQL语句大全(绝对的经典)
浅谈c#的三个高级参数ref out 和Params c#的三个高级参数ref out 和Params 前言:在我们学习c#基础的时候,我们会学习到c#的三个高级的参数,分别是out .ref 和 ...
- Qt调用Server SQL中的存储过程
Server SQL中的存储过程如下: CREATE procedure PINSERTPC @pcnum int, @pcname varchar(50), @pctype int, @ipaddr ...
- sql server 带有OUTPUT的INSERT,DELETE,UPDATE
原文:sql server 带有OUTPUT的INSERT,DELETE,UPDATE OUTPUT是SQL SERVER2005的新特性.可以从数据修改语句中返回输出.可以看作是"返回结果 ...
- My SQL中show命令--MySQL中帮助查看
My SQL中show命令--MySQL中帮助查看 学习了:http://hahaxiao.techweb.com.cn/archives/477.html 在mysql命令界面内,输入help或者? ...
- SQL中 decode()函数简介
SQL中 decode()函数简介 今天看别人的SQL时看这里面还有decode()函数,以前从来没接触到,上网查了一下,还挺好用的一个函数,写下来希望对朋友们有帮助哈! decode()函数简介: ...
随机推荐
- 一个简单的javascript获取URL参数的代码
function request(paras){ var url = location.href; var paraString = url.substring(url.indexOf("? ...
- [转] c#多线程(UI线程,控件显示更新) Invoke和BeginInvoke 区别
如果只是直接使用子线程访问UI控件,直接看内容三,如果想深入了解从内容一看起. 一.Control.Invoke和BeginInvoke方法的区别 先上总结: Control.Invoke 方法 (D ...
- IOS面试攻略
IOS面试攻略(1.0) 2013-10-13 20:58:09| 分类: IOS面试 | 标签:ios知识点总汇 ios面试 |举报|字号 订阅 来自:伊甸网 @ 看到这个关键字,我 ...
- 针对苹果最新审核要求为应用兼容IPv6-备用
在WWDC2015上苹果宣布iOS9将支持纯IPv6的网络服务.2016年初开始所有提交到App Store的应用必须支持IPv6.为确保现有的应用是兼容的,我们需要注意下面几点. 不建议使用底层的网 ...
- C语言整数按照二进制逆序,输出逆序后的整数值
问题来源,今天早上和一舍友吃早餐的时候谈到的一个问题,将一个整数按照二进制逆序,然后输出逆序后的数值. 我们知道数值在内存中都是以二进制的形式存放的,假如我们是32位机,每8位为一个字节,int型在3 ...
- C++虚函数表解析(转)
C++中的虚函数的作用主要是实现了多态的机制.关于多态,简而言之就是用父类型别的指针指向其子类的实例,然后通过父类的指针调用实际子类的成员函数.这种技术可以让父类的指针有“多种形态”,这是一种泛型技术 ...
- RMAN-06023: no backup or copy of datafile 6 found to restore
一:问题描述 我用指定备份集恢复时,报错: RMAN> run { 2> shutdown immediate; 3> startup mount; 4> allocate c ...
- PCB走线和过孔的过流能力
PCB走线的载流能力与以下因素有关:线宽.线厚(铜箔厚度).容许温升.PCB走线越宽,载流能力越大. 近似计算公式: I=KT0.44A0.75 (K为修正系数,一般覆铜线在内层时取0.024,在外层 ...
- java基本类型作为成员变量时的初始值
package primitivetypedefaultvalue; public class ListDefaultValue { public static void main(String[] ...
- rsyslog 只读取变化的日志
<pre name="code" class="html">input(type="imfile" File="/us ...