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#?
Répondre
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;
}
}
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
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
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.
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
Pouvez-vous me dire quel est l'objectif de' OracleDataAdapter da = new OracleDataAdatper (cmd); 'est? Cette ligne est-elle requise? – AlbatrossCafe
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#
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
Si vous attendez une réponse spécifique à Oracle, veuillez étiqueter votre question en tant qu'Oracle. Je vous remercie ! – tsimbalar
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