2010-10-15 16 views
18

Właśnie zacząłem czytać o przechowywanych procedurach. Czy ktoś może mi pomóc wywołać procedurę przechowywaną w Oracle z C#?Wywołanie procedury składowanej Oracle z C#?

+2

można pisać procedury przechowywanej?Jakie biblioteki używasz do łączenia się z bazą danych? ADO.NET? ORM (nHibernate, EF)? Musisz podać dużo więcej szczegółów, jeśli chcesz uzyskać odpowiedź, która będzie pasować do twoich potrzeb. – Oded

+0

Jeśli spodziewasz się odpowiedzi związanej z Oracle, oznacz to pytanie jako Oracle. Dziękuję Ci ! – tsimbalar

+0

Użyłem wcześniej podstawowych zapytań SQL. Jednak teraz chciałem nazwać procedury Oracle już napisane, używając kodu C#. – Rohan

Odpowiedz

27

proszę odwiedzić tę stronę ODP ustanowiony przez Oracle dla Microsoft OracleClient Deweloperzy: http://www.oracle.com/technetwork/topics/dotnet/index-085703.html

także Poniżej znajduje się przykładowy kod, który może Ci zacząć wywołać procedurę przechowywaną z C# do bazy danych Oracle. PKG_COLLECTION.CSP_COLLECTION_HDR_SELECT jest procedurą składowaną opartą na Oracle przyjmującą parametry PUNIT, POFFICE, PRECEIPT_NBR i zwracającą wynik w 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

Dlaczego preferowana jest opcja "InitialLONGFetchSize = 1000"? Z DOCS 'Domyślnie = 0. Ustawienie tej właściwości na 0 powoduje całkowite usunięcie danych LONG i LONG RAW do momentu, aż aplikacja o nie poprosi." – KLIM8D

3

Jest to w zasadzie taki sam mechanizm jak w przypadku braku polecenia frazę:

  • command.CommandText = nazwę procedury przechowywanej
  • command.CommandType = CommandType.StoredProcedure
  • Jak wiele połączeń do command.Parameters.Add jako liczba parametrów sp wymaga
  • command.ExecuteNonQuery

Istnieje wiele przykładów tam, pierwszy zwrócony przez Google jest this one

Jest też trochę pułapkę można wpaść, jeśli SP jest funkcją, Twój parametr wartość powrotna musi być pierwszy w parametrach kolekcja

2

w .NET poprzez wersji 4 można to zrobić w ten sam sposób jak dla SQL Server przechowywanych Procs ale należy pamiętać, że trzeba:

using System.Data.OracleClient; 

Istnieje some system requirements here, że należy zweryfikować są OK w swoim scenariuszu.

Microsoft to deprecating this namespace as of .Net 4, więc dostawcy usług zewnętrznych będą potrzebni w przyszłości. Mając to na uwadze, możesz być lepiej używając Oracle Data Provider for .Net (ODP.NET) od słowa go - to ma optymalizacje, które nie są w klasach Microsoft. Istnieją inne opcje stron trzecich, ale Oracle ma silny interes w utrzymywaniu deweloperów .Net na pokładzie, więc ich powinna być dobra.

12

Mam teraz dostał kroki potrzebne do wywołania procedury z 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); 

nadzieję, że to pomaga

+0

Czy możesz mi powiedzieć, jaki jest cel 'OracleDataAdapter da = new OracleDataAdatper (cmd); 'jest? Czy ta linia jest wymagana? – AlbatrossCafe

4

ten kod działa dobrze dla mnie nazywając Oracle procedura przechowywana

dodać odwołania przez klikając prawym przyciskiem myszy nazwę twojego projektu w eksploratorze rozwiązań> Dodaj odwołanie> .Net, a następnie Dodaj przestrzenie nazw.

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

następnie wklej ten kod w wydarzeniu Handler

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

i jego Gotowe ... Szczęśliwy Coding z C#

Powiązane problemy