在ASP.NET中调用PLSQL过程

时间:2018-03-30 05:16:18

标签: c# oracle visual-studio-2013 plsql asp.net-4.5

我有一个项目要立即使用VS 2013,.NET 4.5.1和Oracle 12启动。我需要做的是使用提供给我的API,我需要调用PLSQL中的过程和获取参数的值。从这些值我需要为表生成记录。有人可以给我任何关于如何从程序中调用这些参数的想法。我不确定我是否以可理解的方式发布问题。

1 个答案:

答案 0 :(得分:0)

我首先建议你安装Oracle.ManagedDataAccess NuGet包(https://www.nuget.org/packages/Oracle.ManagedDataAccess/)。它添加了驱动程序和库以启用与Oracle数据库的连接。之后,您必须在web.config或app.config中配置连接。

在项目中安装完成后,连接到Oracle并执行程序与使用其他数据库的方式非常相似。例如,假设您有以下PLSQL包:

CREATE OR REPLACE 
PACKAGE MYPACKAGE AS 

  PROCEDURE MYPROCEDURE(
    p_param1    IN VARCHAR2,
    p_param2    IN NUMBER,
    p_output1   OUT VARCHAR2,
    p_output2   OUT NUMBER);

  FUNCTION MYFUNCTION(
    p_param1    IN VARCHAR2,
    p_output1   OUT NUMBER)
  RETURN VARCHAR2;

END MYPACKAGE;

执行该过程的代码将是这样的:

using Oracle.ManagedDataAccess.Client;
using Oracle.ManagedDataAccess.Types;
using System;
using System.Configuration;

//I'm not including the namespace, class or function declaration, but the following should be inside your fuction
// myconnection is the your oracle connection string as defined in your config (web.config or app.config)
using (OracleConnection cnx = new OracleConnection(ConfigurationManager.ConnectionStrings["myconnection"].ConnectionString))
{
   cnx.Open();
   // You prepare the statement here
   OracleCommand commProc = new OracleCommand();
   commProc.Connection = cnx;
   commProc.CommandText = @"MYPROCEDURE.MYPROCEDURE";
   commProc.CommandType = System.Data.CommandType.StoredProcedure;

   // Here you add all the parameters (in and out) for the procedure
   commProc.Parameters.Add(new OracleParameter("p_param1", OracleDbType.Varchar2)
   {
       Value = v_param1, //This would be the C# variable or value you're putting in
       Size = 9 //This has to be the expected maximum size for a string value in your PL/SQL code.
    });

    commProc.Parameters.Add(new OracleParameter("p_param2", OracleDbType.Decimal)
   {
        Value = v_param2, //This would be the C# variable or value you're putting in
    });
   commProc.Parameters.Add(new OracleParameter("p_output1", OracleDbType.Varchar2)
   {
       Direction = System.Data.ParameterDirection.Output, //For output params, you don't specify values, but you have to specify direction.
       Size = 500 //This has to be the expected maximum size for the string value in your PL/SQL code.
    });

    commProc.Parameters.Add(new OracleParameter("p_output2", OracleDbType.Decimal)
   {
        Direction = System.Data.ParameterDirection.Output, //For output params, you don't specify values, but you have to specify direction.
    });

   // Here you actually execute the procedure.
   commProc.ExecuteNonQuery();

   // Once the procedure is exectued, you can access the values for the output params using the commProc.Parameters list.
   string v_output1 = commProc.Parameters["p_output1"]?.Value?.ToString();
   decimal v_output2 = (decimal) commProc.Parameters["p_output2"]?.Value;

   // You prepare the statement here
   OracleCommand commFunc = new OracleCommand();
   commFunc.Connection = cnx;
   commFunc.CommandText = @"MYPROCEDURE.MYFUNCTION";
   commFunc.CommandType = System.Data.CommandType.StoredProcedure;

   // Here you add all the parameters (in and out) for the procedure
   // When calling functions, the first parameter must be the return value expected from the function. Here you can name it as you wish. I usually name them return_value
   commFunc.Parameters.Add(new OracleParameter("return_value", OracleDbType.Varchar2)
   {
       Direction = System.Data.ParameterDirection.ReturnValue, //For return params, you don't specify values, but you have to specify direction.
       Size = 500 //This has to be the expected maximum size for a string value in your PL/SQL code.
    });

   commFunc.Parameters.Add(new OracleParameter("p_param1", OracleDbType.Varchar2)
   {
       Value = v_param1, //This would be the C# variable or value you're putting in
       Size = 9 //This has to be the expected maximum size for a string value in your PL/SQL code.
    });

    commFunc.Parameters.Add(new OracleParameter("p_output1", OracleDbType.Decimal)
   {
        Direction = System.Data.ParameterDirection.Output, //For output params, you don't specify values, but you have to specify direction.
    });

   // Here you actually execute the procedure.
   commFunc.ExecuteNonQuery();

   // Once the procedure is exectued, you can access the values for the output params using the commFunc.Parameters list.
   string v_return = commProc.Parameters["return_value"]?.Value?.ToString();
   decimal v_output1 = (decimal) commFunc.Parameters["p_output1"]?.Value;
}

希望这可以让您了解从哪里开始。您可以在Oracle官方网站上阅读有关使用ODP.NET连接.NET和Oracle的更多信息:http://www.oracle.com/technetwork/topics/dotnet/index-085163.html