2017-02-06 13 views
0

iはvb.netは、3階層アーキテクチャのエラーメッセージオープン接続

は、私はクラスBLは、関数名が含まれている3層アーキテクチャを使用してvb.netプロジェクトで働く:すべての顧客を示し、これはコードです: `

Public Function ShowCustomer() As Customer() 
    Dim sql As String 
    Dim emps(-1) As Customer 
    Dim e1 As Customer 
    sql = "select Customer_name from Customer" 
    Dim dr As SqlDataReader = OBJECT_M.Exe_SQL(sql) 

    While dr.Read 
     e1 = New Customer 
     e1.Customer_Name = dr(0) 

     ReDim Preserve emps(UBound(emps) + 1) 
     emps(UBound(emps)) = e1 
    End While 
    Return emps 
End Function 

は今インターフェースに私はすべての顧客名を処理し、リストビューに名前を書く必要が

私のコード:

Dim obj As New BL 
Dim obj2 As New Customer 
Dim x As Integer = 1 

While x <> obj.ShowCustomer.Length 
    lb.Items.Add(obj.ShowCustomer(x).Customer_Name.ToString()) 
End While 

ですが、エラーメッセージが表示されます。

追加情報:接続が閉じられていません。接続の現在の状態は開いています。

してください誰でも私の日を節約できますか?

+0

Exe_SQLの内容を投稿できますか – apc

+0

私の推測では、OBJECT_M.Exe_SQLはオープン接続を呼び出しますが、決してクローズしません。したがって、すでに開かれている接続でオープン接続を呼び出す2回目 – apc

答えて

1

SqlConnection、SqlCommand、SqlDataReader、DataTable、DataSet(およびその他の使い捨て可能なオブジェクト)は、完了したらオブジェクトのDispose()を必ず行ってください。

Dispose()(またはこのケースではClose())を呼び出さないと、接続は開いたままになり、メモリとハンドルリークが発生します。

easist方法も例外または他の短絡イベントの場合には処分されますUsingキーワード(使用することです:私は、上記に詳述されているオブジェクトで同じことを行うようにしてください

Using dr As SqlDataReader = OBJECT_M.Exe_SQL(sql) 

    While dr.Read 
     e1 = New Customer 
     e1.Customer_Name = dr(0) 

     ReDim Preserve emps(UBound(emps) + 1) 
     emps(UBound(emps)) = e1 
    End While 

End Using 

をOBJECT_M.Exe_SQLでは、オブジェクトのDispose()/ Close()を呼び出すと、再度オブジェクトのインスタンスを使用することができず、新しいインスタンスを作成する必要があります。

ドキュメントを参照してください。例:https://msdn.microsoft.com/en-us/library/system.data.sqlclient.sqldatareader(v=vs.110).aspx

また、配列の使用に間違いはありませんが、後でToArray()を使用して変換できるリスト(Tの)を使用することは簡単です。

関連する問題