2010-10-15 2 views
18

Ho appena iniziato a leggere le stored procedure. Qualcuno può aiutarmi a chiamare una procedura memorizzata in oracle da C#?Chiamare la stored procedure Oracle da C#?

+2

Puoi pubblicare la stored procedure?Quali librerie stai usando per connettersi al DB? ADO.NET? Un ORM (nibernato, EF)? È necessario fornire molti più dettagli se si desidera una risposta adatta alle proprie esigenze. – Oded

+0

Se si prevede una risposta specifica per Oracle, contrassegnare la domanda come Oracle. Grazie ! – tsimbalar

+0

Ho già utilizzato query SQL di base. Tuttavia, ora volevo chiamare Oracle Procedure già scritte, usando il codice C#. – Rohan

risposta

27

Si prega di visitare il sito ODP istituito da Oracle per Microsoft OracleClient sviluppatori: http://www.oracle.com/technetwork/topics/dotnet/index-085703.html

sotto è anche un esempio di codice che può cominciare a chiamare una stored procedure da C# a Oracle. PKG_COLLECTION.CSP_COLLECTION_HDR_SELECT è la stored procedure costruita su Oracle che accetta i parametri PUNIT, POFFICE, PRECEIPT_NBR e restituisce il risultato in 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

Perché è preferito 'InitialLONGFetchSize = 1000'? Dalla documentazione 'default = 0. L'impostazione di questa proprietà su 0 posticipa il lungo e il recupero dei dati LONG RAW del tutto finché l'applicazione non richieda specificamente it.' – KLIM8D

3

È fondamentalmente lo stesso meccanismo di comando non query con:

  • command.CommandText = il nome del stored procedure
  • command.CommandType = CommandType.StoredProcedure
  • Come molte chiamate command.Parameters.Add come il numero di parametri sp richiede
  • command.ExecuteNonQuery

Ci sono molti esempi là fuori, la prima restituito da Google è this one

C'è anche una piccola trappola si potrebbe cadere in, se il SP è una funzione, il parametro di valore di ritorno deve essere il primo nei parametri raccolta

2

in .Net fino alla versione 4 questo può essere fatto allo stesso modo per stored procedure di SQL Server, ma notare che è necessario:

using System.Data.OracleClient; 

ci sono some system requirements here che si dovrebbe verificare sono OK nello scenario.

Microsoft è deprecating this namespace as of .Net 4 quindi in futuro saranno necessari provider di terze parti. Con questo in mente, potresti star meglio usando Oracle Data Provider for .Net (ODP.NET) dall'inizio - questo ha delle ottimizzazioni che non sono nelle classi Microsoft. Ci sono altre opzioni di terze parti, ma Oracle ha un forte interesse nel mantenere gli sviluppatori .NET a bordo, quindi il loro dovrebbe essere buono.

12

Ora ho ottenuto i passi necessari per la chiamata di procedura da 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); 

Spero che questo aiuti

+0

mi puoi dire quale sia lo scopo di' OracleDataAdapter da = new OracleDataAdatper (cmd)? è? È necessaria questa linea? – AlbatrossCafe

4

questo codice funziona bene per me chiamare Oracle stored procedure

aggiungere i riferimenti da fare clic con il tasto destro sul nome del progetto in solution explorer> Aggiungi riferimento> .Net quindi Aggiungi spazi dei nomi.

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

quindi incollare questo codice in Handler evento

 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(); 

E il suo fare ... Felice Coding con C#