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ę.