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#?
risposta
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;
}
}
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
È 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
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.
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
mi puoi dire quale sia lo scopo di' OracleDataAdapter da = new OracleDataAdatper (cmd)? è? È necessaria questa linea? – AlbatrossCafe
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#
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
Se si prevede una risposta specifica per Oracle, contrassegnare la domanda come Oracle. Grazie ! – tsimbalar
Ho già utilizzato query SQL di base. Tuttavia, ora volevo chiamare Oracle Procedure già scritte, usando il codice C#. – Rohan