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必须先关闭。”
请帮帮我..
答案 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获得焦点时执行此操作。