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传实际的值

     

  • 相关阅读:
    F4搜索帮助 带回多个值
    ALV Tree demo(WBS元素分层显示)[引用别人的]
    WDA导出文件XLS,WORD
    采购信息记录修改[BDC]
    增强:MB1A物料价格检查
    机器学习中常见优化方法汇总
    统计模型机器学习模型领域相关知识,指标概念及问题点积累
    机器学习数学知识中令人费解的notation符号注解
    线性代数的视角理解LSR(least square regression)的参数评估算法本质
    statsmodels中的summary解读(以linear regression模型为例)
  • 原文地址:https://www.cnblogs.com/lip-blog/p/7388251.html
Copyright © 2011-2022 走看看