2016-05-14 13 views
0

ええと...私は現在vb.netを使用して私の最後の年のプロジェクトをやっていると私はこのエラーが発生しました。 Im tryin 'エラーを修正するにはまだ成功しません。私は私のプロジェクトでデータベースのmsアクセスを使用します。私は 'dt'ステートメントの前にcon.Open()を入れて、 'cboProduct.Select'の後にcon.Close()を実行しますが、結果は同じです。本当に助けに感謝します。感謝:)接続が閉じられていません接続の現在の状態が開いています

'GLOBAL DECLARATIONS 
Dim conString As String = "Provider=Microsoft.ACE.OLEDB.12.0;Data Source=C:\Users\Acer User\Documents\MAKLUMAT IVENTORI.accdb" 
Dim con As OleDbConnection = New OleDbConnection(conString) 
Dim adapter As New OleDbDataAdapter 
Dim cmd As New OleDbCommand 
Dim dt As New DataTable 
Dim ds As New DataSet 

Private Sub RefreshData() 
    dt = New DataTable 
    ds = New DataSet 
    ds.Tables.Add(dt) 

    adapter = New OleDbDataAdapter("Select * FROM product WHERE lab_kod='66'", con) 
    adapter.Fill(dt) 
    DataGridView1.DataSource = dt.DefaultView 

    labelID.Text = getAutoID() 
    lblLabCode.Text = "66" 
    cboProduct.Select() 

    Dim v_SQL As String = "SELECT * FROM kategori_product" 
    cmd = New OleDbCommand(v_SQL, con) 
    con.Open() 

    Dim v_dataReader As OleDbDataReader = cmd.ExecuteReader() 
    Dim v_dataTable As New DataTable 
    v_dataTable.Columns.Add("product_kod", Type.GetType("System.String")) 

    If v_dataReader.HasRows Then 
     While v_dataReader.Read 
      v_dataTable.Rows.Add(v_dataReader.GetString(0)) 
     End While 
     cboProduct.DataSource = v_dataTable 
    End If 

    cboProduct.DisplayMember = "product_kod" 
    cboProduct.ValueMember = "product_kod" 
    v_dataReader.Close() 
    con.Close() 
End Sub 
+0

'getAutoID()'とは何ですか?同じグローバル接続を使用していますか? – Crowcoder

+0

自動番号に使用します。 IDラベルに数字を入れる必要はありません。うん。同じグローバル接続を使用しています。 –

+0

次に、接続を開いたままにしていると思われます。その場合は、 'getAutoID'を終了する前に閉じてください。 – Crowcoder

答えて

1
  1. は、グローバル変数として、データベース接続などの短命オブジェクトを、保管しないでください。
  2. 実際、グローバル変数はまったく使用しないでください。
    (私はこれを仮定すると、それらが実際にクラスフィールド、ないグローバルありClassないModuleであることに注意してください、しかし、あなたはまだそれらを悪用しているが)
  3. あなたOleDbDataAdapter.Fillコールがする接続が必要です開いているが、電話する前に.Fill(dt)に電話する前にcon.Open()
  4. ブロックを使用すると、失敗した場合でもデータベース接続が常に閉じられるようにする。
+0

時には、クラス・レベルの変数が適切であるため、Disposeパターンがあります。データ・アダプタがオープンしていない場合、データ・アダプタは接続をオープンします。 – Crowcoder

+0

usingステートメントに言及するのに加えて1つ。 IDisposableを実装するすべてのオブジェクト、または少なくとも関数が完了したときに破棄するオブジェクトは、Usingブロックを使用してインスタンス化する必要があります。 – Lopsided

+0

@Crowcoderがよく勘違いしている点を強調したいと思います。 'Fill()'メソッドは接続を開いて閉じますが、手動で開く必要はありません。 [引用](https://msdn.microsoft.com/en-us/library/377a8x4t(v = vs.110).aspx): "SELECTステートメントに関連付けられた接続オブジェクトは有効である必要がありますが、 Fillが呼び出される前に接続が閉じられている場合は、データが取得されて閉じられ、Fillが呼び出される前に接続が開いている場合は開いたままになります。 –

関連する問題