2016-05-14 186 views
0

Hye ...我目前正在使用vb.net做最後一年的項目,並且出現此錯誤。我試着'來解決這個錯誤,但仍然不成功。我在我的項目中使用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調用需要的連接是開放的,但你叫con.Open()
  4. 使用Usingusing()在C#)塊,以確保您的數據庫連接始終是閉合的,即使是在發生故障時之前調用.Fill(dt)
+0

有時候類級別的變量是合適的,這就是爲什麼有Dispose模式。如果數據適配器未打開,它們將自行打開連接。 – Crowcoder

+0

加一個提及使用語句。實現IDisposable的所有對象,或者至少是在函數完成時打算處理的對象都應通過Using塊實例化。 – Lopsided

+0

我想強調@Crowcoder提到的一點,因爲這是一種常見的誤解。 'Fill()'方法將打開並關閉連接,不需要手動打開。 [Quote](https://msdn.microsoft.com/en-us/library/377a8x4t(v = vs.110).aspx):「與SELECT語句關聯的連接對象必須是有效的,但它並不需要如果連接在調用Fill之前關閉,它將打開以檢索數據,然後關閉,如果連接在調用Fill之前打開,它將保持打開狀態。 –

相關問題