2016-05-14 155 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之前打开,它将保持打开状态。 –

相关问题