2010-10-15 11 views
18

Je viens de commencer à lire sur les procédures stockées. Quelqu'un peut-il m'aider s'il vous plaît à appeler une procédure stockée dans Oracle à partir de C#?Appel de la procédure stockée Oracle à partir de C#?

+2

Pouvez-vous poster la procédure stockée?Quelles bibliothèques utilisez-vous pour vous connecter à la base de données? ADO.NET? Un ORM (nHibernate, EF)? Vous devez fournir beaucoup plus de détails si vous voulez une réponse qui répondra à vos besoins. – Oded

+0

Si vous attendez une réponse spécifique à Oracle, veuillez étiqueter votre question en tant qu'Oracle. Je vous remercie ! – tsimbalar

+0

J'ai déjà utilisé des requêtes SQL de base. Cependant, maintenant je voulais appeler Oracle Procedures déjà écrit, en utilisant le code C#. – Rohan

Répondre

27

S'il vous plaît visitez ce site ODP mis en place par Oracle pour les développeurs Microsoft OracleClient: http://www.oracle.com/technetwork/topics/dotnet/index-085703.html

ci-dessous aussi est un exemple de code qui peut vous aider à démarrer appeler une procédure stockée de C# à Oracle. PKG_COLLECTION.CSP_COLLECTION_HDR_SELECT est la procédure stockée basée sur Oracle acceptant les paramètres PUNIT, POFFICE, PRECEIPT_NBR et renvoyant le résultat dans T_CURSOR.

using Oracle.DataAccess; 
using Oracle.DataAccess.Client; 

public DataTable GetHeader_BySproc(string unit, string office, string receiptno) 
{ 
    using (OracleConnection cn = new OracleConnection(DatabaseHelper.GetConnectionString())) 
    { 
     OracleDataAdapter da = new OracleDataAdapter(); 
     OracleCommand cmd = new OracleCommand(); 
     cmd.Connection = cn; 
     cmd.InitialLONGFetchSize = 1000; 
     cmd.CommandText = DatabaseHelper.GetDBOwner() + "PKG_COLLECTION.CSP_COLLECTION_HDR_SELECT"; 
     cmd.CommandType = CommandType.StoredProcedure; 
     cmd.Parameters.Add("PUNIT", OracleDbType.Char).Value = unit; 
     cmd.Parameters.Add("POFFICE", OracleDbType.Char).Value = office; 
     cmd.Parameters.Add("PRECEIPT_NBR", OracleDbType.Int32).Value = receiptno; 
     cmd.Parameters.Add("T_CURSOR", OracleDbType.RefCursor).Direction = ParameterDirection.Output; 

     da.SelectCommand = cmd; 
     DataTable dt = new DataTable(); 
     da.Fill(dt); 
     return dt; 
    } 
} 
+0

Pourquoi "InitialLONGFetchSize = 1000" est-il préféré? From the DOCS 'Default = 0. La définition de cette propriété sur 0 diffère complètement la récupération de données LONG et LONG RAW jusqu'à ce que l'application le demande spécifiquement. – KLIM8D

3

Il est essentiellement le même mécanisme que pour une commande non requête avec:

  • Command.CommandText = le nom de la procédure stockée
  • command.CommandType = CommandType.StoredProcedure
  • Comme de nombreux appels à command.Parameters.Add comme le nombre de paramètres requis par le sp
  • command.ExecuteNonQuery

Il y a beaucoup d'exemples là-bas, le premier retourné par Google est this one

Il y a aussi un petit piège que vous pourriez tomber, si votre SP est une fonction, votre paramètre de valeur de retour doit être d'abord dans les paramètres collection

2

dans .Net dans la version 4 cela peut se faire de la même manière que pour le serveur SQL stockées procs mais notez que vous avez besoin:

using System.Data.OracleClient; 

Il y a some system requirements here que vous devez vérifier sont OK dans votre scénario.

Microsoft est deprecating this namespace as of .Net 4 afin que les fournisseurs tiers seront nécessaires à l'avenir. Dans cet esprit, il est préférable d'utiliser Oracle Data Provider for .Net (ODP.NET) dès le départ - ceci a des optimisations qui ne sont pas dans les classes Microsoft. Il existe d'autres options tierces, mais Oracle a tout intérêt à garder les développeurs .Net à leur disposition.

12

J'ai maintenant obtenu les étapes nécessaires pour appeler la procédure de C#

//GIVE PROCEDURE NAME 
    cmd = new OracleCommand("PROCEDURE_NAME", con); 
    cmd.CommandType = CommandType.StoredProcedure; 

    //ASSIGN PARAMETERS TO BE PASSED 
    cmd.Parameters.Add("PARAM1",OracleDbType.Varchar2).Value = VAL1; 
    cmd.Parameters.Add("PARAM2",OracleDbType.Varchar2).Value = VAL2; 

    //THIS PARAMETER MAY BE USED TO RETURN RESULT OF PROCEDURE CALL 
    cmd.Parameters.Add("vSUCCESS", OracleDbType.Varchar2, 1); 
    cmd.Parameters["vSUCCESS"].Direction = ParameterDirection.Output; 

    //USE THIS PARAMETER CASE CURSOR IS RETURNED FROM PROCEDURE 
    cmd.Parameters.Add("vCHASSIS_RESULT",OracleDbType.RefCursor,ParameterDirection.InputOutput); 

    //CALL PROCEDURE 
    con.Open(); 
    OracleDataAdapter da = new OracleDataAdapter(cmd); 
    cmd.ExecuteNonQuery(); 

    //RETURN VALUE 
    if (cmd.Parameters["vSUCCESS"].Value.ToString().Equals("T")) 
    { 
     //YOUR CODE 
    } 
    //OR 
    //IN CASE CURSOR IS TO BE USED, STORE IT IN DATATABLE 
    con.Open(); 
    OracleDataAdapter da = new OracleDataAdapter(cmd); 
    da.Fill(dt); 

Hope this helps

+0

Pouvez-vous me dire quel est l'objectif de' OracleDataAdapter da = new OracleDataAdatper (cmd); 'est? Cette ligne est-elle requise? – AlbatrossCafe

4

Ce code fonctionne bien pour moi d'appeler la procédure stockée oracle

Ajouter des références par faites un clic droit sur le nom de votre projet dans l'explorateur de solutions> Ajouter une référence> .Net puis Ajouter des espaces de noms.

using System.Data.OracleClient; 
using System.Data; 

puis coller ce code dans l'événement gestionnaire

 string str = "User ID=username;Password=password;Data Source=Test"; 
     OracleConnection conn = new OracleConnection(str); 
     OracleCommand cmd = new OracleCommand("stored_procedure_name", conn); 
     cmd.CommandType = CommandType.StoredProcedure; 
     --Ad parameter list-- 
     cmd.Parameters.Add("parameter_name", "varchar2").Value = value; 
     .... 
     conn.Open(); 
     cmd.ExecuteNonQuery(); 

Et son fait ... Bonne programmation avec C#