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

接続用にグローバル オブジェクトを保持しないでください。必要になるたびに 1 つ作成し、Using ステートメントを介して作成、使用、破棄のロジックをカプセル化するだけです。

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 に答える