Mysql
 sql >> Baza danych >  >> RDS >> Mysql

Czy połączenie z bazą danych w tej klasie jest wielokrotnego użytku?

Problem, z którym się zmagasz, polega na tym, że zakodowałeś się w narożniku „nowe połączenie na akcję”. To, do czego naprawdę chcesz dążyć i jest uważane za najlepszą praktykę, to „nowe połączenie na partię działań”.

W tym przypadku zalecam otwarcie połączenia, gdy jest to wymagane, i zamknięcie po usunięciu. To, co zrobimy, to przeniesienie adapterów odbc do większej zmiennej o określonym zakresie, aby można było uzyskać do niej dostęp w ramach klasy.

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

Teraz następnym razem, gdy użyjesz swojej klasy, zrób coś takiego

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

Na końcu tego bloku kodu, ponieważ jest on IDisposeable, zamknie to połączenie w metodzie dispose.

Rzeczy, które zmieniłem:

  • wdrożone IDisposable interfejs
  • zmieniono metody ze statycznych na metody klasowe.
  • dodano nowe metody otwierania i zamykania połączenia
  • przeniesiono zmienną połączenia do zakresu na poziomie klasy
  • dodano do konstruktora argument, który umożliwia przekazanie ciągu połączenia (należy umieścić ten ciąg połączenia w swoim Web.Config

Edycje:

  • Konstruktor przyjmuje ConnectionString na sugestię.


  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Nie można połączyć się z MySQL przez EF6 w Visual Studio 2013

  2. Kod błędu:1406. Dane są za długie dla kolumny - MySQL

  3. Oblicz (sum,max,avg) kolumnę oddzieloną przecinkami w mysql

  4. MySQL Nieprawidłowy ciąg znaków UTF8 podczas importowania tabeli csv

  5. Java Łączenie ze zdalną bazą danych MySQL