zoukankan      html  css  js  c++  java
  • 关于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传实际的值

     

  • 相关阅读:
    Treap 树堆 容易实现的平衡树
    (转)Maven实战(二)构建简单Maven项目
    (转)Maven实战(一)安装与配置
    根据请求头跳转判断Android&iOS
    (转)苹果消息推送服务器 php 证书生成
    (转)How to renew your Apple Push Notification Push SSL Certificate
    (转)How to build an Apple Push Notification provider server (tutorial)
    (转)pem, cer, p12 and the pains of iOS Push Notifications encryption
    (转)Apple Push Notification Services in iOS 6 Tutorial: Part 2/2
    (转)Apple Push Notification Services in iOS 6 Tutorial: Part 1/2
  • 原文地址:https://www.cnblogs.com/lip-blog/p/7388251.html
Copyright © 2011-2022 走看看