2011-09-28 10 views
0

Iページの起動中にODBC接続を開いたり閉じたりします。どこにどこにConnection.Disposeメソッドを配置する必要がありますか?私はPage_Disposedを試しましたが、決してそこには入りません。Asp.NetでのODBC接続(接続および廃棄)

Public Class _WepPage1 
Inherits System.Web.UI.Page 

Dim MyConnection As New Odbc.OdbcConnection 

Private Sub Page_Disposed(sender As Object, e As System.EventArgs) Handles Me.Disposed 
    MyConnection.Dispose() 
End Sub 

Protected Sub Page_Load(ByVal sender As Object, ByVal e As System.EventArgs) Handles Me.Load 
    'String comes from Web.Config 
    MyConnection.ConnectionString = ConfigurationManager.ConnectionStrings("MyConnection").ConnectionString 
    If Not IsPostBack Then 
     Call LoadSomeData() 
    Else 
     'Do some more stuff    
    End If 
End Sub 

Private Sub LoadSomeData() 
    If MyConnection.State = ConnectionState.Closed Then MyConnection.Open() 
    Dim MyCommand As New Odbc.OdbcCommand("select * from tablename", MyConnection) 
    Try 
     Dim dataR As Odbc.OdbcDataReader = MyCommand.ExecuteReader 
     While dataR.Read 
      DropDownList1.Items.Add(dataR("column1")) 
     End While 
    Catch ex As Exception 
    End Try 
    MyCommand.Dispose() 
    If MyConnection.State = ConnectionState.Open Then MyConnection.Close() 
End Sub 
+0

おそらくtry CatchのFinallyブロックに書き込んでください。 –

+0

ユーザーがドロップダウン選択を行ったときに実際にデータベースヒットしているので、アプリケーションを閉じるまで接続を破棄したくありませんでした。または私はこれを間違って見るのだろうか? – TroyS

+0

ここではConnectionを閉じているので、もう一度処理する必要はありません。 –

答えて

0

私は接続を開始するためにPage_Loadを使用しません。 .NETでは、Dispose()を実行すると "実際の"接続オブジェクトがプールに戻ります。そのため、他の作業のためにそこにあります。開いて閉じて何回も処分しても、数マイクロ秒のオーバーヘッドがあるので、早めに接続を開いてからページ全体の期間開いたままにしておくことは本当に役に立ちません。

さらに、Page_Loadで接続を開くと、UIへのデータアクセスが緊密に結合されているため、作業を適切な層に分割するだけでなく、多くの再構築が行われます。

これは、1つの方法(例では)で接続を作成、使用、および廃棄することを意味します。つまり、アプリケーションが大きくなりDALが完全に必要な場合は、論理的に分離され、異なるクラスやアセンブリに分けやすくなります。

少なくとも、すべてのレーティングをLoadSomeData()メソッドへの接続に移動します。懸念をより適切に分離したい場合は、GetSomeData()ルーチンを作成し、GetSomeData()ルーチンを呼び出して、一度に1行を消費するのではなく、簡単にバインドできるようにデータを整形しますたとえば、データオブジェクトをドロップダウンにバインドするのではなく、一度に1つのアイテムをプッシュしています)。

私はこれが助けてくれることを願っています。そこにある多くの例がベストプラクティスには本当に悪いことは残念です。そして、はい、これはよく知っているべきである多くのサンプルが含まれています。 ;-)

+0

ありがとうございます。私はそのショットを与えるでしょう。 – TroyS

関連する問題