这是我的程序流程..
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
请建议我做什么......谢谢
答案 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