lunes, 21 de marzo de 2016

[C#] Una pequeña clase para conectar con MYSQL


Vamos a explicar el proceso de conexión a una base de datos Mysql con ayuda de una pequeña clase ya diseñada, que nos ayuda a gestionar las conexiones. Esta compuesta por 7 métodos que mas o menos cumplen las funciones basicas. 



Explicare una manera sencilla de implementarla. 

Lo primero que tenemos que hacer es para trabajar con Mysql tenemos que tener instalado el conector .Net el cual lo podemos descargar desde la siguiente dirección: 


Una vez instalado, podemos crear un proyecto como Windows Form, abrimos Visual Studio y añadimos las referencias que necesitaremos para trabajar con MYSQL, en este caso usaremos unicamente el conector Mysql.data. Para poder agregarlo le damos clic derecho en el proyecto y escogemos la opción de agregar referencia  


 Una vez que agregamos la referencia, agregamos la clase la cual puedes descargar desde el repositorio de GitHub que pongo en la parte de abajo del Post, la clase esta compuesta por el siguiente código: 


using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Data;
using MySql.Data.MySqlClient;
using System.Configuration;


namespace BackEndMysql.Controller
{


    /// 
    /// Clase para el manejo de las conexiones con Mysql
    /// Author: Cobymotion
    /// 
    public class ManageConnection
    {
        //variables de para la conexion 
        protected string ConnectionStringLocal;
        protected MySqlConnection SQLConexion;

        /// 
        /// Permite inicializar de las configuraciones la cadena de conexion y genera una conexion nueva 
        ///          
        public ManageConnection()
        {
            try
            {
                ConnectionStringLocal = ConfigurationManager.ConnectionStrings["ServerDb"].ConnectionString;
                //MySqlConnection SQLConexion = default(MySqlConnection);                
            }
            catch (Exception e)
            {
                Configuration config = ConfigurationManager.OpenExeConfiguration(ConfigurationUserLevel.None);
                ConnectionStringLocal = config.ConnectionStrings.ConnectionStrings["ServerDb"].ConnectionString.ToString();
                Console.WriteLine(e.ToString());
            }
            SQLConexion = new MySqlConnection(ConnectionStringLocal);
        }

        /// 
        /// Valida que se abra la conexion y la mantiene abierta
        /// 
        private void openConexion()
        {
            try
            {
                if (SQLConexion.State == ConnectionState.Closed)
                    SQLConexion.Open();
            }
            catch (MySqlException ex)
            {
                Console.WriteLine("Ocurrio un error  " + ex);
                closeConexion();
            }
        }

        /// 
        /// Cierra la conexion que se vaya a generar. 
        /// 
        protected void closeConexion()
        {
            if (SQLConexion.State == ConnectionState.Open)
            {
                SQLConexion.Close();
                SQLConexion.Dispose();
            }
        }

        /// 
        /// Metodo utilizado para ejecutar sentencias de SQL que tienen que ver con ingresar, 
        /// modificar o borrar
        /// 
        /// Sentencia de SQL completa que se quiere ejecutar
        /// Numero de parametros que se necesitan para utilizar
        /// Regresa verdadero si no ocurre ninguna exception 
        protected bool executeQueryUpdate(string sentencia, List parametros)
        {
            bool accept = true;
            openConexion();
            try
            {
                MySqlCommand comando = new MySqlCommand();
                comando.CommandText = sentencia;
                comando.CommandType = CommandType.Text;
                comando.Connection = SQLConexion;
                foreach (MySqlParameter parametro in parametros)
                    comando.Parameters.Add(parametro);
                comando.ExecuteNonQuery();
                accept = true; 
            }
            catch (MySqlException e)
            {
                accept = false;
                Console.WriteLine("Error al tratar de ingresar al archivo");
                Console.WriteLine("Codigo error: " + e.ToString());
            }
            finally
            {
                closeConexion();
            }
            return accept; 
        }

        /// 
        /// Metodo utilizado para ejecutar procedimientos almacenados de SQL que tienen que ver con ingresar, 
        /// modificar o borrar
        /// 
        /// Sentencia de SQL completa que se quiere ejecutar
        /// Numero de parametros que se necesitan para utilizar
        /// Regresa verdadero si no ocurre ninguna exception 
        protected bool executeStoredProcedureUpdate(string nombreProcedimiento, List parametros)
        {
            bool accept = true;
            openConexion();
            try
            {
                MySqlCommand comando = new MySqlCommand();
                comando.CommandText = nombreProcedimiento;
                comando.CommandType = CommandType.StoredProcedure;
                comando.Connection = SQLConexion;
                foreach (MySqlParameter parametro in parametros)
                    comando.Parameters.Add(parametro);
                comando.ExecuteNonQuery();
                accept = true;
            }
            catch (MySqlException e)
            {
                accept = false;
                Console.WriteLine("Error al tratar de ingresar al archivo");
                Console.WriteLine("Codigo error: " + e.ToString());
            }
            finally
            {
                closeConexion();
            }
            return accept;
        }

        /// 
        /// Metodo principal para acceso a la base de datos retorna un reader mediante un procedimiento almacenado
        /// 
        /// 
        /// 
        /// MysqlDataReader
        protected MySqlDataReader buscaRegistroStoredProcedure(string nombreProcedimiento, List parametros)
        {
            MySqlDataReader reader;
            try
            {
                openConexion();
                MySqlCommand sqlComando = new MySqlCommand();
                sqlComando.CommandText = nombreProcedimiento;
                sqlComando.CommandType = CommandType.StoredProcedure;
                sqlComando.Connection = SQLConexion;
                foreach (MySqlParameter parametro in parametros)
                    sqlComando.Parameters.Add(parametro);
                reader = sqlComando.ExecuteReader();
            }
            catch (MySqlException ex)
            {
                Console.Write("ocurrio un error al leer " + ex);
                reader = null;
                closeConexion();
            }
            return reader;
        }

        /// 
        /// Permite tener acceso a la base de datos mediante una sentencia SLQ y regresa un Reader con los datos
        /// 
        /// 
        /// 
        /// MysqlDataReader

        protected MySqlDataReader buscaRegistroSQL(string sentencia, List parametros)
        {
            MySqlDataReader reader;
            try
            {
                openConexion();
                MySqlCommand sqlComando = new MySqlCommand();
                sqlComando.CommandText = sentencia;
                sqlComando.CommandType = CommandType.Text;
                sqlComando.Connection = SQLConexion;
                foreach (MySqlParameter parametro in parametros)
                    sqlComando.Parameters.Add(parametro);
                reader = sqlComando.ExecuteReader();
            }
            catch (MySqlException ex)
            {
                Console.Write("ocurrio un error al leer " + ex);
                reader = null;
                closeConexion();
            }
          
            return reader;
        }

        /// 
        /// metodo que toma una sentencia SQL y la ejecuta para que pueda traer una tabla del dataset 
        /// Lo utilizo para meterlo en los grid o en los combos       
        /// 
        /// 
        /// 
        /// 
        protected DataTable getListSentenciaSQL(String sentencia, List parametros)
        {
            DataSet miDataSet = new DataSet();
            bool ban = false;
            try
            {
                openConexion();
                MySqlCommand sqlComando = new MySqlCommand();
                sqlComando.CommandText = sentencia;
                sqlComando.CommandType = CommandType.Text;
                sqlComando.Connection = SQLConexion;
                foreach (MySqlParameter parametro in parametros)
                    sqlComando.Parameters.Add(parametro);
                MySqlDataAdapter myAdap = new MySqlDataAdapter(sqlComando);
                myAdap.Fill(miDataSet, "permitidos");
                sqlComando.Dispose();
                ban = true;
            }
            catch (MySqlException ex)
            { Console.Write(ex); }
            finally
            { closeConexion(); }
            if (ban)
                return miDataSet.Tables[0];
            else
                return null;
        }

    }
}


Una vez generada buscara en tu App.config de tu proyecto la variable ServerDb ques es la información que tiene que ver con la conexión y los datos de tu servidor. Esto lo puedes hacer directamente en el asistente, dando clic derecho en el proyecto, ir a la opción de propiedades y por ultimo dirigirnos a la opcion de settings, estando ahí puedes agregar una cadena de conexión que gracias al conector el asistente te guiara.


Una  vez que tengan la configuración púedes checar en el archivo app.config que tengas algo como esto, si es que te antecede el nombre de tu proyecto solo quitalo. Tendras algo como esto: 

     


Una vez que tengas esa configuración ya solo tienes que utilizar la clase en este caso supongamos que guardar los registros del cliente crearemos una clase como esta, y crearemos el metodo para utilizar dicha clase y simplemente vemos que es muy simple el trabajo con la clase . Note que heredamos al controlador del cliente la clase que maneja la conexión con esto solo tendremos que armar la sentencia o nombre del procedimiento que queramos ejecutar, agregar a una lista de parametros que necesitara la sentencia y solo mandarla a llamar


   
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using MySql.Data.MySqlClient;
using System.Data;

namespace BackEndMysql.Controller
{
    /// Heradamos para tener las conexión activa
    public class CtrlClientes:ManageConnection
    {
        /// 
        /// Metodo para buscar los registros de los articulos
        /// 
        /// retorna una tabla variable
        public DataTable FindAllResumen()
        {
            //sentencia que se ejecutara 
            String sentencia = "SELECT * FROM resumencliente";
            //Lista de parametros, si no se necesitan solo mandamos el elemento sin datos
            List parametros = new List();
           // mandamos llamar el evento de obtener lista a partir de sentencia y ya tendremos un DataTable con los datos
            DataTable tabla = getListSentenciaSQL(sentencia, parametros);
            return tabla;
        }


        /// 
        /// Metodo para agregar los clientes 
        /// 
        /// 
        /// 
        /// 
        /// 
        public bool addCliente(Cliente clienteDatos, int idusuario, string descripcion)
        {
            //El nombre del procedimiento 
            String procedimiento = "addcliente";
            //La lista de los parametros y el agregado de cada uno de ellos 
            List parametros = new List();
            parametros.Add(new MySqlParameter("@pnombre", clienteDatos.Cliente1.Nombre));
            parametros.Add(new MySqlParameter("@pdireccion", clienteDatos.Cliente1.Direccion));
            parametros.Add(new MySqlParameter("@ppoblacion", clienteDatos.Cliente1.Poblacion));
            parametros.Add(new MySqlParameter("@ptelefono", clienteDatos.Cliente1.Telefono));
            parametros.Add(new MySqlParameter("@pife", clienteDatos.Cliente1.Noife));
            parametros.Add(new MySqlParameter("@pidaval", clienteDatos.Aval.Idpersona));
            parametros.Add(new MySqlParameter("@plimite", clienteDatos.LimiteCredito));
            parametros.Add(new MySqlParameter("@pidusuario", idusuario));
            parametros.Add(new MySqlParameter("@pdescripcionmov", descripcion));
            Ejecución de la sentencia. 
            bool res = executeStoredProcedureUpdate(procedimiento, parametros);
            return res;
        }


       
    }
}


https://github.com/cobymotion/MysqlCSharp/


No hay comentarios:

Publicar un comentario