0
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

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

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

请帮助我..

4

1 回答 1

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 获得焦点时执行此操作。

于 2013-03-17T21:07:30.637 回答