Problém, kterému čelíte, je, že jste se zakódovali do rohu „nové připojení na akci“. To, na co se skutečně chcete zaměřit a je považováno za nejlepší postup, je „nové připojení na dávku akcí“.
Co v tomto případě doporučuji, je v případě potřeby připojení otevřít a při likvidaci uzavřít. Co uděláme, je přesunout adaptéry odbc do proměnné s větším rozsahem, aby k ní bylo možné přistupovat v rámci třídy.
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();
}
}
}
Nyní, až příště použijete svou třídu, udělejte něco jako
using (DatabaseConnection db = new DatabaseConnection()){
db.InsertIntoDatabase(...);
db.GetLastInsertID();
db.GetFromDatabase(...);
}
Na konci tohoto bloku kódu, protože je IDisposeable, za vás toto připojení uzavře metodou vyhazování.
Věci, které jsem změnil:
- implementováno IDisposable rozhraní
- změnili metody ze statických na metody třídy.
- přidali nové metody pro otevírání a uzavírání připojení
- přesunuli proměnnou připojení do rozsahu na úrovni třídy
- do konstruktoru přidal argument, který vám umožní předat připojovací řetězec (tento připojovací řetězec byste měli vložit do souboru Web.Config
Úpravy:
- konstruktor zapojí connectionString na návrh.