关于System.Data.ParameterDirection四个枚举类型所起的作用

因为做应用系统肯定要和数据库打交道 而我最常接触的就是SQL 2000数据库 常规的方式就是写存储过程类然后和数据库的存储过程进行交互 执行命令或者取得数据 

相信大家都知道.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 = new SqlConnection(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

 

下面是一个使用Oracle.ManagedDataAccess批量插入数据的完整例子: ```csharp using Oracle.ManagedDataAccess.Client; using System; using System.Collections.Generic; using System.Data; using System.Linq; namespace OracleBulkInsertExample { class Program { static void Main(string[] args) { string connectionString = "Data Source=(DESCRIPTION=(ADDRESS=(PROTOCOL=TCP)(HOST=localhost)(PORT=1521))(CONNECT_DATA=(SERVICE_NAME=XE)));User Id=hr;Password=hr;"; // 构建数据表和数据集 DataTable employeesTable = new DataTable(); employeesTable.Columns.Add("ID", typeof(int)); employeesTable.Columns.Add("NAME", typeof(string)); employeesTable.Columns.Add("AGE", typeof(int)); employeesTable.Columns.Add("SALARY", typeof(double)); employeesTable.Rows.Add(1, "John Smith", 35, 5000.50); employeesTable.Rows.Add(2, "Mary Johnson", 28, 4000.75); employeesTable.Rows.Add(3, "Peter Lee", 42, 7000.25); employeesTable.Rows.Add(4, "Kim Chen", 31, 5500.00); DataSet employeesDataSet = new DataSet(); employeesDataSet.Tables.Add(employeesTable); // 使用批量插入将数据插入到数据库中 using (OracleConnection connection = new OracleConnection(connectionString)) { connection.Open(); OracleCommand command = new OracleCommand("INSERT INTO EMPLOYEES(ID, NAME, AGE, SALARY) VALUES(:ID, :NAME, :AGE, :SALARY)", connection); command.ArrayBindCount = employeesTable.Rows.Count; command.Parameters.Add(":ID", OracleDbType.Int32, employeesTable.AsEnumerable().Select(r => r.Field<int>("ID")).ToArray(), ParameterDirection.Input); command.Parameters.Add(":NAME", OracleDbType.Varchar2, employeesTable.AsEnumerable().Select(r => r.Field<string>("NAME")).ToArray(), ParameterDirection.Input); command.Parameters.Add(":AGE", OracleDbType.Int32, employeesTable.AsEnumerable().Select(r => r.Field<int>("AGE")).ToArray(), ParameterDirection.Input); command.Parameters.Add(":SALARY", OracleDbType.Double, employeesTable.AsEnumerable().Select(r => r.Field<double>("SALARY")).ToArray(), ParameterDirection.Input); int rowsAffected = command.ExecuteNonQuery(); Console.WriteLine($"{rowsAffected} rows inserted."); } Console.ReadLine(); } } } ``` 在上面的例子中,我们首先创建了一个包含员工信息的数据表和数据集。然后,我们使用Oracle.ManagedDataAccess客户端连接到Oracle数据库,并使用批量插入将数据插入到数据库中。 请注意,我们使用OracleCommand的ArrayBindCount属性指定要插入的行数,然后使用参数化查询和数组绑定技术将数据传递给INSERT语句。 最后,我们输出插入的行数,然后关闭数据库连接。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值