You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

基于VS2013/.NET4.5.1/Oracle12,ASP.NET调用PLSQL存储过程咨询

嘿,针对你在VS2013 + .NET4.5.1环境下调用Oracle12存储过程获取参数值的需求,我给你整理了两种实际项目里常用的实现方案,直接就能上手:

方案一:使用官方ODP.NET Managed Driver(推荐)

这是Oracle官方推出的纯托管驱动,不需要安装Oracle客户端,适配Oracle12非常稳定,步骤如下:

  1. 添加引用:在VS2013的NuGet包管理器里搜索Oracle.ManagedDataAccess,安装对应.NET4.5.1的版本
  2. 编写调用代码:
using Oracle.ManagedDataAccess.Client;
using System;

public class OracleProcCaller
{
    public void FetchProcParameters()
    {
        // 替换成你的Oracle连接字符串
        string connString = "User Id=你的用户名;Password=你的密码;Data Source=你的Oracle实例名或EZ Connect地址(比如localhost:1521/ORCL);";
        
        using (OracleConnection conn = new OracleConnection(connString))
        {
            try
            {
                conn.Open();
                // 创建命令对象,指定要调用的存储过程
                using (OracleCommand cmd = new OracleCommand("你的存储过程名", conn))
                {
                    cmd.CommandType = System.Data.CommandType.StoredProcedure;

                    // 1. 添加输入参数(如果存储过程需要输入参数的话)
                    cmd.Parameters.Add("p_input_param", OracleDbType.Varchar2).Value = "测试输入值";
                    // 2. 添加输出参数(你要获取的目标参数值)
                    OracleParameter outputParam = new OracleParameter("p_output_param", OracleDbType.Number);
                    outputParam.Direction = System.Data.ParameterDirection.Output;
                    cmd.Parameters.Add(outputParam);

                    // 执行存储过程
                    cmd.ExecuteNonQuery();

                    // 获取输出参数的值,按需转换类型
                    int resultValue = Convert.ToInt32(outputParam.Value);
                    Console.WriteLine($"获取到的参数值:{resultValue}");

                    // 这里就可以用拿到的值去生成数据表记录了
                }
            }
            catch (Exception ex)
            {
                Console.WriteLine($"调用出错:{ex.Message}");
            }
        }
    }
}
方案二:使用System.Data.OracleClient(兼容旧项目)

如果你的项目已经引用了System.Data.OracleClient,也可以用这个方式,不过官方已经不再维护,仅作兼容参考:

using System.Data.OracleClient;
using System;

public class OldOracleProcCaller
{
    public void GetProcParams()
    {
        string connString = "Data Source=你的Oracle实例;User Id=用户名;Password=密码;";
        
        using (OracleConnection conn = new OracleConnection(connString))
        {
            conn.Open();
            using (OracleCommand cmd = new OracleCommand("你的存储过程名", conn))
            {
                cmd.CommandType = System.Data.CommandType.StoredProcedure;

                // 输入参数
                cmd.Parameters.Add("p_input", OracleType.VarChar).Value = "测试值";
                // 输出参数
                OracleParameter outputParam = new OracleParameter("p_output", OracleType.Int32);
                outputParam.Direction = System.Data.ParameterDirection.Output;
                cmd.Parameters.Add(outputParam);

                cmd.ExecuteNonQuery();

                // 获取参数值
                int outputValue = (int)outputParam.Value;
                Console.WriteLine($"输出参数值:{outputValue}");
            }
        }
    }
}
几个关键注意点
  • 存储过程的参数名称要和代码里的完全一致,Oracle如果用双引号定义了大小写敏感的参数名,代码里也要对应写对
  • 如果是输入输出参数,要把Direction设为ParameterDirection.InputOutput,并且先给输入值赋值
  • 数据类型要对应好,比如Oracle的VARCHAR2对应OracleDbType.Varchar2,NUMBER对应OracleDbType.Number
  • 用ODP.NET的话,记得在配置文件里可以设置Oracle的相关参数,比如超时时间

内容的提问来源于stack exchange,提问作者Parkavi

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.21 07:07:48