Masalah yang Anda hadapi adalah bahwa Anda telah mengkodekan diri Anda ke sudut "koneksi baru per tindakan". Apa yang benar-benar ingin Anda tuju, dan dianggap sebagai praktik terbaik, adalah "koneksi baru per kumpulan tindakan".
Yang saya sarankan dalam hal ini adalah membuka koneksi saat diperlukan, dan menutup saat dibuang. Apa yang akan kita lakukan adalah memindahkan adaptor odbc ke variabel cakupan yang lebih besar sehingga dapat diakses di dalam kelas.
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();
}
}
}
Sekarang lain kali Anda menggunakan kelas Anda, lakukan sesuatu seperti
using (DatabaseConnection db = new DatabaseConnection()){
db.InsertIntoDatabase(...);
db.GetLastInsertID();
db.GetFromDatabase(...);
}
Di akhir blok kode itu, karena IDisposeable, itu akan menutup koneksi itu untuk Anda dalam metode pembuangan.
Hal-hal yang saya ubah:
- menerapkan IDisposable antarmuka
- mengubah metode dari metode statis menjadi metode kelas.
- menambahkan metode baru untuk membuka penutupan koneksi
- memindahkan variabel koneksi ke cakupan tingkat kelas
- menambahkan argumen ke konstruktor yang memungkinkan Anda meneruskan string koneksi (Anda harus meletakkan string koneksi ini di Web.Config Anda
Suntingan:
- konstruktor menerima connectionString per saran.