2017-04-13 9 views
0

私はすべての読者を正しく閉じませんでしたか?関数をトリガーするたびに、エラーが発生します。他のSqlDataReaderを閉じる必要がありますが、私は他のものを閉じてしまいました

System.InvalidOperationException: 'リーダーが閉じられているときにReadを呼び出す試みが無効です。

今私は本当に欲求不満です。

私のコードで何が問題になっていますか?すべてが良いようです。

Private Sub Button_EditData_Click(sender As Object, e As EventArgs) Handles Button_EditData.Click 
    FormEnabler() 
    Me.TextBox_BranchID.Enabled = False 
    Me.Button_AddNew.Enabled = False 
    Me.Button_EditData.Enabled = False 
    Me.Button_DeleteData.Enabled = False 
    Me.Button_Save.Enabled = True 
    Me.Button_Cancel.Enabled = True 
    Me.Button_ManageThisBranchStock.Enabled = False 
    Me.Button_ManageThisBranchEmployee.Enabled = False 

    theConnection.Open() 

    Dim theEditInputCommand As New SqlCommand 
    Dim theEditInputDataReader As SqlDataReader 

    theEditInputCommand.Connection = theConnection 
    theEditInputCommand.CommandText = "SELECT * FROM Branch WHERE BranchID = '" & Me.TextBox_BranchID.Text & "'" 
    theEditInputDataReader = theEditInputCommand.ExecuteReader() 

    If theEditInputDataReader.Read() Then 
     Me.TextBox_Title.Text = theEditInputDataReader.Item("Title") 
     Me.RichTextBox_Address.Text = theEditInputDataReader.Item("Address") 
     Me.TextBox_ContactNumber.Text = theEditInputDataReader.Item("ContactNo") 
     Me.ComboBox_BranchManager.Text = theEditInputDataReader.Item("BranchManager") 
     theEditInputDataReader.Close() 
    End If 

    theConnection.Close() 

    theConnection.Open() 

    Dim theEditInputBranchManagerCommand As New SqlCommand 
    Dim theEditInputBranchManagerDataReader As SqlDataReader 
    Dim theEditInputBranchManagerDataTable As New DataTable 

    theEditInputBranchManagerCommand.Connection = theConnection 
    theEditInputBranchManagerCommand.CommandText = "SELECT EmployeeID FROM AssignmentDetail WHERE BranchID = '" & Me.TextBox_BranchID.Text & "'" 
    theEditInputBranchManagerDataReader = theEditInputBranchManagerCommand.ExecuteReader() 
    theEditInputBranchManagerDataTable.Load(theEditInputBranchManagerDataReader) 

    If theEditInputBranchManagerDataReader.Read() Then 
     Me.ComboBox_BranchManager.ValueMember = "EmployeeID" 
     Me.ComboBox_BranchManager.DisplayMember = "EmployeeID" 
     Me.ComboBox_BranchManager.DataSource = theEditInputBranchManagerDataTable 
     theEditInputBranchManagerDataReader.Close() 
    Else 
     Me.ComboBox_BranchManager.ValueMember = "'-'" 
     theEditInputBranchManagerDataReader.Close() 
    End If 

    theConnection.Close() 
End Sub 

デバッガはこの辺りでエラーを指摘:IDisposableをを持っているすべてのために

If theEditInputBranchManagerDataReader.Read() Then 
    Me.ComboBox_BranchManager.ValueMember = "EmployeeID" 
    Me.ComboBox_BranchManager.DisplayMember = "EmployeeID" 
    Me.ComboBox_BranchManager.DataSource = theEditInputBranchManagerDataTable 
    theEditInputBranchManagerDataReader.Close() 
Else 
    Me.ComboBox_BranchManager.ValueMember = "'-'" 
    theEditInputBranchManagerDataReader.Close() 
End If 
+1

であるあなたは、読んで理解し、ボビーテーブルが訪ねて来る前に、パラメータ化クエリを使用して起動する必要があります。 http://bobby-tables.com/このコードは、SQLインジェクションに広く公開されています。 –

+0

wtfはボビーテーブルですか? – bidipeppercrap

+1

リンクに従ってください。それはSQLインジェクションについての漫画です。あなたのコードは、この脆弱性がどのように機能するかの典型的な例です。 –

答えて

3

をあなたはまた、リーダーを処分することを確認してください

Using reader As SqlDataReader = command.ExecuteReader() 
    While reader.Read() 
     FPath = reader(0) 
    End While 
End Using 

を使用したを実装する必要があります.Dispose()

SqlConnection.ClearPool(con) 
+0

ええ、私は本当にUSINGを使いたくないです。本当に複雑で混乱します。 私は '.Dispose()'と 'SqlConnection.ClearPool(theConnection)'を使用しています。 – bidipeppercrap

+0

USINGメソッドを試しました。そして、 'FPath = theDataReader(0)'の構文エラーがあります。私のVSはそのコードを認識しませんでした。 – bidipeppercrap

+0

@BidiAjin使い方は非常にシンプルです。MyvariableをMyTypeとして使用すると終了します。最後を使用すると、自動的に** Close()**および** Dispose()** – Mederic

0

わかりましたので、今、私は問題がLoad(DataTable)

Welpに位置していることを解決し、私は私の心を変えて、それを切り替えました:最後に、それは使用することは常に良いことだSQLでの作業を使用したを使用するには、NT DataTableの代わりにDataSetに変更してください。

私の質問にお答えいただきありがとうございます。良い一日を過ごしてください。

ああ、ここでは、作業コード

Using theEditCheckBranchManagerDataReader As SqlDataReader = theEditCheckBranchManagerCommand.ExecuteReader() 
     If theEditCheckBranchManagerDataReader.Read() Then 
      theEditCheckBranchManagerCommand.Dispose() 
      theEditCheckBranchManagerDataReader.Close() 
      theEditCheckBranchManagerDataReader.Dispose() 
      theConnection.Close() 
      SqlConnection.ClearPool(theConnection) 

      Dim theEditInputBranchManagerCommand As New SqlCommand 
      Dim theEditInputBranchManagerDataSet As New DataSet 
      Dim theEditInputBranchManagerDataAdapter As New SqlDataAdapter 

      theEditInputBranchManagerCommand.Connection = theConnection 
      theEditInputBranchManagerCommand.CommandText = "SELECT EmployeeID FROM AssignmentDetail WHERE BranchID = '" & Me.TextBox_BranchID.Text & "'" 
      theEditInputBranchManagerDataAdapter.SelectCommand = theEditInputBranchManagerCommand 

      theEditInputBranchManagerDataAdapter.Fill(theEditInputBranchManagerDataSet) 
      theEditInputBranchManagerDataAdapter.Dispose() 
      theEditInputBranchManagerCommand.Dispose() 

      Me.ComboBox_BranchManager.DataSource = theEditInputBranchManagerDataSet.Tables(0) 
      Me.ComboBox_BranchManager.ValueMember = "EmployeeID" 
      Me.ComboBox_BranchManager.DisplayMember = "EmployeeID" 
     Else 
      theEditCheckBranchManagerCommand.Dispose() 
      theEditCheckBranchManagerDataReader.Close() 
      theEditCheckBranchManagerDataReader.Dispose() 
      theConnection.Close() 
      SqlConnection.ClearPool(theConnection) 

      Me.ComboBox_BranchManager.DataSource = Nothing 
      Me.ComboBox_BranchManager.Items.Clear() 
      Me.ComboBox_BranchManager.Text = "-" 
     End If 
    End Using 
関連する問題