sql >> Databasteknik >  >> RDS >> Mysql

Är databasanslutningen i den här klassen återanvändbar?

Problemet du möter är att du har kodat in dig själv i ett hörn "ny anslutning per åtgärd". Vad du verkligen vill sikta på, och anses vara bästa praxis, är "ny anslutning per sats av åtgärder".

Vad jag rekommenderar i det här fallet är att öppna anslutningen vid behov och stänga när den kasseras. Vad vi ska göra är att flytta odbc-adaptrarna till en variabel med större omfattning så att den kan nås inom klassen.

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

Nu nästa gång du använder din klass gör något liknande

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

I slutet av kodblocket, eftersom det är ID-disposable, kommer det att stänga den anslutningen åt dig i avyttringsmetoden.

Saker jag ändrade:

  • implementerat IDisposable gränssnitt
  • ändrade metoder från statiska till klassmetoder.
  • har lagt till nya metoder för att öppna stängningsanslutning
  • flyttade anslutningsvariabel till klassnivåomfång
  • har lagt till ett argument till konstruktorn som låter dig skicka in en anslutningssträng (du bör lägga den här anslutningssträngen i din Web.Config

Redigeringar:

  • konstruktören tar in connectionString per förslag.


  1. MySQL-indexanvändningsfrågeoptimering

  2. Escape-tabellnamn MySQL

  3. MYSQL SELECT INOM IF uttalande

  4. Hur infogar/skapar man lagrade procedurer i mySQL från PHP?