调用子功能时连接打开错误

时间:2013-04-13 13:06:14

标签: vb.net ms-access-2007

这是我的程序流程..

Private Sub cmdUpdate_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles cmdUpdate.Click
     ..
    ....

     Call comboRefresh()        ------>
     cmdNext.Text = "Add New"
     cmdEdit.Text = "Edit"
     cmdUpdate.Enabled = False
End Sub


Private Sub comboRefresh()

    ------> ....

    da.Fill(ds, "Vendor_Machine")

        cmbSn_no.ValueMember = "sr_no"
        cmbSn_no.DataSource = ds.Tables(0)  --
        cmbSn_no.SelectedIndex = 0

       ....
End Sub

Private Sub cmbSn_no_SelectedIndexChanged(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles cmbSn_no.SelectedIndexChanged

  ----->       cnnOLEDB.Open()
   ...
         Dim dr As OleDb.OleDbDataReader = comm_SelVen.ExecuteReader

    If dr.Read = True Then
        cmbSn_no.Text = dr("sr_no")
        cmbChal_no.Text = dr("chaln_no") ----->
    End If
    cnnOLEDB.Close()

End Sub

 Private Sub cmbChal_no_SelectedIndexChanged(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles cmbChal_no.SelectedIndexChanged
  ---->     cnnOLEDB.Open()
    ...
     cnnOLEDB.Close()

End Sub

这里说问题“连接已经打开......”并暂停执行...即使我不能在最后一个子函数中注释行---> cnnOLEDB.Open(),因为我必须单独调用cmbChal_no_SelectedIndexChanged还..如果我评论它会给出错误

  

连接已关闭,需要打开才能执行DataReader

请建议我做什么......谢谢

1 个答案:

答案 0 :(得分:0)

不要为您的连接保留全局对象。只需在每次需要时构建一个,并封装创建,使用和处理Using Statement

的逻辑
Using cnnOLEDB = New OleDbConnection(connectionstring)
Using comm = new OleDbCommand(queryText, cnnOLEDB)
    cnnOLEDB.Open()
    ...
    Using dr = comm_SelVen.ExecuteReader
    If dr.Read = True Then
        cmbSn_no.Text = dr("sr_no")
        cmbChal_no.Text = dr("chaln_no") ----->
    End If
End Using

这样,当流从Using语句退出时,您的连接将自动关闭,并且所有使用的资源都将通过自动调用的Dispose释放。
如果出于任何原因在连接仍然打开时出现异常,也会发生这种情况

可能你的连接是开放的,因为你的代码的上一次运行遇到了异常,或者你忘了在全局对象cnnOLEDB上的某处调用Close

修改 查看下面的评论,虽然我不喜欢它,但有可能测试属性ConnectionState以避免重新打开连接(如果已经打开)

If cnnOLEDB.State = ConnectionState.Closed Then
     cnnOLEDB.Open()
End If