0

这是我程序的流程..

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

请建议我该怎么做...谢谢

4

1 回答 1

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
于 2013-04-13T14:01:21.270 回答