.Net中调用Oracle存储过程

项目.Net MVC5的,在这里面调用了Oracle的存储过程,在这做个记录:

1、Oracle中的存储过程

create or replace procedure PROC_HISTASKBYUSERID(curruserid in varchar2,queryuserid in varchar2,typeNum in integer, startNum in integer,endNum in integer,datestart in date,dateend in date,return_cur1 out sys_refcursor)
is
begin
  --可以使用if..then或者elsif..then或者else
  if (typeNum = '109') then
    open return_cur1 for select * from(
    --你的查询数据代码
 );
  else
    open return_cur1 for select * from(
    --你的查询数据代码    
 );
  end if;
  
 end;

上面的代码是返回游标的一种存储过程,in 参数代表传入的数据,比如 curruserid in varchar2 就是程序传入的一个字符串类型的数据:curruserid;在上面的代码中,返回数据使用“open return_cur1 for...”,其中的return_cur1也是定义的游标类型,比如上面定义为:

return_cur1 out sys_refcursor

在存储过程里面完全可以使用if elsif else判断语句。

2、.Net调用存储过程

下面是一些存储过程操作的方法:

 #region 存储过程操作

        /// <summary>
        /// 执行存储过程 返回SqlDataReader ( 注意:调用该方法后,一定要对SqlDataReader进行Close )
        /// </summary>
        /// <param name="storedProcName">存储过程名</param>
        /// <param name="parameters">存储过程参数</param>
        /// <returns>OracleDataReader</returns>
        public static OracleDataReader RunProcedure( string storedProcName, IDataParameter[] parameters)
        {
            OracleConnection connection = new OracleConnection(connectionString);
            OracleDataReader returnReader;
            connection.Open();
            OracleCommand command = BuildQueryCommand(connection, storedProcName, parameters);
            command.CommandType = CommandType.StoredProcedure;
            returnReader = command.ExecuteReader(CommandBehavior.CloseConnection);
            return returnReader;
        }


        /// <summary>
        /// 执行存储过程
        /// </summary>
        /// <param name="storedProcName">存储过程名</param>
        /// <param name="parameters">存储过程参数</param>
        /// <param name="tableName">DataSet结果中的表名</param>
        /// <returns>DataSet</returns>
        public static DataSet RunProcedure(string storedProcName, IDataParameter[] parameters, string tableName)
        {
            using (OracleConnection connection = new OracleConnection(connectionString))
            {
                DataSet dataSet = new DataSet();
                connection.Open();
                OracleDataAdapter sqlDA = new OracleDataAdapter();
                sqlDA.SelectCommand = BuildQueryCommand(connection, storedProcName, parameters);
                sqlDA.Fill(dataSet, tableName);
                connection.Close();
                return dataSet;
            }
        }


        /// <summary>
        /// 构建 OracleCommand 对象(用来返回一个结果集,而不是一个整数值)
        /// </summary>
        /// <param name="connection">数据库连接</param>
        /// <param name="storedProcName">存储过程名</param>
        /// <param name="parameters">存储过程参数</param>
        /// <returns>OracleCommand</returns>
        private static OracleCommand BuildQueryCommand(OracleConnection connection, string storedProcName, IDataParameter[] parameters)
        {
            OracleCommand command = new OracleCommand(storedProcName, connection);
            command.CommandType = CommandType.StoredProcedure;
            foreach (OracleParameter parameter in parameters)
            {
                command.Parameters.Add(parameter);
            }
            return command;
        }

        /// <summary>
        /// 执行存储过程,返回影响的行数		
        /// </summary>
        /// <param name="storedProcName">存储过程名</param>
        /// <param name="parameters">存储过程参数</param>
        /// <param name="rowsAffected">影响的行数</param>
        /// <returns></returns>
        public static int RunProcedure( string storedProcName, IDataParameter[] parameters, out int rowsAffected)
        {
            using (OracleConnection connection = new OracleConnection(connectionString))
            {
                int result;
                connection.Open();
                OracleCommand command = BuildIntCommand(connection, storedProcName, parameters);
                rowsAffected = command.ExecuteNonQuery();
                result = (int)command.Parameters["ReturnValue"].Value;
                //Connection.Close();
                return result;
            }
        }

        /// <summary>
        /// 创建 OracleCommand 对象实例(用来返回一个整数值)	
        /// </summary>
        /// <param name="storedProcName">存储过程名</param>
        /// <param name="parameters">存储过程参数</param>
        /// <returns>OracleCommand 对象实例</returns>
        private static OracleCommand BuildIntCommand(OracleConnection connection, string storedProcName, IDataParameter[] parameters)
        {
            OracleCommand command = BuildQueryCommand(connection, storedProcName, parameters);
            command.Parameters.Add(new OracleParameter("ReturnValue",
                OracleDbType.Int32, 4, ParameterDirection.ReturnValue,
                false, 0, 0, string.Empty, DataRowVersion.Default, null));
            return command;
        }
        /// <summary>
        ///  执行存储过程,不返回任何值
        /// </summary>
        /// <param name="storedProcName"></param>
        /// <param name="parameters"></param>
        public static void RunProcedureNoReturn(string storedProcName, IDataParameter[] parameters)
        {
            using (OracleConnection connection = new OracleConnection(connectionString))
            {
                connection.Open();
                OracleCommand command = BuildQueryCommand(connection, storedProcName, parameters);
                command.ExecuteNonQuery();
                connection.Close();
            }
        }
        #endregion

上面的方法只是对存储过程的一些底层操作,具体的代码还得我们自己写,比如下面使用上面的一个方法RunProcedure()来执行本文中提到的这个oracle存储过程。代码如下:

public DataTable PROC_queryDatalist( int startNum,int endNum,string userid, string curruserid,int typeNum,DateTime d1,DateTime d2)
        {
            IDataParameter[] ip = new IDataParameter[8];
            ip[0] = new OracleParameter("@curruserid", curruserid);
            ip[1] = new OracleParameter("@queryuserid", userid);
            ip[2] = new OracleParameter("@typeNum", typeNum);
            ip[3] = new OracleParameter("@startNum", startNum);
            ip[4] = new OracleParameter("@endNum", endNum);
            ip[5] = new OracleParameter("@datestart", d1);
            ip[6] = new OracleParameter("@dateend", d2);
            ip[7] = new OracleParameter("@return_cur1", OracleDbType.RefCursor, ParameterDirection.Output);
            DataSet ds = DBHelperOra.RunProcedure("PROC_HISTASKBYUSERID", ip, "DataTable");
            return ds.Tables[0];
        }

DBHelperOra.RunProcedure("PROC_HISTASKBYUSERID", ip, "DataTable");返回的是一个DataSet,只是在这里把它转成了DataTable而已,在上面的这个代码当中,定义了一个

IDataParameter[] ip = new IDataParameter[8];

这里面的数据是传入存储过程的

ip[0] = new OracleParameter("@curruserid", curruserid);

里卖你的“@curruserid”与你在存储过程中定义的变量是一一对应的,在你的存储过程中定义了几个变量,你这就应该传入几个值,名字一定相同额,对于定义的返回类型像上面的代码中那么定义:

 ip[7] = new OracleParameter("@return_cur1", OracleDbType.RefCursor, ParameterDirection.Output);

有几个就定义几个。

还有在调用的时候,存储过程的名字得和oracle存储过程的名字一致,例如下面的代码:

 DataSet ds = DBHelperOra.RunProcedure("PROC_HISTASKBYUSERID", ip, "DataTable");
“PROC_HISTASKBYUSERID”就是你再数据库中定义的存储过程的名字,ip就是你上面的定义参数数组,至于后面"DataTable"只是返回的DataSet的一个名字而已,这里你随意。。。
  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
在ADO.NET Core,可以使用Oracle.ManagedDataAccess.Core包来连接Oracle数据库,并调用存储过程。下面是一个简单的示例: 1. 首先,需要在项目安装Oracle.ManagedDataAccess.Core包。可以通过NuGet包管理器或命令行进行安装: ``` Install-Package Oracle.ManagedDataAccess.Core ``` 2. 在代码创建一个OracleConnection对象并打开连接: ```csharp using Oracle.ManagedDataAccess.Client; ... var connectionString = "Data Source=your_data_source;User Id=your_username;Password=your_password;"; using (var connection = new OracleConnection(connectionString)) { connection.Open(); //调用存储过程 } ``` 3. 使用OracleCommand对象创建一个存储过程调用: ```csharp using Oracle.ManagedDataAccess.Client; ... var connectionString = "Data Source=your_data_source;User Id=your_username;Password=your_password;"; using (var connection = new OracleConnection(connectionString)) { connection.Open(); using (var command = new OracleCommand("your_stored_procedure_name", connection)) { command.CommandType = CommandType.StoredProcedure; //添加存储过程的参数 command.Parameters.Add("param1", OracleDbType.Varchar2, ParameterDirection.Input).Value = "value1"; command.Parameters.Add("param2", OracleDbType.Varchar2, ParameterDirection.Input).Value = "value2"; command.Parameters.Add("param3", OracleDbType.RefCursor, ParameterDirection.Output); //执行存储过程并读取结果 using (var reader = command.ExecuteReader()) { while (reader.Read()) { //处理结果 } } } } ``` 在这个示例,我们调用了一个名为"your_stored_procedure_name"的存储过程,并传递了三个参数。其,第三个参数是一个游标类型的输出参数,用于返回存储过程的结果集。 需要注意的是,需要根据实际情况调整连接字符串和存储过程的参数。同时,也可以使用其他方式调用存储过程,比如使用Entity Framework Core的FromSqlRaw方法。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值