2010-10-15 21 views
18

Ich habe gerade angefangen, über gespeicherte Prozeduren zu lesen. Kann mir bitte jemand helfen, eine gespeicherte Prozedur in Oracle von C# anzurufen?Oracle gespeicherte Prozedur von C# aufrufen?

+2

Können Sie die gespeicherte Prozedur schreiben?Mit welchen Bibliotheken verbinden Sie sich mit der DB? ADO.NET? Ein ORM (nHibernate, EF)? Sie müssen viel mehr Details zur Verfügung stellen, wenn Sie eine Antwort wünschen, die Ihren Bedürfnissen entspricht. – Oded

+0

Wenn Sie eine Oracle-spezifische Antwort erwarten, markieren Sie Ihre Frage bitte als Oracle. Vielen Dank ! – tsimbalar

+0

Ich habe zuvor grundlegende SQL-Abfragen verwendet. Jetzt wollte ich jedoch Oracle-Prozeduren aufrufen, die bereits mit C# -Code geschrieben wurden. – Rohan

Antwort

27

Bitte besuchen Sie diese ODP-Website von Oracle für Microsoft OracleClient Entwickler einzurichten: http://www.oracle.com/technetwork/topics/dotnet/index-085703.html

Auch unten ist ein Beispielcode, den Sie können den Einstieg in Oracle eine gespeicherte Prozedur von C# nennen. PKG_COLLECTION.CSP_COLLECTION_HDR_SELECT ist die gespeicherte Prozedur, die auf den Oracle-Akzeptanzparametern PUNIT, POFFICE, PRECEIPT_NBR basiert und das Ergebnis in T_CURSOR zurückgibt.

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

Warum wird 'InitialLONGFetchSize = 1000' bevorzugt? Aus dem DOCS 'Default = 0. Festlegen dieser Eigenschaft auf 0 verschiebt die LANGE und LANGE RAW-Datenabruf vollständig, bis die Anwendung es speziell anfordert. ' – KLIM8D

3

Es ist im Grunde der gleiche Mechanismus wie für einen nicht-Abfragebefehl mit:

  • Command.CommandText = den Namen der gespeicherte Prozedur
  • command.CommandType = CommandType.StoredProcedure
  • Wie viele Anrufe command.Parameters.Add als die Anzahl der Parameter, die der SP erfordert
  • command.ExecuteNonQuery

Es gibt viele Beispiele gibt, die erste von Google zurück ist this one

Es gibt auch eine kleine Falle Sie in fallen könnte, wenn Ihr SP eine Funktion ist, muss der Rückgabewert Parameter in den Parametern ersten sein, Sammlung

2

in .Net durch Version 4 kann dies als für SQL Server gespeicherte Procs die gleiche Art und Weise getan werden, aber beachten Sie, dass Sie benötigen:

using System.Data.OracleClient; 

Es gibt some system requirements here, die Sie in Ihrem Szenario sind OK bestätigen sollte.

Microsoft ist deprecating this namespace as of .Net 4, so dass Drittanbieter in der Zukunft benötigt werden. In diesem Sinne sollten Sie von Anfang an besser mit Oracle Data Provider for .Net (ODP.NET) arbeiten - das hat Optimierungen, die nicht in den Microsoft-Klassen sind. Es gibt noch weitere Optionen von Drittanbietern, aber Oracle hat ein starkes Interesse daran, .Net-Entwickler an Bord zu behalten, damit sie gut sein sollten.

12

ich haben jetzt die Schritte von 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); 

this helps

+0

Können Sie mir sagen, was der Zweck von' OracleDataAdapter da = neue OracleDataAdatper (cmd); 'ist? Ist diese Linie erforderlich? – AlbatrossCafe

4

Dieser Kodex für mich ruft gespeicherte Oracle-Prozedur

Referenzen gut nennen Verfahren erforderlich arbeitet

hinzufügen von Klicken Sie mit der rechten Maustaste auf Ihren Projektnamen im Lösungsexplorer> Referenz hinzufügen> .Net und dann Namespaces hinzufügen.

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

dann diesen Code in Ereignishandler einfügen

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

Und seine Erledigt ... Glücklich mit dem C#

Coding
Verwandte Themen