sql >> Base de Datos >  >> RDS >> Mysql

¿La conexión a la base de datos en esta clase es reutilizable?

El problema al que te enfrentas es que te has codificado a ti mismo en una esquina de "nueva conexión por acción". A lo que realmente quiere apuntar, y se considera una mejor práctica, es "nueva conexión por lote de acciones".

Lo que recomiendo en este caso es abrir la conexión cuando sea necesario y cerrarla cuando se deseche. Lo que haremos será mover los adaptadores odbc a una variable de mayor alcance para que se pueda acceder a ella dentro de la clase.

namespace databaseFunctions
{
    public class databaseConnection:IDisposable
    {
        private OdbcConnection con;
        private string connectionString;

        public databaseConnection(string connectionString){
            this.connectionString = connectionString;
        }


        public void OpenConnection(){
            if (con == null || con.IsClosed ){ // we make sure we're only opening connection once.
                con = new OdbcConnection(this.connectionString);
            }
        }
        public void CloseConnection(){
            if (con != null && con.IsOpen){ // I'm making stuff up here
                con.Close();
            }
        }

        public DataTable getFromDatabase(string SQL)
        {
            OpenConnection();

            DataTable rt = new DataTable();
            DataSet ds = new DataSet();
            OdbcCommand cmd = new OdbcCommand(SQL, con);
            da.SelectCommand = cmd;
            da.Fill(ds);
            try
            {
                rt = ds.Tables[0];
            }
            catch
            {   
                rt = null;
            }
            return rt;
        }

        public Boolean insertIntoDatabase(string SQL)
        {
            OpenConnection();

            OdbcCommand cmd = new OdbcCommand(SQL, con);
            con.Open();
            try
            {
                cmd.ExecuteNonQuery();
                return true;
            }
            catch
            {
                return false;
            }

        }


        // Implementing IDisposable method
        public void Dispose(){
            CloseConenction();
        }
    }
}

Ahora, la próxima vez que uses tu clase, haz algo como

using (DatabaseConnection db = new DatabaseConnection()){
    db.InsertIntoDatabase(...);
    db.GetLastInsertID();
    db.GetFromDatabase(...);
}

Al final de ese bloque de código, debido a que es IDisposeable, cerrará esa conexión por ti en el método dispose.

Cosas que cambié:

  • implementado IDisposable interfaz
  • cambió los métodos de estáticos a métodos de clase.
  • se agregaron nuevos métodos para abrir y cerrar la conexión
  • variable de conexión movida al ámbito de nivel de clase
  • añadió un argumento al constructor que le permite pasar una cadena de conexión (debe poner esta cadena de conexión en su Web.Config

Ediciones:

  • constructor toma connectionString por sugerencia.