相信大家都知道.net中有四个关于参数传入传出的类型 分别是:

System.Data.ParameterDirection.Input

System.Data.ParameterDirection.InputOutput

System.Data.ParameterDirection.Output

System.Data.ParameterDirection.ReturnValue

感官上理解就是只能传入 即可以传入又可以传出 只能传出 和 返回值 实际应用中和感官的理解一致吗?我也不大清楚 反正以前做的系统都没有遇见问题 所以也没有把这几个参数搞的很明白 不过心中始终有疑问 所以今天就抽了点时间做了一个例子把原理搞清楚

首先我把.Net中的参数定义为形式参数 而把存储过程的参数定义为实际参数

比如:cmd.Parameters.Add("@Input", System.Data.SqlDbType.Int);  @Input为形式参数

而存储过程的@Input int,  @Input为实际参数

得到的结论如下:

数据库存储过程的实际参数如果没有默认值则形式参数必须传值给实际参数

但是如果形式参数的类型为ParameterDirection.Output 则传给实际参数的永远是空值

如果形式参数的类型为ParameterDirection.ReturnValue 则形式参数不会传值给实际参数 实际参数必须有默认值  否则代码会报错

如果形式参数类型为ParameterDirection.InputOutput 或者 ParameterDirection.Output 则实际参数必须有output 关键字

另外需要注意的是在.net中 System.DBNull.Value表示数据库参数为空值 而不是null

用于测试的存储过程如下:

/*

function:测试C#中 ParameterDirection 枚举类的作用

coder:benniuniu

time:2007-11-25

*/

CREATE PROCEDURE proc_test_SQLParametersValue

@Input int,

@InputOutput int output,

@Output int output,

@ReturnValue int=1

AS

select @Input as Input,@InputOutput as InputOutput,@Output as [Output],@ReturnValue as ReturnValue

return 2

Go

测试用的C# 代码类如下:

using System;

using System.Collections.Generic;

using System.Text;

using System.Data.SqlClient;

using System.Configuration;

using System.Data;

namespace CoderHelper.Test

{

class SQLParametersValue

{

public SQLParametersValue()

{

}

public int? Input=1;

public int? InputOutput=2;

public int? Output=3;

public int? ReturnValue=4;

public int? Input2;

public int? InputOutput2;

public int? Output2;

public int? ReturnValue2;

public void GetData(DataTable dt)

{

SqlConnection conn = newSqlConnection(ConfigurationSettings.AppSettings["LocalSqlConnectionString"]);

SqlCommand cmd = new SqlCommand();

cmd.Connection = conn;

cmd.CommandType = System.Data.CommandType.StoredProcedure;

cmd.CommandText = "proc_test_SQLParametersValue";

cmd.Parameters.Add("@Input", System.Data.SqlDbType.Int);

cmd.Parameters["@Input"].Direction = System.Data.ParameterDirection.Input;

if (Input == null)

{

cmd.Parameters["@Input"].Value = System.DBNull.Value;

}

else

{

cmd.Parameters["@Input"].Value = Input;

}

cmd.Parameters.Add("@InputOutput", System.Data.SqlDbType.Int);

cmd.Parameters["@InputOutput"].Direction = System.Data.ParameterDirection.InputOutput;

if (InputOutput == null)

{

cmd.Parameters["@InputOutput"].Value = System.DBNull.Value;

}

else

{

cmd.Parameters["@InputOutput"].Value = InputOutput;

}

cmd.Parameters.Add("@Output", System.Data.SqlDbType.Int);

cmd.Parameters["@Output"].Direction = System.Data.ParameterDirection.Output;

if (Output == null)

{

cmd.Parameters["@Output"].Value = System.DBNull.Value;

}

else

{

cmd.Parameters["@Output"].Value = Output;

}

cmd.Parameters.Add("@ReturnValue", System.Data.SqlDbType.Int);

cmd.Parameters["@ReturnValue"].Direction = System.Data.ParameterDirection.ReturnValue;

if (ReturnValue == null)

{

cmd.Parameters["@ReturnValue"].Value = System.DBNull.Value;

}

else

{

cmd.Parameters["@ReturnValue"].Value = ReturnValue;

}

SqlDataAdapter sa = new SqlDataAdapter(cmd);

try

{

if (conn.State == System.Data.ConnectionState.Closed)

{

conn.Open();

}

sa.Fill(dt);

if (cmd.Parameters["@Input"].Value != System.DBNull.Value)

Input2 = Convert.ToInt32(cmd.Parameters["@Input"].Value);

if (cmd.Parameters["@InputOutput"].Value != System.DBNull.Value)

InputOutput2 = Convert.ToInt32(cmd.Parameters["@InputOutput"].Value);

if (cmd.Parameters["@Output"].Value != System.DBNull.Value)

Output2 = Convert.ToInt32(cmd.Parameters["@Output"].Value);

if (cmd.Parameters["@ReturnValue"].Value != System.DBNull.Value)

ReturnValue2 = Convert.ToInt32(cmd.Parameters["@ReturnValue"].Value);

}

catch (Exception ex)

{

}

finally

{

conn.Close();

}

}

}

}

如上代码

public int? Output=3; 但是实际传给存储过程的值还是空值

public int? ReturnValue=4; 但是实际没有传值给存储过程

ReturnValue2 = Convert.ToInt32(cmd.Parameters["@ReturnValue"].Value); 取的是存储过程return的返回值此例存储过程代码是return 2 所以取得值是2。

注意:

1:return只能是int类型,有很大的局限性,所以Procedure返回值一般使用output。

2:Procedure中output和out是一样的,大多数网上写的是错的

3:ParameterDirection(Input,Output,InputOutput,ReturnValue)中的Output,InputOutput只是代表C#怎么传值给Procedure,Output传空,InputOutput传实际的值

关于System.Data.ParameterDirection四个枚举类型所起的作用(转)的更多相关文章

  1. 使用EF访问数据库,出现“System.Data.Entity.Internal.AppConfig”的类型初始值设定项引发异常。

    今天在使用的EF时候,发生了"System.Data.Entity.Internal.AppConfig"的类型初始值设定项引发异常.这样的一个错误 查了原因,原来是appconf ...

  2. “System.Data.Entity.Internal.AppConfig"的类型初始值设定项引发异常。{转}

    <connectionStrings> <add name="ConnectionStringName" providerName="System.Da ...

  3. System.Data.Entity.Internal.AppConfig"的类型初始值设定项引发异常

    在学习EF code First的小案例的时候,遇见了这个异常 <configSections> <!-- For more information on Entity Framew ...

  4. Entityframework:“System.Data.Entity.Internal.AppConfig”的类型初始值设定项引发异常。

    <configSections> <!-- For more information on Entity Framework configuration, visit http:// ...

  5. Language Guide (proto3) | proto3 语言指南(四)枚举类型

    枚举类型 定义消息类型时,可能希望其中一个字段只包含预定义值列表中的一个.例如,假设您想为每个SearchRequest添加一个corpus(语料库)字段,其中语料库的值可以是UNIVERSAL.WE ...

  6. EF中System.Data.Entity.Internal.AppConfig的类型初始值设定项引发异常

    使用Entity的时候遇到的一个错 问题出在项目的App.config中 解决: 1.configSections要写在最顶端 2. 当中的incariantName会变成incariantNodeN ...

  7. System.Data.Entity.Internal.AppConfig 类型初始值设定项引发异常

    在一开始时将connectionStrings 写在了configSections之上如下图一示,结果抛出:“System.Data.Entity.Internal.AppConfig”的类型初始值设 ...

  8. Method 'ExecuteAsync' in type 'System.Data.Entity.SqlServer.DefaultSqlExecutionStrategy' does not have an implementation

    一.错误信息 Entity Framework 6.0数据迁移:Add-Migration XXXX 命令发生错误 System.Reflection.TargetInvocationExceptio ...

  9. C#枚举类型的常用操作总结

    枚举类型是定义了一组"符号名称/值"配对.枚举类型是强类型的.每个枚举类型都是从system.Enum派生,又从system.ValueType派生,而system.ValueTy ...

随机推荐

  1. HDU 1024 Max Sum Plus Plus [动态规划+m子段和的最大值]

    Max Sum Plus Plus Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Others) Tot ...

  2. NULL和唯一约束UNIQUE的对应关系

    NULL和唯一约束UNIQUE的对应关系   在数据库中,NULL表示列值为空.唯一约束UNIQUE规定指定列的值必须是唯一的,值和值之间都不能相同.这个时候,就出现一个问题,NULL和NULL算是相 ...

  3. springBoot 整合 mybatis+Oracle

    现在比较流行的操作数据库操作层框架Mybatis,下面我们就来看看Springboot如何整合mybatis, 之前一直在用xml形式写sql,这次依然用xml的方式感觉这种还是比较灵活方便. 添加m ...

  4. java 两个int类型的数据相除并输出百分号保留两位有效数字

    java代码: public void IntA(int a , int b){ //首先判断分母不能为0 if(b!=0){ folat num = (float) a*100/b; Decimal ...

  5. Scut游戏服务器引擎6.5.8.6发布

    1.增加从Redis中加载数据到Cache可设置筛选条件2.修改在Web项目中的不能支持自定协议问题3.修改Share类型的Model在Redis中为空时会尝试从DB中加载数据4.修改Model命名空 ...

  6. 解决 ultraedit 菜单字体模糊

    新装完ultraedit后,使用时菜单里的字体非常小,模糊不清非常不爽. 1.安装好UltraEdit后,到安装目录里,复制一份Uedit32.exe文件用于修改.2.使用UltraEdit打开复制的 ...

  7. linux网络管理之网络基础

    iso/osi模型 OSI七层框架每层作用 应用层:用户操作的层 表示层:二进制数据与显示数据之间的转换,也是加密的地方 会话层:确定网络传输还是本地存储,是邮件还是ppt等 传输层:确定tcp还是u ...

  8. 【原创】SM4password算法源代码接口具体解释

    [原创]SM4password算法源代码接口具体解释 近期几天想把cryptdb的加密算法换成国产的sm4加密算法.所以花了时间研究了一下sm4的源代码和基本原理,避免忘记,写下这篇博客以作记录. 先 ...

  9. vue class绑定方式

    1.对象语法 <div class="static" v-bind:class="{ active: isActive, 'text-danger': hasErr ...

  10. Spring使用Cache、整合Ehcache(转)

    Spring使用Cache 从3.1开始,Spring引入了对Cache的支持.其使用方法和原理都类似于Spring对事务管理的支持.Spring Cache是作用在方法上的,其核心思想是这样的:当我 ...