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

Kan databaseforbindelsen i denne klasse genbruges?

Det problem, du står over for, er, at du har kodet dig selv ind i et hjørne med "ny forbindelse pr. handling". Det, du virkelig ønsker at sigte efter, og betragtes som bedste praksis, er "ny forbindelse pr. batch af handlinger".

Det, jeg anbefaler i dette tilfælde, er at åbne forbindelsen, når det er nødvendigt, og lukke, når det bortskaffes. Det, vi skal gøre, er at flytte odbc-adapterne til en variabel med større omfang, så den kan tilgås inden for 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();
        }
    }
}

Næste gang du bruger din klasse, skal du gøre noget lignende

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

I slutningen af ​​den kodeblok, fordi den er IDisposeable, vil den lukke forbindelsen for dig i bortskaffelsesmetoden.

Ting jeg har ændret:

  • implementeret IDisposable grænseflade
  • ændrede metoder fra statiske til klassemetoder.
  • tilføjede nye metoder til åbning af lukning af forbindelse
  • flyttede forbindelsesvariabel til klasseniveauomfang
  • føjede et argument til konstruktøren, der lader dig sende en forbindelsesstreng ind (du skal sætte denne forbindelsesstreng i din Web.Config

Rediger:

  • konstruktør tager forbindelsesstreng pr. forslag.


  1. Hvordan kontrollerer man, om strengværdien i én kolonne er delvist indeholdt i strengværdien af ​​en anden kolonne ved hjælp af SQL?

  2. Er forbindelsespooling et must-have i ODP.NET?

  3. ORA-01008:ikke alle variable er bundet, når de alle er bundet

  4. Beskedsystemdatabaseskema