2017-01-19 2 views
0

À partir du code C#, j'essaie d'appeler un PACKAGE.PROCEDURE() à partir d'Oracle. Dans cet exemple simple je devrais obtenir une valeur de l'appel de procédure, mais tout ce que je reçois est erreur:Comment appeler une procédure Oracle à partir de C#

wrong number or types of arguments in call to 'RETURN_NUM'

La procédure est déclarée comme suit:

PROCEDURE return_num(xNum OUT NUMBER) AS 
    BEGIN 
    xNum:= 50; 
    dbms_output.put_line('hello world ' || xNum); 
    END; 

code C#:

Oraclecon.Open(); 
        OleDbCommand myCMD = new   OleDbCommand("TEST.return_num", Oraclecon); 
        myCMD.CommandType = CommandType.StoredProcedure; 
        myCMD.Parameters.Add("xNum", OleDbType.Numeric); 

        OleDbDataReader myReader; 
        myReader = myCMD.ExecuteReader(); 

Quelqu'un peut-il s'il vous plaît signaler ce que je fais mal. Puis, dans un vrai scénario que je voudrais appeler une procédure qui renvoie un ensemble de valeurs d'un type personnalisé, par exemple:

TYPE r_interface_data IS RECORD 
    (
    object_id    VARCHAR2(16),  
    obj_type    VARCHAR2(32) 
    ); 

    TYPE t_interfase_data IS TABLE OF r_interface_data; 

Comment puis-je aborder cela. Merci!

MISE À JOUR: Dans mon cas particulier, je fini par faire-la démarche suivante

using (OleDbCommand cmd = new OleDbCommand("PACKAGE.procedure_name")) 
       { 
        cmd.CommandType = CommandType.StoredProcedure; 

        SqlManager sqlManager = new SqlManager(); 
        return sqlManager.GetDataSet(cmd); 
       } 
+0

MISE À JOUR: Donc, si je spécifie la direction du paramètre à OUT (voir le code ci-dessous), alors mon code compile; mais je n'ai reçu aucune donnée ... 'myCMD.Parameters.Add (" xNum ", OleDbType.Numeric) .Direction = ParameterDirection.Output; ' Des idées? –

Répondre

2

Je ne pense pas que vous êtes si loin ... essayez ceci:

OracleCommand cmd = new OracleCommand("return_num", Oraclecon); 
cmd.Parameters.Add(new OracleParameter("xNum", OracleDbType.Decimal, 
    ParameterDirection.Output)); 
cmd.CommandType = CommandType.StoredProcedure; 

cmd.ExecuteNonQuery(); 
OracleDecimal d = (OracleDecimal)cmd.Parameters[0].Value; 
double result = d.ToDouble(); 

result contient maintenant le paramètre out de la procédure.

Je pense que votre problème est que vous essayez d'utiliser un DbDataReader sur une procédure stockée. DbDataReader est pour les requêtes.

En outre, j'ai utilisé ODP.net - qui peut avoir contribué ou non à votre problème, que vous utilisiez Ole.

+0

Merci pour votre réponse @Hambone. Dans mon cas particulier, j'ai fini par utiliser l'approche suivante ... voir la mise à jour –