关于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
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传实际的值
转载于:https://www.cnblogs.com/lip-blog/p/7388251.html
关于System.Data.ParameterDirection四个枚举类型所起的作用(转)相关推荐
- 关于System.Data.ParameterDirection四个枚举类型所起的作用
关于System.Data.ParameterDirection四个枚举类型所起的作用 收藏 <script type="text/javascript"> doc ...
- System.Data : ParameterDirection参数类型
1. System.Data The ParameterDirection values are used by the parameter direction properties of OleDb ...
- 【转载】System.Data.ParameterDirection 参数的说明
看了此文,感觉大有收获,真是O(∩_∩)O谢谢楼主呀 http://dev.tot.name/dotnet/html/2008122/20081202161923.htm 相信大家都知道.net中有四 ...
- Entityframework:“System.Data.Entity.Internal.AppConfig”的类型初始值设定项引发异常。
Entityframework:"System.Data.Entity.Internal.AppConfig"的类型初始值设定项引发异常. 参考文章: (1)Entityframe ...
- C#参考 : 枚举类型
一. 关于 类型 再具体学习枚举类型之前,先了解一下C#的类型. (1)值类型 (a)变量可以直接包含它们自己的数据:如 int i = 35: (b)局部变量总是放在栈(stack)中. · ...
- 枚举类型是什么意思,怎么用?
枚举类型是什么意思,怎么用? enum 比如有东,南,西,北四个方向,你会怎么设计类型呢? 用枚举 enum Direction { East,South,West,North }; 枚举主要用于某些 ...
- c语言枚举类型enum用法参数,C语言枚举类型(Enum)
在实际编程中,有些数据的取值往往是有限的,只能是非常少量的整数,并且最好为每个值都取一个名字,以方便在后续代码中使用,比如一个星期只有七天,一年只有十二个月,一个班每周有六门课程等. 以每周七天为例, ...
- C# 枚举类型在switch case语句中的使用
代码 using System; using System.Collections.Generic; using System.Linq; using System.Text; using Syste ...
- C#枚举类型的常用操作总结
枚举类型是定义了一组"符号名称/值"配对.枚举类型是强类型的.每个枚举类型都是从system.Enum派生,又从system.ValueType派生,而system.ValueTy ...
最新文章
- Network Broadcast
- prototype.js 1.4版开发者手册
- bootargs中的环境变量说明和一些常用的uboot命令
- linux apt-get 安装 根目录,技术|apt-get 和 apt-cache 命令实例展示
- java实现时钟方法汇总
- C++学习之路 | PTA乙级—— 1089 狼人杀-简单版(精简)
- cass展点不在原位置_cass展点之步骤及方法
- Matlab--Figure界面工具栏使用简要说明
- 无心剑英译罗兰《境由心造》
- netron神经网络可视化
- hdu 3853 LOOPS 概率dp入门题
- spring mvc 响应处理post请求和get请求 测试
- Unity中的屏幕坐标:ComputeScreenPos/VPOS/WPOS
- 【C语言进阶】字符串函数模拟实现
- python+selenium之悠悠博客学习笔记
- USB OTG的检测原理及使用
- SQL数据库——分组查询GROUP BY
- 云计算需要python吗_国内python云计算是啥
- 【功能测试】软件系统测试报告
- 手动挡五个档位示意图_手动挡各个档位怎么使用 正确的操作方式大家要知道...
热门文章
- UML建模中的关系画法
- Javascript中理解发布--订阅模式
- android q微信打不开,微信打不开怎么回事?微信打不开怎么办?
- 禹佳生活服务、长城物业上市申请材料失效,后者曾系失信被执行人
- 【Android 2d 游戏开发(2)】——2048
- bim综合免费工具:Revit中公制门窗改为幕墙嵌门窗
- 扫描身份证怎么扫描?分享一个好用的操作
- php自定义弹窗,微信小程序 弹窗自定义的代码
- 【计算机毕业设计】共享充电宝管理系统
- java三国策略手游_【图片】推荐一款三国策略手游!【三国游戏吧】_百度贴吧...