jueves, 7 de noviembre de 2013

Creación de la Clase LienzoBDD la cual contendrá la lógica del manejo de la Base de Datos

Esta clase es de suma importancia ya que tendrá toda la lógica del acceso, actualización y lectura de nuestra Base de Datos que como se dijo constará de la tabla Usuario y Lienzo, en la cuál un Usuario puede tener varios Lienzos.

Además esta clase nos permitirá almacenar, todos los datos serializados de nuestro lienzo en el cual contendrá que tipo de figura es si es un cuadrado, círculo o una línea así como sus propiedades que es color de borde, grosor, si tiene o no relleno en el caso de tenerlo que color es, las coordenadas del punto inicial y final, en fin todo lo necesario para que al momento que desea leer el lienzo pueda reconstruirse.

Además aquí consta los dos métodos que me servirán para serializar el envío de mis datos y para cuando quiera acceder el proceso contrario es decir deserializar. Esto lo hicimos con el fin de simplificar el envío y la recepción de datos.

Otra cosa muy importante esta clase va a ser la que va a heredar de MarshallByRefObject para hacerlo y poder ocupar el Remoting.

A continuación se muestra la clase antes mencionada:

public class LienzoBDD : MarshalByRefObject
    {
        // Defino un String estático para la conexión de la base de datos    
        public static string cadenaConexion = "Data Source=Cristian-PC;Initial Catalog=Paint_Proyecto;Integrated Security=True";

        // Método ObtenerCliente que me permitirá obtener el Cliente mediante el idCliente en el formulario LoginUsuario
        public int ObtenerCliente(string idCliente, string nombreCliente)
        {
            //int dato = Convert.ToInt32(idCliente.ToString());
            // Uso en un string la sentencia De SQL para la búsqueda del Cliente mediante
            // el ID
            string sentenciaSql = "SELECT COUNT (*) from Usuario";
            sentenciaSql += " WHERE contrasenia=" +"'"+idCliente+"'";
            sentenciaSql += " AND usuario="+"'"+nombreCliente+"'";
            //MessageBox.Show(sentenciaSql);
            // Hago la conexión a la base de Datos la cual le paso la cadena de consulta
            // y la conexión
            SqlConnection conexion = new SqlConnection(cadenaConexion);
            SqlCommand comando = new SqlCommand(sentenciaSql, conexion);
            // Creo un Cliente con los datos, y le inicializamos como nulo
            /*string usuarioNombre = null;
            string contrasenia = null;
            string[] cliente = new string[2];*/
            int i = 0;
            // Captura de Excepciones
            try
            {
                // Abro la conexión
                conexion.Open();
                // Creo un SqlReader para leer las filas y lo inicio en null
                //SqlDataReader leer = null;
                // Asigno a la variable el leer que lo que la ejecución de la consulta realizada
                //leer = comando.ExecuteNonQuery;
                
                i = (Int32)comando.ExecuteScalar();
                // Si me leyó la conslta enviada
                /*if (leer.Read())
                {
                    // Creo un nuevo ClienteDetalle con los campos clienteID, NombreCompleto
                    // Contraseña y Correo
                    usuarioNombre = leer["usuario"].ToString().Trim();
                    contrasenia = leer["contrasenia"].ToString().Trim();
                    cliente[0] = usuarioNombre;
                    cliente[1] = contrasenia;
                }*/
            }
            // Captura de la excepción del tipo SQL
            catch (SqlException e)
            {
                //MessageBox.Show(e.ToString());
                // Defino a cliente como null
                i = 0;
            }
            // Esto pasará ocurra o no la excepción
            finally
            {
                // Cierro la conexión
                conexion.Close();
            }
            
            // Me retorna un cliente
            return i;
        }

        // Método ObtenerCliente que me permitirá obtener el Cliente mediante el idCliente en el formulario LoginUsuario
        public List<string> ObtenerLienzos(string idCliente)
        {
            //int dato = Convert.ToInt32(idCliente.ToString());
            // Uso en un string la sentencia De SQL para la búsqueda del Cliente mediante
            // el ID
            string sentenciaSql = "SELECT nombreLienzo from Lienzo";
            sentenciaSql += " WHERE contrasenia=" + "'" + idCliente + "'";

            // Hago la conexión a la base de Datos la cual le paso la cadena de consulta
            // y la conexión
            SqlConnection conexion = new SqlConnection(cadenaConexion);
            SqlCommand comando = new SqlCommand(sentenciaSql, conexion);
            // Creo un Cliente con los datos, y le inicializamos como nulo
            List<string> lienzos = new List<string>();
            // Captura de Excepciones
            try
            {
                // Abro la conexión
                conexion.Open();
                // Creo un SqlReader para leer las filas y lo inicio en null
                SqlDataReader leer = null;
                // Asigno a la variable el leer que lo que la ejecución de la consulta realizada
                leer = comando.ExecuteReader();
                // Si me leyó la conslta enviada
                while (leer.Read())
                {
                    // Creo un nuevo ClienteDetalle con los campos clienteID, NombreCompleto
                    // Contraseña y Correo
                    lienzos.Add(leer["nombreLienzo"].ToString().Trim());
                }
            }
            // Captura de la excepción del tipo SQL
            catch (SqlException)
            {
                // Defino a cliente como null
                lienzos = null;
            }
            // Esto pasará ocurra o no la excepción
            finally
            {
                // Cierro la conexión
                conexion.Close();
            }

            // Me retorna un cliente
            return lienzos;
        }
        // Método para Agregar un Cliente que toma por argumentos un objeto ClienteDetalle
        public int AgregarCliente(string clienteNombre, string contrasenia)
        {
            // Ingreso la sentencia para realizar la inserción de un usuario en la base de datos
            // Mediate sentencias SQL
            string sentenciaSql = "INSERT INTO Usuario ";
            sentenciaSql += "(usuario, contrasenia) VALUES ('";
            // Añado el Nombre
            sentenciaSql += clienteNombre + "', '";
            // Añado el Password
            sentenciaSql += contrasenia + "')";
            // Esto hago para que me realice la conexión a la Base de Datos y me pueda actualizar
            // Para ello llamo al método EjecutarSentencias
            return EjecutarSentencia(sentenciaSql);
        }


        public int AgregarLienzo(string nombreLienzo, string contrasenia, List<Figura> objetos)
        {
            // Ingreso la sentencia para realizar la inserción de un usuario en la base de datos
            // Mediate sentencias SQL
            byte[] datos = Serializar(objetos);
            string parametro = BitConverter.ToString(datos);
            string sentenciaSql = "INSERT INTO Lienzo";
            sentenciaSql += "(nombreLienzo, contrasenia, datos) VALUES ('";
            // Añado el Nombre
            sentenciaSql += nombreLienzo + "', '";
            // Añado el Password
            sentenciaSql += contrasenia + "', '";
            sentenciaSql += parametro +"')";
            // Esto hago para que me realice la conexión a la Base de Datos y me pueda actualizar
            // Para ello llamo al método EjecutarSentencias
            return EjecutarSentencia(sentenciaSql);
            
        }
        
        // Método que me permite ActualizarCliente y que me acepta como parámetro de entrada un objeto
        // ClienteDetalle
        public int ActualizarCliente(string nombreLienzo, List<Figura> objetos)
        {
            // Ingreso la sentencia para realizar la inserción de un usuario en la base de datos
            // Mediate sentencias SQL
            byte[] datos = Serializar(objetos);
            string parametro = BitConverter.ToString(datos);
            // Ingreso la sentencia para realizar la actualización de un usuario en la base de datos
            // Mediate sentencias SQL 
            string sentenciaSql = "UPDATE Lienzo SET ";
            // Modifico el Nombre del Cliente
            sentenciaSql += "datos='" + parametro + "'";
            // Para llevar el proceso de actualización lo ubico al cliente mediante el clienteId
            sentenciaSql += " WHERE nombreLienzo='" + nombreLienzo + "'";
            // Esto hago para que me realice la conexión a la Base de Datos y me pueda actualizar
            // Para ello llamo al método EjecutarSentencias
            return EjecutarSentencia(sentenciaSql);
        }

        // Método para Eliminar un Cliente o para esto ingreso el ID del cliente
        public List<Figura> ObtenerLienzo(string nombreLienzo, string contrasenia)
        {
            string sentenciaSql = "SELECT datos from Lienzo";
            sentenciaSql += " WHERE contrasenia=" + "'" + contrasenia + "'";
            sentenciaSql += " AND nombreLienzo=" + "'" + nombreLienzo + "'";

            // Hago la conexión a la base de Datos la cual le paso la cadena de consulta
            // y la conexión
            SqlConnection conexion = new SqlConnection(cadenaConexion);
            SqlCommand comando = new SqlCommand(sentenciaSql, conexion);
            // Creo un Cliente con los datos, y le inicializamos como nulo
            List<Figura> figuras = null;
            // Captura de Excepciones
            try
            {
                // Abro la conexión
                conexion.Open();
                // Creo un SqlReader para leer las filas y lo inicio en null
                SqlDataReader leer = null;
                // Asigno a la variable el leer que lo que la ejecución de la consulta realizada
                leer = comando.ExecuteReader();
                // Si me leyó la conslta enviada
                if (leer.Read())
                {
                    // Creo un nuevo ClienteDetalle con los campos clienteID, NombreCompleto
                    // Contraseña y Correo
                    string datos = leer["datos"].ToString().Trim();
                    string datosValidos = datos.Replace("-",string.Empty);
                    int numeroCaracteres = datosValidos.Length;
                    byte[] bytes = new byte[numeroCaracteres/2];
                    for (int i = 0; i < numeroCaracteres; i += 2)
                        bytes[i / 2] = Convert.ToByte(datosValidos.Substring(i, 2), 16);
                    figuras = (List<Figura>)Deserializar(bytes);

                    /*using (var sr = new StringReader(datosValidos))
                    {
                        for (int i = 0; i < datosValidos.Length; i++)
                            bytes[i] = Convert.ToByte(new string(new char[2] { (char)sr.Read(), (char)sr.Read() }), 16);
                            MessageBox.Show(bytes[1].ToString());
                    }
                    figuras = (List<Figura>)Deserializar(bytes);
                    */
                }
            }
            // Captura de la excepción del tipo SQL
            catch (SqlException)
            {
                // Defino a cliente como null
                figuras = null;
            }
            // Esto pasará ocurra o no la excepción
            finally
            {
                // Cierro la conexión
                conexion.Close();
            }

            // Me retorna un cliente
            return figuras;
        }

        // Método que me permitirá realizar la conexión a la Base de datos
        // Mediante sentencias SQL
        private int EjecutarSentencia(string sentenciaSql)
        {
            // Realizo una nueva conexion SQL mediante la cadena de conexion
            SqlConnection conexion = new SqlConnection(cadenaConexion);
            // Creo un SQL comando y le ingreso la sentencia que deseo que realice y la conexión
            SqlCommand comando = new SqlCommand(sentenciaSql, conexion);
            // Creo un a variable entera resultado y la inicializo en 0
            int resultado = 0;
            // Captura de Excepciones
            try
            {
                // Abro la conexión
                conexion.Open();
                // Asigno a resultado el número de filas afectadas por la consulta SQL
                resultado = comando.ExecuteNonQuery();
            }
            // Captura de la excepción
            catch (SqlException)
            {
                // Cuando no haya ninguna fila afectada el resultado es 0
                resultado = 0;
            }
            // Finalmente esto pasará ocurra o no la excepción
            finally
            {
                // Cierro la conexión
                conexion.Close();
            }
            // Me retorna el resultado
            return resultado;
        }
        /*
        public string ObtenerDominioActual()
        {
            // Me retorna el dominio actual
            return AppDomain.CurrentDomain.FriendlyName;
        }
        */

        // Método que me retorna un arreglo de bytes y me va a permitir serailizar todas las figuras que tengamos en nuestro
        // Lienzo
        public byte[] Serializar(List<Figura> objSerializable)
        {
            // Vamos a controlar el tiempo de vida de los objetos mediante el uso de Using y creamos una memoria de flujos
            // que me permitirá almacenar de forma binaria la inforamción de las figuras
            using (MemoryStream stream = new MemoryStream())
            {
                // Creo el formato binario para enviar de esta forma a la base de datos y poder enviar como bytes
                BinaryFormatter binario = new BinaryFormatter();
                // Serializo los datos que voy a enviar en este caso el arreglo de figuras
                binario.Serialize(stream, objSerializable);
                // Me retorna el flujo y lo convierto a un arreglo de bytes
                return stream.ToArray();
            }
        }

        // Método que me permitirá deserializar lso objetos que hemos enviado para poder regenerar la imagen(Lienzo) y poder de nuevo
        // obtener
        public object Deserializar(byte[] objDeserializable)
        {
            // Vamos a controlar el tiempo de vida de los objetos mediante el uso de Using y creamos una memoria de flujos
            // que me permitirá almacenar de forma binaria la inforamción de las figuras
            using (MemoryStream stream = new MemoryStream(objDeserializable))
            {
                // Creo el formato binario para enviar de esta forma a la base de datos y poder enviar como bytes
                BinaryFormatter binario = new BinaryFormatter();
                // Comienzo a leer desde la posicion 0 elflujo
                stream.Position = 0;
                // Me retorna todo los datos serializados
                return binario.Deserialize(stream);
            }
        }
    }


No hay comentarios:

Publicar un comentario