Foros del Web » Programación para mayores de 30 ;) » .NET »

Clase para conectar a mysql

Estas en el tema de Clase para conectar a mysql en el foro de .NET en Foros del Web. Buenas, estoy intentando crear una clase para conectar a mysql pero no me funciona. Uso visual studio 2008 y mysql net connector. yo apenas abro ...
  #1 (permalink)  
Antiguo 15/07/2009, 13:15
 
Fecha de Ingreso: junio-2008
Mensajes: 51
Antigüedad: 15 años, 11 meses
Puntos: 0
Clase para conectar a mysql

Buenas, estoy intentando crear una clase para conectar a mysql pero no me funciona. Uso visual studio 2008 y mysql net connector.

yo apenas abro la aplicacion quiero abrir la conexion y luego ejecutar sentencias del tipo insert.
lo que hice fue crear esta clase :
Código:
public class MYSQL
    {
        private string Server;
        private string Database;
        private string Usuario;
        private string Pass;
        private string sentencia;
        public MySqlConnection Conexion;
        
        public bool exito;

        public MYSQL(string server, string database, string usuario, string pass)
        {
            Server = server;
            Database = database;
            Usuario = usuario;
            Pass = pass;
            sentencia = "SERVER=" + server + ";" + "DATABASE=" + database + ";" + "UID=" + usuario + ";" + "PASSWORD=" + pass + ";";
            MySqlConnection Conexion = new MySqlConnection(sentencia);   
            try
            {
                Conexion.Open();
                exito = true;
            }
            catch (Exception e)
            {
            MessageBox.Show(e.Message);
            }
        }
        public void Comando(string cmdString)
        {
            MySqlCommand comando = new MySqlCommand(cmdString, Conexion);
            comando.ExecuteNonQuery();

        }


    }
y luego en el programa principal puse esto:


Código:

    static class Program
    {

        /// <summary>
        /// Punto de entrada principal para la aplicación.
        /// </summary>
        // [STAThread]

        public static MYSQL hpumpSQL = new MYSQL("localhost", "hpump", "user", "xxx"); 
        
        static void Main()
        {
            if (hpumpSQL.exito == true)
            {
                Application.EnableVisualStyles();
                Application.SetCompatibleTextRenderingDefault(false);
                Application.Run(new Form1());
            }
        }

    }

y luego dentro del Winform intento ejecutar esto cuando el usuario hace un clic:

Código:
        private void button1_Click_1(object sender, EventArgs e)
        {
            Program.hpumpSQL.Comando("insert into surtidores set numero = 222;");

        }

la verdad le estuve dando vueltas al asunto y no entiendo por que no funciona. cuando hago el debug me tira " Connection must be valid and open".
pero yo en el constructor de la clase MYSQL estoy abriendo la conexion, aparte el winform lo abre perfecto, eso quiere decir que la conexion se pudo abrir, sino me hubiese tirado una exepcion.
Gracias
  #2 (permalink)  
Antiguo 15/07/2009, 15:31
Avatar de Dradi7  
Fecha de Ingreso: junio-2008
Ubicación: Peru - Lima
Mensajes: 1.518
Antigüedad: 15 años, 11 meses
Puntos: 220
Respuesta: Clase para conectar a mysql

Primero porque creas la conexion al ejecutar tu aplicacion en C#

Segundo la conexion siempre no va hacer utilizada solamente abrirla y cerrarla por cada transaccion o operacion que vas a realizar a tu base de datos

Tercero tu clase no esta tan bien implementada pero lo podrias mejorar por supuesto

Bueno aqui la solucion a tu problema

en tu procedimiento

Código C#:
Ver original
  1. public void Comando(string cmdString)
  2.         {
  3.             MySqlCommand comando = new MySqlCommand(cmdString, Conexion);
  4.             comando.ExecuteNonQuery();
  5.  
  6.         }

cambialo por

Código C#:
Ver original
  1. public void Comando(string cmdString)
  2.         {
  3.             MYSQL("localhost", "hpump", "user", "xxx");
  4.             MySqlCommand comando = new MySqlCommand(cmdString, Conexion);
  5.             comando.ExecuteNonQuery();
  6.             Conexion.Close();
  7.  
  8.         }

y quita la conexion que utilizas al iniciar la aplicacion
__________________
La clave de todo triunfador es eliminar todas sus excusas y sus limitaciones
  #3 (permalink)  
Antiguo 15/07/2009, 19:58
 
Fecha de Ingreso: junio-2008
Mensajes: 51
Antigüedad: 15 años, 11 meses
Puntos: 0
Respuesta: Clase para conectar a mysql

Buenas
la conexion la creo al principio por que si no se puede conectar a la base de datos, el programa es inutil. entonces si no se puede iniciar la conexion, directamente que se cierre el programa.
Pregunta: Yo tengo que hacer crear una conexion por cada sentencia que quiero ejecutar?

Ah, y el codigo que me pasaste no me deja compilar :S
intercambie lo que me dijiste y me tira esto:

Error 1 'WindowsFormsApplication1.MYSQL' es 'tipo' pero se utiliza como 'variable' y me subraya la linea: MYSQL("localhost", "hpump", "user", "xxx");

PD: perdon por mi ignorancia, recien estoy aprendiendo c#
  #4 (permalink)  
Antiguo 15/07/2009, 20:08
Avatar de Dradi7  
Fecha de Ingreso: junio-2008
Ubicación: Peru - Lima
Mensajes: 1.518
Antigüedad: 15 años, 11 meses
Puntos: 220
Respuesta: Clase para conectar a mysql

el problema es que has creado un constructor en tu clase en donde generas la conexion lo mejor es que pongas ese codigo aparte en otro procedimiento y llamarlo en tu procedimiento comando
__________________
La clave de todo triunfador es eliminar todas sus excusas y sus limitaciones
  #5 (permalink)  
Antiguo 15/07/2009, 20:23
 
Fecha de Ingreso: junio-2008
Mensajes: 51
Antigüedad: 15 años, 11 meses
Puntos: 0
Respuesta: Clase para conectar a mysql

No, tampoco funciona de esa forma.
igual gracias

Saludos
  #6 (permalink)  
Antiguo 15/07/2009, 21:03
Avatar de dwaks  
Fecha de Ingreso: agosto-2002
Ubicación: Panamá
Mensajes: 962
Antigüedad: 21 años, 9 meses
Puntos: 15
Respuesta: Clase para conectar a mysql

Ok veamos todo desde el principio:

1- Quieres tener una clase donde manejes los comando Insert, Select, Update y Delete con solo mandarle por parametro al método adecuado el query.
2- Quieres que internamente se controle la conección activa.

Ahora vienen las preguntas:
1- Supongo que es un Windows Application porque quieres abrir la conección en el Form_Load y mantenerla abierta en todo tu programa hasta que salgas??
2- Quieres despreocuparte de la conección y no quieres abrirla y cerrarla por cada query que ejecutes??
3- Tienes conocimiento de clases globales singleton?? que son las que se instancian una sola vez y estara activa para todo el proyecto?

Sin tomar en cuentas las preguntas que te puse debes tomar en cuenta varios elementos necesarios:

1- No puedes abrir en el constructor con una instancia local una coneccion y pensar que pasará a los métodos:

MySqlConnection Conexion = new MySqlConnection(sentencia);

Lo correcto es que uses una propiedad que represente la conección para que los métodos internos la puedan usar.

public MysqlConnection Conexion {get; set;}

Esta propiedad la instancia en tu constructor:

this.Conexion = new MySqlConnection(sentencia);
this.Conexion.Open();

2- En programas web lo mejor es abrir y cerrar conección cada ves que quieras traer ó enviar datos a la base de datos pero en Windows puedes tener una conección activa y cerrarla cuando el programa se cierre. Para esto es necesario que tengas una clase Global que todo tu proyecto lo accese, esta clase debe dar acceso a tu clase MYSQL. Debes tener en cuenta como se hace esto.

Puedes ver en este post como explico el uso de clases globales:
http://www.forosdelweb.com/f79/usar-...-forms-717130/

3- La conección a la base de datos es el punto importante de tu proyecto y aunque paresca mucho trabajo en cada método debes validar el estado de la conección aunque ya en el Constructor la abriste, esto es para que evites fallos y debes tomar en cuenta todos los Status que ella te brinde para saber siempre como esta la conección y el programa no te de fallo.

MysqlConnection.Status

4- Trata de hacer todo paso a paso, primero tu clase que tenga la Propiedad que represente la Conección y que se instancia y se abra en el constructor. Luego has el método para un select que reciba un parámetro string de el query que le mandes dinamicamente.

Con esto ya puedes saber que te funciona.

Despues create la clase que será la global y expondrá una instancia static de tu clase MYSQL como esta en el post que te di como referencia.

Trata de hacer todo paso a paso y veras resultados.

Saludos,
  #7 (permalink)  
Antiguo 15/07/2009, 23:24
Avatar de Dradi7  
Fecha de Ingreso: junio-2008
Ubicación: Peru - Lima
Mensajes: 1.518
Antigüedad: 15 años, 11 meses
Puntos: 220
Respuesta: Clase para conectar a mysql

Intenta realizar o probar este codigo digamos que la clase se llama ClsMySql

Código C#:
Ver original
  1. public static  MySqlConnection Con;
  2. public static  MySqlCommand Com;
  3. public static  MysqlDataAdapter Adp;
  4. public static  Dataset Datos;
  5.  
  6. // Procedimiento Para Conectarme a la Bd de MySQL
  7. public static void ConexionMySQL()
  8. {
  9.     try {
  10.         Con = new MysqlConnection();
  11.         Con.ConnectionString = "server=localhost; user id=root; password=123456; database=datos";
  12.         if (Con.state == ConnectionState.Closed)Con.Open();
  13.     }
  14.     catch (Exception ex) {
  15.         MessageBox.Show(ex.message);
  16.     }
  17. }
  18. // Procedimiento para Ejecutar una Consulta sin devolver ningun valor
  19. public static void Ejecutar(string CadMySql)
  20. {
  21.     try {
  22.         ConexionMySQL();
  23.         Com = new MySqlCommand(CadMySql, Con);
  24.         Com.ExecuteNonQuery();
  25.          if (Con.state == 1) Con.Close();
  26.     }
  27.     catch (Exception ex) {
  28.         MessageBox.Show(ex.message);
  29.     }
  30.     finally {
  31.         Com.Dispose();
  32.     }
  33. }
  34.  
  35. // Procedimiento para Ejecutar una Consulta devolviendo Datos
  36. public static DataTable Mostrar(string CadMySql)
  37. {
  38.     try {
  39.         ConexionMySQL();
  40.         Adp = new MySqlDataAdapter(CadMySql, Con);
  41.         Datos = new DataSet();
  42.         Adp.fill(Datos, "x");
  43.         if (Con.state == 1) Con.Close();
  44.     }
  45.     catch (Exception ex) {
  46.         MessageBox.Show(ex.message);
  47.     }
  48.     finally {
  49.         Adp.Dispose();
  50.     }
  51.     return Datos.Tables("x");
  52. }

La forma de Implementarlo en tus winforms por ejemplo es asi:

Código C#:
Ver original
  1. ClsMySql.Mostrar("CadSQL");
  2. ClsMySq.Ejecutar("CadSQL")
__________________
La clave de todo triunfador es eliminar todas sus excusas y sus limitaciones
  #8 (permalink)  
Antiguo 17/07/2009, 12:10
 
Fecha de Ingreso: junio-2008
Mensajes: 51
Antigüedad: 15 años, 11 meses
Puntos: 0
Respuesta: Clase para conectar a mysql

Muchas gracias por la ayuda, ya lo pude solucionar.
lo que hice fue hacer esto:

primero cree una clase publica abstracta:

Código:
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using MySql.Data.MySqlClient;
using MySql.Data.Types;

namespace WindowsFormsApplication1
{

    public abstract class Class1
    {

        public static MySqlConnection connection()

      {

          MySqlConnection con = new MySqlConnection("SERVER=localhost;DATABASE=hpump;UID=root;PASSWORD=hpump;");

 

         return con;

      }
    }
}
Despues la instancie en la otra clase MYSQL
Código:
        public class MYSQL
        {
            public MySqlConnection Conexion;

            public bool exito;

            public MYSQL()
            {
                Conexion = Class1.connection();
                try
                {
                    Conexion.Open();
                    exito = true;
                }
                catch (Exception e)
                {
                    MessageBox.Show("error al conectar a base de datos\n" + e.Message);
                }
    
            }
        }

y luego en el programa principal puse esto:
Código:
    static class Program
    {
        public static MYSQL con = new MYSQL(); 

        // [STAThread]
       
        
        static void Main()
        {
            if (con.exito == true)
            {
                Application.EnableVisualStyles();
                Application.SetCompatibleTextRenderingDefault(false);
                Application.Run(new Form1());
            }
        }
Asi funciona, despues tengo que mejorarlo obviamente, para validar si la conexion esta abierta y agregar la funcion para el comando, pero por el momento funciona ;)


Saludos!
  #9 (permalink)  
Antiguo 17/07/2009, 12:42
Avatar de Dradi7  
Fecha de Ingreso: junio-2008
Ubicación: Peru - Lima
Mensajes: 1.518
Antigüedad: 15 años, 11 meses
Puntos: 220
Respuesta: Clase para conectar a mysql

pero porque necesariamente tiene que estar abierta la conexion de la Base de Datos al momento de abrir la aplicacion hasta que termine ???
__________________
La clave de todo triunfador es eliminar todas sus excusas y sus limitaciones
  #10 (permalink)  
Antiguo 17/07/2009, 13:06
 
Fecha de Ingreso: junio-2008
Mensajes: 51
Antigüedad: 15 años, 11 meses
Puntos: 0
Respuesta: Clase para conectar a mysql

Por que la aplicacion es un wizzard de configuracion, y lo unico que hace es preguntarle al usuario datos, y hace muchos inserts.
  #11 (permalink)  
Antiguo 17/07/2009, 13:14
Avatar de Dradi7  
Fecha de Ingreso: junio-2008
Ubicación: Peru - Lima
Mensajes: 1.518
Antigüedad: 15 años, 11 meses
Puntos: 220
Respuesta: Clase para conectar a mysql

ok ps no es recomendable usar la conexion abierta durante todo el proyecto ya que solamente va a hacer utilizada por cada transaccion o consulta sql
__________________
La clave de todo triunfador es eliminar todas sus excusas y sus limitaciones
  #12 (permalink)  
Antiguo 17/07/2009, 14:52
Avatar de dwaks  
Fecha de Ingreso: agosto-2002
Ubicación: Panamá
Mensajes: 962
Antigüedad: 21 años, 9 meses
Puntos: 15
Respuesta: Clase para conectar a mysql

Expondré varios puntos con respecto a la conección a la base de datos, porque mantener la conección abierta no es algo que no se debe hacer, todo depende de donde se implementará y como:

1- Si tienes un sitio web que cada página conecta a la base de datos directamente lo mejor es cerrar cada conección porque se crearán muchas. Mientras más gente visite más conecciones se abrirán.

2- Si tienes un programa Call center que lo usan mil computadoras lo mejor es que cada coneccion se cierre igual.

----------------

Al final los 2 métodos de arriba si no se sabe realmente cuantas conecciones se abrira terminará todo con un cuello de botella (bottleneck) con la base de datos. Los bottleneck es la causa de muchos errores que nadie sabe porque al menos que consigas a una persona con mucha experiencia y que viendo la arquitectura usada en el programa determine que existe.

Aquí entrán en juego la arquitectura N-Tier donde uno divide cada nivel de el programa dandole responsabilidades a modulos especificos en su nivel. Muchos ejemplos de estos los ves cuando un sitio tiene una arquitectura así:

Web asp.net - WebServices - DataBase

Aquí el Asp.Net Web no conecta a la base de datos, y si entran mil usuarios haciendo procesos siempre se comunican es con el WebServices, pero dirán el WebService por cada solicitud de datos se conecta a la base de datos lo que igualmente nos regresa atras no? La respuesta es que no regresa atras, ya dividido este asunto uno puede implementar el WebServices de muchas formas, la más comun es usando IIS y para darle menos carga a la base de datos se puede usar Cache de la información que no se actualize siempre.

En mi parte cuando tengo muchisimas visitas siempre trato en la arquitectura de el software de ver que requiere siempre la informacion al día y que no, lo que no requiere estar al idea lo mantengo en cache y elimine llamados a la base de datos siempre. Lo que necesita llamado continuo de informacion nueva entonces me quedara usar abrir y cerrar coneccion, o pongo WebServices que sea servido desde un Windows Services donde controlo que siempre mantengo 1 sola coneccion activa y la carga lo trabajo por transacciones.

Son muchas cosas que entran en juego pero todo se resuelve en base a una buena arquitectura que es allí donde se podrá tener un panorama claro de que se debe hacer tomando en cuenta las mejores practicas para los diferentes casos de uso.

Saludos,
  #13 (permalink)  
Antiguo 17/07/2009, 17:33
 
Fecha de Ingreso: junio-2008
Mensajes: 51
Antigüedad: 15 años, 11 meses
Puntos: 0
Respuesta: Clase para conectar a mysql

Si yo dejo una conexion abierta y hago muchas transacciones se puede llegar a saturar la conexion?
Si es asi, por que si la cierro y la abro cada vez no se satura?
  #14 (permalink)  
Antiguo 17/07/2009, 20:22
Avatar de dwaks  
Fecha de Ingreso: agosto-2002
Ubicación: Panamá
Mensajes: 962
Antigüedad: 21 años, 9 meses
Puntos: 15
Respuesta: Clase para conectar a mysql

De verdad conocer a fondo como maneja el ADO.NET las conecciones dará una gran ventaja a todos nosotros porque nos hará mejor.

Los invito a todos pero a todos que lean este artículo que explica el porqué siempre se debe conciderar cerrar la conección como buena costumbre.

http://www.dotnetpanama.com/dotnetpa...-de-datos.aspx

Solo leanlo en menos de 5 minutos sus dudas serán resueltas.

Saludos,
Atención: Estás leyendo un tema que no tiene actividad desde hace más de 6 MESES, te recomendamos abrir un Nuevo tema en lugar de responder al actual.
Respuesta




La zona horaria es GMT -6. Ahora son las 17:03.