簡體   English   中英

在 .NET 中,如何執行這個 Oracle PL/SQL 過程?

[英]In .NET, How to execute this Oracle PL/SQL Procedure?

我的程序在這里聲明:

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 Developer 可以執行。

我嘗試在 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 程序?

這就是我將如何處理它。
注意:我已經編譯了這段代碼,但我沒有針對數據庫對其進行測試,盡管我有很多類似的代碼可以正常工作。

另請注意:您沒有取回集合,因此您應該真正使用 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();
                    }
                }

            }


        }


    }

希望這可以幫助
哈維薩瑟

您忘記為參數設置Direction

您必須設置ParameterDirection.Output因為您期望從存儲過程返回值,否則默認情況下將其視為輸入參數,因此錯誤

對參數類型使用OracleType枚舉。 更多信息在這里
您還應該設置參數的Direction
例子

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM