Mysql
 sql >> Database >  >> RDS >> Mysql

La connessione al database in questa classe è riutilizzabile?

Il problema che devi affrontare è che ti sei codificato in un angolo "nuova connessione per azione". Quello a cui vuoi veramente mirare, ed è considerata la migliore pratica, è "nuova connessione per batch di azioni".

Quello che consiglio in questo caso è aprire la connessione quando richiesto e chiuderla quando smaltita. Quello che faremo è spostare gli adattatori odbc su una variabile con ambito più ampio in modo che sia possibile accedervi all'interno della classe.

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();
        }
    }
}

Ora la prossima volta che usi la tua classe, fai qualcosa come

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

Alla fine di quel blocco di codice, poiché è IDisposeable, chiuderà quella connessione per te nel metodo dispose.

Cose che ho cambiato:

  • implementato IDisposable interfaccia
  • metodi modificati da statici a metodi di classe.
  • aggiunti nuovi metodi per aprire la chiusura della connessione
  • sposta la variabile di connessione nell'ambito a livello di classe
  • aggiunto un argomento al costruttore che ti consente di passare una stringa di connessione (dovresti inserire questa stringa di connessione in Web.Config

Modifiche:

  • il costruttore accetta connectionString per suggerimento.