在检查无效数据时,已经是与此命令关联的打开的DataReader

时间:2013-03-17 18:51:18

标签: vb.net sqldatareader

Private Sub txt_sname_GotFocus(ByVal sender As Object, ByVal e As System.EventArgs) Handles txt_sname.GotFocus
        Dim fcs As String
        fcs = "select fname,dept from nstudent where stid = '" & txt_sid.Text & "'"
        scmd1 = New SqlCommand(fcs, con)
        dr1 = scmd1.ExecuteReader
        If dr1.HasRows Then
            Do While (dr1.Read)
                txt_sname.Text = dr1.Item(0)
                cmb_dept.Text = dr1.Item(1)
            Loop
        Else
            MsgBox("Not Found")
        End If
        scmd1.Dispose()
        If Not dr1.IsClosed Then dr1.Close()
End Sub

以上代码来自数据库并传递给文本框。当我运行程序并检查已存在于数据库中的数据时,它正常工作。但是在发生并退出错误后,检查其他一些数据(不存在于db中)。

错误: “已经有一个与此命令关联的开放DataReader必须先关闭。”

请帮帮我..

1 个答案:

答案 0 :(得分:1)

一些观察结果:

不使用全局命令对象,而是使用本地命令对象。特别是因为你正在创建一个新的命令。看起来这也适用于dr1。

您没有阻止SQL注入,因此有人可以在txt_sid中键入文本,通过删除数据,删除表或访问数据库中的其他数据来导致安全问题。

您正在循环并多次设置相同的变量。如果只有一条记录,请不要打扰循环。

围绕try / catch

包裹整个东西
Private Sub txt_sname_GotFocus(ByVal sender As Object, ByVal e As System.EventArgs) Handles txt_sname.GotFocus
    Dim cmd1 As SqlCommand = New SqlCommand(fcs, "select fname,dept from nstudent where stid = @stid")
    cmd1.Parameters.Parameters.AddWithValue("@stid", txt_sid.Text)

    Dim studentReader as SqlDataReader

    Try
        studentReader = scmd1.ExecuteReader
        If studentReader.Read Then
            txt_sname.Text = studentReader.Item(0)
            cmb_dept.Text = studentReader.Item(1)
        Else
            MsgBox("Not Found")
        End If
    Finally
        studentReader.Close()
        cmd1.Dispose()
    End Try
End Sub

最后,我认为您可能希望在txt_sid更改时实际执行此操作,而不是在txt_sname获得焦点时执行此操作。