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.