Un saludo.

En esta ocasión desarrollaremos un aplicativo sencillo, el cuál nos permita lograr conectar una base de datos ORACLE desde .NET, más precisamente la base de datos Oracle Express Edition.

1-) Descargar e instalar dicho motor de bases de datos aquí.

2-) En este caso veamos este ejemplo como un HelloWorld :D, por lo tanto vamos a activar un “esquema” de la base de datos, sobre el cual trabajaremos a lo largo de este post. Entonces vamos a trabajar con el esquema HR, muy conocido en el mundo de ORACLE como un starter schema, demo o como se le quiera llamar.

Para poder activar el esquema debemos seguir los siguientes pasos:

a-) Después de instalar el paquete abrimos el menú y seleccionamos la carpeta de Oracle Ex. Y abrimos la Consola de comandos.

b-) Bien ahora veamos la siguiente imagen, para ver una de las formas en que podemos lograr  la activación del esquema HR. Cuando se requiera el password de system, deberías digitar el password que ingresaste en el proceso de instalación de Oracle Express Edition.

3-) Luego de haber activado y realizado los pasos anteriores procedemos a armar la cadena de conexión. Veamos el siguiente link, allí se demuestran varias formas posibles para armar una cadena de conexión en .net para oracle, una de estas es buscar en el archivo  tnsnames.ora(El archivo se puede abrir con el notepad), en el que reciden las cadenas por default que instala la instancia de OracleEXE, veamos la imagen.

Al abrir con notepad dicho archivo. en la imagen la sección más importante a tener en cuenta es:

Photobucket

En rojo, lo que será la cadena de conexión en nuestro Web.Config o App.Config, así:

<?xml version="1.0" encoding="utf-8" ?>
<configuration>
  <connectionStrings>
    <add name="ConnectionStringUsers" connectionString="
         Data Source=
         (DESCRIPTION =
          (ADDRESS=(PROTOCOL = TCP)(HOST=Fsotelo-PC)(PORT=1521))
          (CONNECT_DATA =(SERVER = DEDICATED)(SERVICE_NAME=XE))
         );
         User Id={0};Password={1};"/>
  </connectionStrings>
</configuration>

Tengamos en cuenta que dejamos dos variables de contenido en la cadena para setear dinámicamente desde la aplicación.

4-) Luego de tener completados cada uno de estos pasos, me resta hacer entrega de una micro capa de datos creada para obtener datos con .NET Framework.

a-) Capa de acceso a datos, Connection encargado de recuperar la cadena de conexión para el ejemplo, seguramente habrá formas técnicas de optimizar este código, que permite obtener el ConnectionString, pero esto desborda el enfoque del presente post. Recordemos agregar el namespace Oracle.DataAccess.Client, que contiene lo necesario para el trabajo con datos provenientes de Oracle.


using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using Oracle.DataAccess.Client;
using System.Configuration;

namespace DAL
{
    public class Connection
    {
        private string password, user;

        public Connection()
        { }
        ///
<summary> /// Permite crear una cadena de conexión tipo Oracle
 /// </summary>
        ///
        public OracleConnection Connect()
        {
            ////////////////////////////////////////////////////////////////////////////////////
            //Referencia estática al usuario y password ingresados en el login de la aplicación/
            ////////////////////////////////////////////////////////////////////////////////////
            user = GlobalIdentity.Instance.User;
            password = GlobalIdentity.Instance.Password;

            if (string.IsNullOrEmpty(user) || string.IsNullOrEmpty(password))
                throw new Exception("El usuario y el password son datos requeridos");

            string oradb = ConfigurationManager.
ConnectionStrings["ConnectionStringUsers"].ConnectionString;
            oradb = string.Format(oradb, user, password);
            OracleConnection conn = new OracleConnection();
            conn.ConnectionString = oradb;
            return conn;
        }
    }
}

Como se ve, tenemos una instancia estática GlobalIdentity, la cual se crea a partir del patrón de diseño SINGLETON para poder hacer referencia de forma global a un usuario y su respectivo password.

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;

namespace DAL
{
    ///
<summary> /// Aplicamos el patrón de diseño singleton
 /// para tener una instancia global de usuario
 /// y password en nuestra aplicación.
 /// </summary>
    public class GlobalIdentity
    {
        private static readonly GlobalIdentity _GlobalIdentity = new GlobalIdentity();
        public string User { get; set; }
        public string Password { get; set; }
        private  GlobalIdentity(){

        }
        public static GlobalIdentity Instance
        {
            get{
                return _GlobalIdentity;
            }
        }
    }
}

En el siguiente fragmente podemos ver entre muchas una forma posible de impactar bases de datos tipo oracle

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using Oracle.DataAccess.Client;
using Oracle.DataAccess.Types;
using System.Data;

namespace DAL
{
    public class Departments
    {
        public Departments() { }
        ///
<summary> /// Selecciona todos los departamentos de HR
 /// </summary>
        /// DataTable
        public DataTable GetAllDepartments()
        {
            Connection c = new Connection();

            using (OracleConnection conn = c.Connect())
            {
                List LDptos = new List();
                string sqlQuery = "select * from departments";
                OracleCommand cmd = new OracleCommand(sqlQuery, conn);
                cmd.CommandType = CommandType.Text;
                DataTable dt = new DataTable();
                OracleDataAdapter da = new OracleDataAdapter(cmd);
                try
                {
                    conn.Open();
                    da.Fill(dt);
                    return dt;
                }
                catch (Exception ex)
                {
                    throw ex;
                }
            }
        }
    }
}

En el siguiente fragmento vemos los procesos necesarios para vincular los datos con un DataGridView utilizado para la Demo

using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Windows.Forms;
using Oracle.DataAccess.Client;
using DAL;

namespace WForms_ORACLE1
{
    public partial class Form1 : Form
    {
        public Form1()
        {
            InitializeComponent();
            Load += new EventHandler(Form1_Load);
        }

        void Form1_Load(object sender, EventArgs e)
        {
            Departments departamentos = new Departments();
            DataTable misDptos = new DataTable();
            try
            {
               misDptos = departamentos.GetAllDepartments();
            }
            catch (Exception ex)
            {
                MessageBox.Show(ex.Message);
                this.Close();
            }

            dataGridView1.DataSource = misDptos;
        }
    }
}

Veamos la imagen de este formulario en vista diseño.

Por último veamos lo que sería la interfaz de login del usuario. El cual no se propone como modelo a seguir, solo para efectos prácticos del ejemplo, debido a la falta de un algoritmo de cifrado de datos.

using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Windows.Forms;
using DAL;

namespace WForms_ORACLE1
{
    public partial class LogIn : Form
    {
        public LogIn()
        {
            InitializeComponent();
        }

        private void button1_Click(object sender, EventArgs e)
        {
             //Creación de instancias estáticas para el user y password
            GlobalIdentity.Instance.User = textBox1.Text;
            GlobalIdentity.Instance.Password = textBox2.Text;
            Form1 fData = new Form1();
            fData.Show();
        }
    }
}

Veamos la imagen:

Así luciría:

Por último un saludo, y feliz coding!

Código Aquí.

Anuncios