Проблемът, с който се сблъсквате, е, че сте се кодирали в ъгъла „нова връзка за действие“. Това, към което наистина искате да се стремите и се счита за най-добра практика, е „нова връзка на пакет от действия“.
Това, което препоръчвам в този случай, е да отворите връзката, когато е необходимо, и да я затворите, когато я изхвърлите. Това, което ще направим, е да преместим odbc адаптерите към променлива с по-голям обхват, така че да може да бъде достъпна в рамките на класа.
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();
}
}
}
Сега следващия път, когато използвате вашия клас, направете нещо като
using (DatabaseConnection db = new DatabaseConnection()){
db.InsertIntoDatabase(...);
db.GetLastInsertID();
db.GetFromDatabase(...);
}
В края на този кодов блок, тъй като е IDisposeable, той ще затвори тази връзка за вас в метода dispose.
Неща, които промених:
- внедрено IDisposable интерфейс
- променени методи от статични на класови.
- добавени нови методи за отваряне и затваряне на връзка
- преместена променлива за връзка в обхват на ниво клас
- добавен аргумент към конструктора, който ви позволява да подадете низ за свързване (трябва да поставите този низ за свързване във вашия Web.Config
Редакции:
- конструкторът приема ConnectionString на предложение.