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.