2010-10-15 45 views
18

Acabo de empezar a leer acerca de los procedimientos almacenados. ¿Alguien puede ayudarme a llamar un procedimiento almacenado en Oracle desde C#?¿Llamar al procedimiento almacenado de Oracle desde C#?

+2

Se puede publicar el procedimiento almacenado?¿Qué bibliotecas estás utilizando para conectarte a la base de datos? ADO.NET? Un ORM (nHibernate, EF)? Debe proporcionar muchos más detalles si desea una respuesta que se adapte a sus necesidades. – Oded

+0

Si espera una respuesta específica de Oracle, por favor marque su pregunta como Oracle. Gracias ! – tsimbalar

+0

He usado consultas SQL básicas antes. Sin embargo, ahora quería llamar a Oracle Procedures ya escrito, usando el código C#. – Rohan

Respuesta

27

Por favor, visite este sitio PAO establecido por Oracle para Microsoft OracleClient Desarrolladores: http://www.oracle.com/technetwork/topics/dotnet/index-085703.html

también a continuación es un ejemplo de código que puede empezar a llamar a un procedimiento almacenado desde C# para Oracle. PKG_COLLECTION.CSP_COLLECTION_HDR_SELECT es el procedimiento almacenado creado en Oracle que acepta los parámetros PUNIT, POFFICE, PRECEIPT_NBR y devuelve el resultado en 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

¿Por qué se prefiere 'InitialLONGFetchSize = 1000'? De DOCS 'Predeterminado = 0. Al establecer esta propiedad en 0, se difieren por completo los datos de recuperación de datos LARGOS y LARGOS hasta que la aplicación lo solicite específicamente. – KLIM8D

3

Es básicamente el mismo mecanismo que para un comando no consulta con:

  • command.CommandText = el nombre del procedimiento almacenado
  • command.CommandType = CommandType.StoredProcedure
  • Como muchas llamadas a command.Parameters.Add como el número de parámetros que sp requiere
  • command.ExecuteNonQuery

Hay un montón de ejemplos por ahí, el primero que devuelve Google es this one

También hay una pequeña trampa que puede caer, si su SP es una función, el parámetro de valor de retorno debe ser en primer lugar en los parámetros colección

2

en .Net a través de la versión 4 esto se puede hacer de la misma forma que para procedimientos almacenados de SQL Server, pero tenga en cuenta que lo que necesita:

using System.Data.OracleClient; 

Hay some system requirements here que usted debe verificar están bien en su escenario.

Microsoft es deprecating this namespace as of .Net 4 por lo que se necesitarán proveedores externos en el futuro. Con esto en mente, es mejor utilizar Oracle Data Provider for .Net (ODP.NET) desde el principio: esto tiene optimizaciones que no están en las clases de Microsoft. Existen otras opciones de terceros, pero Oracle tiene un gran interés en mantener a los desarrolladores de .Net a bordo, por lo que el suyo debería ser bueno.

12

ahora tengo los pasos necesarios para llamar a procedimiento desde 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); 

espero que esto ayude

+0

¿Puede decirme cuál es el propósito de' OracleDataAdapter da = new OracleDataAdatper (cmd); ¿es? ¿Se requiere esta línea? – AlbatrossCafe

4

Este Código funciona bien para mí llamar a Oracle procedimiento almacenado

Añadir referencias por haciendo clic derecho en el nombre de su proyecto en el explorador de soluciones> Agregar referencia> .Net y luego agregue espacios de nombres.

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

A continuación, pega este código en controlador de eventos

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

Y su hecho ... Feliz Codificación con C#

Cuestiones relacionadas