0

Dans ma base de données, j'ai une procédure stockée avec un paramètre OUTPUT de type SYS_REFCURSOR. Le côté application est écrit en C#. Puis-je assigner le paramètre de sortie de cette procédure à un Datatable comme:Utilisation du paramètre ouput de type SYS_refcursor

............. 
OracleConnection con=new OracleConnection(......); 
OracleCommand cmd=new OracleCommand("MyStoredProc",con); 
cmd.CommandType=CommandType.StoredProcedure; 
cmd.Parameters.Add("REC_CUR",OracleType.Cursor).Direction=ParameterDirection.Output; 
con.Open(); 
cmd.ExecuteNonQuery(); 
DataTable dt=(DataTable)cmd.Parameters["REC_CUR"].value;//is this legal? 

Répondre

2

Voici la réponse à ma propre question. Si la Parametr de sortie d'une procédure stockée est de type SYS_REFCURSOR alors la commande

cmd.Parameters["REC_CUR"].value 

retourne un objet OracleDataReader, pas une table. Et il n'y a pas de transtypage implicite ou explicite de OracledataReader vers DataTable.

+4

Il convient de mentionner qu'il n'y a pas de conversion implicite de toute DataReader à DataTable (pas seulement OracleDataReader). La méthode 'DataTable.Load (IDataReader)' peut être utilisée à la place. par exemple. 'DataTable dt = new DataTable(); dt.Load ((OracleDataReader) cmd.Parameters ["REF_CUR"]. value); ' –

+0

Assurez-vous de ne pas fermer votre objet de connexion tant que vous n'avez pas fini de lire les données ou de les charger dans un DataTable. Aucune exception n'est levée si votre DataReader est fermé lorsque vous appelez DataTable.Load. – Peter

1

Vous pouvez utiliser OracleDataAdapter comme ci-dessous,

exemple de code avec plusieurs des paramètres avec RefCursor:

using (OracleCommand cmd = new OracleCommand("SP1", OraCon) { CommandType = System.Data.CommandType.StoredProcedure }) 
{ 
    var parm_nic = cmd.Parameters.Add("parm_nic", OracleDbType.NVarchar2); 
    parm_nic.Value = msgBody; 

    var pram_Name = cmd.Parameters.Add("pram_Name", OracleDbType.NVarchar2, 150, ParameterDirection.Output); 
    var pram_PAdress = cmd.Parameters.Add("pram_PAdress", OracleDbType.NVarchar2, 150, ParameterDirection.Output); 
    var output = cmd.Parameters.Add("pram_status", OracleDbType.RefCursor, ParameterDirection.Output); 
    OraCon.Open(); 

    OracleDataAdapter ad = new OracleDataAdapter(cmd); 
    OracleCommandBuilder cb = new OracleCommandBuilder(ad); 

    DataTable dt = new DataTable(); 
    ad.Fill(dt); 

    var address = pram_PAdress.Value; 
    var name = pram_Name.Value; 
} 
Questions connexes