2011-06-01 50 views
3

我的程序是在这里声明:在.NET中,如何执行此Oracle PL/SQL过程?

create or replace 
PACKAGE MYPKG 
IS 
PROCEDURE MYPROCEDURE(
     sNom   IN VARCHAR2, 
     sValeur   OUT VARCHAR2, 
     sCommentaire OUT VARCHAR2, 
     sRetour   OUT VARCHAR2, 
     sMsgRetour  OUT VARCHAR2); 
END; 

执行是好的与SQL开发人员。

我尝试在C#中执行此过程:

OracleCommand cmd = new OracleCommand("MYPKG.MYPROCEDURE", OraCon); 
cmd.CommandType = CommandType.StoredProcedure; 
OracleParameter name = new OracleParameter("sNom", OracleType.VarChar); 
name.Value = "CG"; 
cmd.Parameters.Add(name); 
OracleParameter valeur = new OracleParameter("sValeur", OracleType.VarChar); 
cmd.Parameters.Add(valeur); 
OracleParameter commentaire = new OracleParameter("sCommentaire", OracleType.VarChar); 
cmd.Parameters.Add(commentaire); 
OracleParameter retour = new OracleParameter("sRetour", OracleType.VarChar); 
cmd.Parameters.Add(retour); 
OracleParameter msgRetour = new OracleParameter("sMsgRetour", OracleType.VarChar); 
cmd.Parameters.Add(msgRetour); 

using (OracleDataReader row = cmd.ExecuteReader()) 
{ 
    while (row.Read()) 
    { 
     Console.WriteLine(row.GetValue(0)); 
    } 
} 

我有错误 “错误的参数”。 如何执行PL/SQL过程?

回答

5

这就是我将如何接近它。
注:我已编译此代码,但我没有对数据库进行测试,虽然我有很多类似的代码可以正常工作。

另外请注意:你是不是取回一个集合,所以你应该使用OraCmd.ExecuteNonQuery而不是OraCmd.ExecuteReader

using System.Configuration; 
using System.Data; 
using Oracle.DataAccess.Client; 


    namespace Testing 
    { 
     public class OracleCommandTest 
     { 

      string m_strConnectionsString = string.Empty; 

      //Constructor 
      public OracleCommandTest() 
      { 
       //Get the connection string from the app.config    
       m_strConnectionsString = ConfigurationManager.ConnectionStrings["ConnectionStringName"].ConnectionString; 

       //if it is a web app, then use this call instead 
       //m_strConnectionsString = WebConfigurationManager.ConnectionStrings["ConnectionStringName"].ConnectionString; 

      } 



      public void getData(string sNom, out string sValeur, out string sCommentaire, out string sRetour, out string sMsgRetour) 
      { 
       OracleConnection ora_conn = new OracleConnection(m_strConnectionsString); 

       try 
       { 
        ora_conn.Open(); 

        /*********************Oracle Command**********************************************************************/ 
        OracleCommand ora_cmd = new OracleCommand("MYPKG.MYPROCEDURE", ora_conn); 
        ora_cmd.BindByName = true; 
        ora_cmd.CommandType = CommandType.StoredProcedure; 


        ora_cmd.Parameters.Add("sNom", OracleDbType.Varchar2, sNom, ParameterDirection.Input); 
        ora_cmd.Parameters.Add("sValeur", OracleDbType.Varchar2, ParameterDirection.Output); 
        ora_cmd.Parameters.Add("sCommentaire", OracleDbType.Varchar2, ParameterDirection.Output); 
        ora_cmd.Parameters.Add("sRetour", OracleDbType.Varchar2, ParameterDirection.Output); 
        ora_cmd.Parameters.Add("sMsgRetour", OracleDbType.Varchar2, ParameterDirection.Output); 
        /*********************Oracle Command**********************************************************************/ 

        ora_cmd.ExecuteNonQuery(); 

        //Now get the values output by the stored procedure  
        sValeur = ora_cmd.Parameters["sValeur"].Value.ToString(); 
        sCommentaire = ora_cmd.Parameters["sCommentaire"].Value.ToString(); 
        sRetour = ora_cmd.Parameters["sRetour"].Value.ToString(); 
        sMsgRetour = ora_cmd.Parameters["sMsgRetour"].Value.ToString(); 




       } 

       //catch (Exception ex) 
       //{ 
       // WebErrorHandling.WriteToEventLog("PRVEquipment_DAL.getPRVEquipment", ex); 

       //} 
       finally 
       { 
        if (ora_conn.State == ConnectionState.Open) 
        { 
         ora_conn.Close(); 
        } 
       } 

      } 


     } 


    } 

希望这有助于
哈维Sather

+0

太棒了!谢谢。 – 2011-06-06 08:24:57

0

您忘记设置参数Direction

你必须设置ParameterDirection.Output因为你期望的值从存储过程的其他默认情况下,考虑作为输入参数,所以错误

+0

感谢的,它是这是问题的一部分(参见其他讨论)。 – 2011-06-01 09:56:49

0

使用OracleType列举的参数类型返回。更多信息here
您还应该设置参数的Direction
Example

+0

我设置了方向。 现在的错误是: ORA-06502:PL/SQL:数字或值错误:字符数转换错误 ORA-06512:在line 1 但是我设置DbType.String,是不是正确的类型? – 2011-06-01 09:49:32

+0

我用OracleType.VarChar替换DbType.String时出现同样的错误。 – 2011-06-01 09:56:04

+2

最后一个问题来自我必须将Size属性设置为OracleParameter。 感谢您的帮助。 – 2011-06-01 10:11:48