sábado, 3 de marzo de 2012

Ejemplo Entity Framework con Oracle

En este post podremos ver un ejemplo practico de como funciona Entity Framework con Oracle, los objetivos a tratar serán:
  1. Crear un store Procedure en Oracle
  2. Configurar el Entity Framework
  3. Consumir una tabla de Oracle
  4. Consumir un store procedure de Oracle

Antes que nada debemos instalar el cliente de Oracle y las herramientas ODAC el cual podemos descargar del siguiente link:
http://www.oracle.com/technetwork/topics/dotnet/downloads/index.html


1.) En este paso vamos  crear las tablas con la que realizaremos el ejemplo , en este link podrán encontrar los script necesarios:
http://www.cjorellana.net/p/scriptoracle.html


2.) Crear un proyecto en Visual Studio .Net
    3.1) Archivo - Create web site






4.) Configurando Entity Framework
         4.1) Clic derecho sobre el solución explorer - add new item


         4.2) Seleccione Entity framework y deje el nombre predeterminado.


         4.3) El la primera pantalla del asistente debe seleccione "Generate from database"

         4.4) Presioné clic en el botón new Connection y configure su conexión a oracle.




         4.3) Ahora mostrara la pantalla seleccione la conexión que acaba de configurar, seleccione "yes" en incluir password.


         4.3) Ahora mostrara la pantalla para que seleccione los objetos a utilizar, seleccione la tabla Products y por ultimo presión clic en finish.
5.) Abra la pagina Default que fue creada automáticamente y agregue un Gridview y botón.



<html xmlns="http://www.w3.org/1999/xhtml"> 
<head runat="server"> 
    <title></title> 
</head> 
<body> 
    <form id="form1" runat="server"> 
    <div> 

        <asp:Button ID="Button1" runat="server" Text="Button" /> 
        <asp:GridView ID="GridView1" runat="server"> 
        </asp:GridView> 
     
    </div> 
    </form> 
</body> 
</html> 





6.) Ahora realizaremos una consulta a la base de datos, presioné doble clic en el botón que acaba de crear.

protected void Button1_Click(object sender, EventArgs e)
    { 
        Model.Entitiesdbo db = new Model.Entitiesdbo(); 
        var query = from p in db.PRODUCTS 
                    select new { p.PRODUCTID, p.PRODUCTNAME, p.UNITPRICE };

        GridView1.DataSource = query; 
        GridView1.DataBind(); 
    }


El resultado sera:




Ahora vamos hacer la consulta por medio de un Store Procedure que retorne un conjunto de datos.


El primer paso es crear el store procedure:


7.) Como ustedes ya sabes, los store procedure en oracle son muy rápidos, por lo que es un importante utilizar un  Store procedure que obtenga una conjunto de resultados. en este paso vamos crear un store procedure:

7.1.) Vamos a crear un Store Procedure que retorne un conjunto de datos, abra cualquier cliente oracle y ejecute lo siguiente.

CREATE OR replace PROCEDURE ObtenerCat(tabla OUT SYS_REFCURSOR)
IS
BEGIN
  OPEN tabla FOR
    SELECT categoryid,
           categoryname,
           description
    FROM   dbo.categories;
END;

/ 

7.1) Ahora tenemos que configurar nuestro web Config para que entity framework pueda crear su tabla, esta es la parte fea de este cliente oracle ya que tenemos que configurar como se llama el store procedure y cada valor que retorne con su respectivo tipo de datos, 


7.1.1) Abra su web config y agregue esto.


<oracle.dataaccess.client> 
    <settings> 
      <add name="DBO.obtenercat.RefCursor.tabla" value="implicitRefCursor bindinfo='mode=Output'" /> 
      <add name="DBO.obtenercat.RefCursorMetaData.tabla.Column.0" value="implicitRefCursor metadata='ColumnName=CATEGORYID;BaseColumnName=CATEGORYID;BaseSchemaName=DBO;BaseTableName=categories;NATIVEDATATYPE=NUMBER;ProviderType=decimal'" /> 
      <add name="DBO.obtenercat.RefCursorMetaData.tabla.Column.1" value="implicitRefCursor metadata='ColumnName=CATEGORYNAME;BaseColumnName=CATEGORYNAME;BaseSchemaName=DBO;BaseTableName=categories;NATIVEDATATYPE=Varchar2;ProviderType=Varchar2'" /> 
      <add name="DBO.obtenercat.RefCursorMetaData.tabla.Column.2" value="implicitRefCursor metadata='ColumnName=DESCRIPTION;BaseColumnName=DESCRIPTION;BaseSchemaName=DBO;BaseTableName=categories;NATIVEDATATYPE=Varchar2;ProviderType=Varchar2'" />       
    </settings> 
  </oracle.dataaccess.client>






8.) Abramos en Model del entity Framework para llamar a nuestro store procedure
8.1) Precie clic derecho "update Model from DataBase"




9.) En la pantalla el asistente, bajo Store Procedure seleccione el store procedure




10.) Tenemos que crear una función para poder usar el store procedure.
       10.1) Presione clic derecho sobre Model y Add y por ultimo "Funtion Import..." llene con la siguiente información.




       10.2) En la pantalla de importación, podrá notar que no hay ningún Complex, presione clic "Get Column Information"  para que genere la información con los datos del Store Procedure, luego precione Crete New Complex Type, por ultimo OK.








11.) Ahora vamos Agregar a nuestra pagina un Dropdown List para jugar con nuestro store procedure, este de debe agregar antes del Boton.


<html xmlns="http://www.w3.org/1999/xhtml"> 
<head runat="server"> 
    <title></title> 
</head> 
<body> 
    <form id="form1" runat="server"> 
    <div> 
        <asp:DropDownList ID="DropDownList1" runat="server" AutoPostBack="True"> 
        </asp:DropDownList> 
        <asp:Button ID="Button1" runat="server" Text="Button" onclick="Button1_Click" /> 
        <asp:GridView ID="GridView1" runat="server"> 
        </asp:GridView> 
     
    </div> 
    </form> 
</body> 
</html> 
12.a) Llenaremos nuestro dropdown list en el load de la pagina, precione clic derecho view code y agregue el siguiente código:
 protected void Page_Load(object sender, EventArgs e)
    { 
        if (!Page.IsPostBack) 
        { 
            Model.Entitiesdbo db = new Model.Entitiesdbo(); 
            var query = db.OBTENERCAT(); 
            DropDownList1.DataSource = query; 
            DropDownList1.DataTextField = "CATEGORYNAME"; 
            DropDownList1.DataValueField = "CATEGORYID"; 
            DropDownList1.DataBind(); 
        } 
    } 


13.) Por ultimo vamos a cambiar el código de nuestro botón para el gridview1 se filtre en base al drowdownlist.
 protected void Button1_Click(object sender, EventArgs e)
    { 
        Model.Entitiesdbo db = new Model.Entitiesdbo(); 

        decimal codigo = Convert.ToDecimal(DropDownList1.SelectedValue);
        var query = from p in db.PRODUCTS 
                    where p.CATEGORYID== codigo 
                    select new { p.PRODUCTID, p.PRODUCTNAME, p.UNITPRICE };

        GridView1.DataSource = query; 
        GridView1.DataBind(); 
    }


EL RESULTADO FINAL SERA ASI:



3 comentarios:

Benedetto dijo...
Este blog ha sido eliminado por un administrador de blog.
Benedetto dijo...

Profe le tengo muy buenas noticias no se si me puede mandar su numero a mi correo para que lo llame benedettocalvillo@gmail.com
fcalvillo@mintrabajo.gob.gt

indigohedgehog dijo...

Saludos.
Hago el mismo proceso y me encuentro con el error:
{"ORA-06550: line 1, column 8:\nPLS-00306: wrong number or types of arguments in call to 'PROCEDURE1'\nORA-06550: line 1, column 8:\nPL/SQL: Statement ignored"}

El procedimiento es
PROCEDURE "PROCEDURE1" (texto OUT SYS_REFCURSOR)IS
BEGIN
OPEN texto FOR
SELECT NOMBRE FROM CAT_GRUPO;
END;

El App.config




lo ejecuto con var c = db.PROCEDURE1(); y cuando va a llamar a proc en el context.cs en el método
public virtual ObjectResult PROCEDURE1()
{
return ((IObjectContextAdapter)this).ObjectContext.ExecuteFunction("PROCEDURE1");
}

ocurre una excepción.

Alguna sugerencia?