あなたが直面している問題は、「アクションごとの新しい接続」コーナーに自分自身をコーディングしていることです。あなたが本当に目指したい、そしてベストプラクティスと考えられているのは、「アクションのバッチごとの新しい接続」です。
この場合、必要に応じて接続を開き、廃棄するときに閉じることをお勧めします。クラス内でアクセスできるように、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を取り込みます。