Как да извикате претоварена процедура на oracle чрез c#

Имам две процедури в пакет (TEST_PAK), които са претоварени на Oracle 9i. Като параметри се приема низ, а другият масив. Проблемът, с който се сблъсквам, е, когато се опитвам да извикам с null като параметър. Използвам C# и ODP.NET за извикване на процедурите.

Ето главата на двата процеса:

PROCEDURE get_requests_with_files
(
    o_results OUT sys_refcursor, 
    in_communicator IN VARCHAR2, 
    in_state        IN VARCHAR2  -- State of requests wanted (use NULL for ALL records)
)

и

PROCEDURE get_requests_with_files
(
     o_results OUT SYS_REFCURSOR,    
     in_communicator IN VARCHAR2,    
     in_states       IN flagTableType 
)

FlagTypeTable е начинът, по който предавам PLSQLAssociativeArray към моята процедура и всъщност не е част от проблема (мисля).

Ето C# кода, който използвам за извикване на proc.

private static DataSet GetRequests(String consumer, List<string> states)
{
    try
    {
        const string query = "TEST_PAK.get_requests_with_files";

        var retVal = new DataSet();
        var oComm = new OracleCommand(query, _oConn);
        var oDa = new OracleDataAdapter(oComm);
        oComm.CommandType = CommandType.StoredProcedure;
        oComm.CommandTimeout = CommandTimeout;

        //Parameters

        oComm.Parameters.Add("o_results", OracleDbType.RefCursor);
        oComm.Parameters["o_results"].Direction = ParameterDirection.Output;

        oComm.Parameters.Add("in_communicator", OracleDbType.Varchar2);
        oComm.Parameters["in_communicator"].Value = consumer;

        if (states.Count != 0)
        {
            oComm.Parameters.Add(new OracleParameter("in_states", OracleDbType.Varchar2)
            {
                CollectionType = OracleCollectionType.PLSQLAssociativeArray,
                Value = states.ToArray()
            });
        }
        else
        {
            oComm.Parameters.Add("in_state", OracleDbType.Varchar2);
            oComm.Parameters["in_state"].Value = null;
        }

        _oConn.Open();

        oDa.Fill(retVal);
        return retVal;
    }
    catch (Exception ex)
    {
        Console.WriteLine(ex);
        return null;
    }
    finally
    {
        if (_oConn.State != ConnectionState.Closed) _oConn.Close();
    }
}

Опитах да поставя двоеточия пред параметрите, мислейки, че посочените параметри ще свършат работа без успех.

Знам, че мога да извикам кода в SQLDeveloper така:

variable o_results refcursor;
execute Apps.Base_communicator.get_requests_with_files(:o_results, in_communicator => 'MYCOMM', in_state => null);
print o_results;

Така че знам, че претоварванията работят, но не и как да ги извикам в c#


person SpaceCowboy74    schedule 06.02.2013    source източник
comment
Каква грешка получавате?   -  person D Stanley    schedule 07.02.2013
comment
Години след C#, но трябва ли oComm.Parameters["in_state"].Value = null; да бъде oComm.Parameters["in_state"].Value = DBNull.value;? msdn.microsoft.com/en-us/library/system.dbnull. aspx   -  person Shannon Severance    schedule 07.02.2013
comment
Грешката, която получавам, е PLS-00307: твърде много декларации на 'get_requests_with_files' съответстват на това извикване. Опитах идеята DBNull току-що и все още получавам същата грешка.   -  person SpaceCowboy74    schedule 07.02.2013


Отговори (1)


Открих, че решението е да добавя BindByName към обекта OracleCommand. Правейки това (и премахвайки двоеточията) му позволи да се свърже с променливите по име. Това позволява на претоварванията да работят, стига имената да са различни.

person SpaceCowboy74    schedule 11.02.2013