2017-04-13 57 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 

调试器指出的错误在这里:

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

对于具有IDisposable的一切,你应该实现使用

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

还要确保处置读者.Dispose()如果你不wa NT使用使用最后用SQL它总是很好用的工作:

SqlConnection.ClearPool(con) 
+0

是的,我真的不想使用USING,它真的很复杂和混乱。 大声笑它仍然没有工作,我使用'.Dispose()'和'SqlConnection.ClearPool(theConnection)' – bidipeppercrap

+0

我尝试了USING方法。并且'FPath = theDataReader(0)'有语法错误。我的VS没有识别该代码。 – bidipeppercrap

+0

@BidiAjin使用非常简单只是声明使用myvariable As MyType'做的东西End Using End使用将自动调用**。Close()**和**。Dispose()** – Mederic

0

好了,所以现在我解决这个问题位于Load(DataTable)

韦尔普,我改变了主意,它切换到DataSet而不是DataTable

感谢您回答我的问题。祝你有美好的一天。

哦,这里是工作的代码

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