关于System.Data.ParameterDirection四个枚举类型所起的作用(转)
相信大家都知道.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
测试用的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四个枚举类型所起的作用(转)的更多相关文章
- 使用EF访问数据库,出现“System.Data.Entity.Internal.AppConfig”的类型初始值设定项引发异常。
今天在使用的EF时候,发生了"System.Data.Entity.Internal.AppConfig"的类型初始值设定项引发异常.这样的一个错误 查了原因,原来是appconf ...
- “System.Data.Entity.Internal.AppConfig"的类型初始值设定项引发异常。{转}
<connectionStrings> <add name="ConnectionStringName" providerName="System.Da ...
- System.Data.Entity.Internal.AppConfig"的类型初始值设定项引发异常
在学习EF code First的小案例的时候,遇见了这个异常 <configSections> <!-- For more information on Entity Framew ...
- Entityframework:“System.Data.Entity.Internal.AppConfig”的类型初始值设定项引发异常。
<configSections> <!-- For more information on Entity Framework configuration, visit http:// ...
- Language Guide (proto3) | proto3 语言指南(四)枚举类型
枚举类型 定义消息类型时,可能希望其中一个字段只包含预定义值列表中的一个.例如,假设您想为每个SearchRequest添加一个corpus(语料库)字段,其中语料库的值可以是UNIVERSAL.WE ...
- EF中System.Data.Entity.Internal.AppConfig的类型初始值设定项引发异常
使用Entity的时候遇到的一个错 问题出在项目的App.config中 解决: 1.configSections要写在最顶端 2. 当中的incariantName会变成incariantNodeN ...
- System.Data.Entity.Internal.AppConfig 类型初始值设定项引发异常
在一开始时将connectionStrings 写在了configSections之上如下图一示,结果抛出:“System.Data.Entity.Internal.AppConfig”的类型初始值设 ...
- Method 'ExecuteAsync' in type 'System.Data.Entity.SqlServer.DefaultSqlExecutionStrategy' does not have an implementation
一.错误信息 Entity Framework 6.0数据迁移:Add-Migration XXXX 命令发生错误 System.Reflection.TargetInvocationExceptio ...
- C#枚举类型的常用操作总结
枚举类型是定义了一组"符号名称/值"配对.枚举类型是强类型的.每个枚举类型都是从system.Enum派生,又从system.ValueType派生,而system.ValueTy ...
随机推荐
- (9)centos下防火墙firewalld设置
学习apache安装的时候需要打开80端口,由于centos 7版本以后默认使用firewalld后,网上关于iptables的设置方法已经不管用了,想着反正iptable也不会用,索性直接搬官方文档 ...
- HRBUST 1211 火车上的人数【数论解方程/模拟之枚举+递推】
火车从始发站(称为第1站)开出,在始发站上车的人数为a,然后到达第2站,在第2站有人上.下车,但上.下车的人数相同,因此在第2站开出时(即在到达第3站之前)车上的人数保持为a人.从第3站起(包括第3站 ...
- JMeter进行http接口测试
Jmter工具设计之初是用于做性能测试的,它在实现对各种接口的调用方面已经做的比较成熟,因此,本次直接使用Jmeter工具来完成对Http接口的测试. 一.开发接口测试案例的整体方案: 第一步:我们要 ...
- linux 项目管理、服务器管理、服务器维护
代码打包:tar -zcvf ImOra.3.2.6.tgz --exclude=Public/.htaccess --exclude=Apps/Demo Apps/ Config/ Shell/ L ...
- Linux基础学习1
安装问题 随意下载的:CentOS-5.5-i386-LiveCD-Release2.iso Live CD 是可以直接运行在内存当中的,而不是安装镜像. 如之前玩过的BT5一样,把BT5-LiveC ...
- QQ分享到电脑SDK bug
问题:当图文(图片+文字+url)混合分享到我的电脑时,就会出bug,只显示图片. 经过测试: params.putString(QQShare.SHARE_TO_QQ_IMAGE_URL," ...
- 【spring boot】application.properties官方完整文档【参考使用】
官方地址: https://docs.spring.io/spring-boot/docs/current-SNAPSHOT/reference/htmlsingle/ 进入搜索: Appendice ...
- Java中的http相关的库:httpclient/httpcore/okhttp/http-request
httpclient/httpcore是apache下面的项目:中文文档下载参考 5 官网:http://hc.apache.org/ 在线文档:http://hc.apache.org/httpco ...
- su、sudo、sudo su、sudo -i的用法和区别
sudo : 暂时切换到超级用户模式以执行超级用户权限,提示输入密码时该密码为当前用户的密码,而不是超级账户的密码.不过有时间限制,Ubuntu默认为一次时长15分钟.su : 切换到某某用户模式,提 ...
- linux中文件描述符
:: # cat ping.txt PING baidu.com (() bytes of data. bytes from ttl= time=32.1 ms bytes from ttl= tim ...