数据 reader 已打开
Data reader already open
已经看过与我类似的问题,但 none 对我有用,这是我的代码
dbconn = New SqlConnection
dbconn.ConnectionString = ("Data Source=JENELIE\SQLEXPRESS;Initial Catalog=feeding_monitoring_system;User ID=sa;Password=Jenelie19; MultipleActiveResultSets = true")
Dim reader As SqlDataReader
Dim sda As New SqlDataAdapter
Dim ds As New DataSet()
Try
dbconn.Open()
Dim sql As String
sql = "select Count (Gender) as NumberofStudent, Gender from Student_Info Group by Gender"
dbcomm = New SqlCommand(sql, dbconn)
reader = dbcomm.ExecuteReader
sda.SelectCommand = dbcomm
sda.Fill(ds, "Student_Info")
Catch ex As SqlException
MessageBox.Show(ex.Message)
Finally
dbconn.Dispose()
End Try
然后在 sda.Fill(ds, "Student_Info") 发生错误
我会尝试确保所有一次性物品都在此功能中得到妥善处理。我建议使用 Using
语句来帮助确保任何一次性对象在超出范围时得到正确处理。我相信SqlConnection
、SqlDataReader
、SqlDataAdapter
和DataSet
都是一次性的。
编辑: 虽然我认为 Tim 的回答更针对你的问题(SqlDataReader
未使用且不必要),但你应该确保清理所有你的一次性物品也是如此。如果您确实使用了 SqlDataReader,您将希望在执行任何其他操作之前处理掉它,除非您只是想证明您可以 一次打开多个结果集,在这种情况下,可能是对同一连接的多次访问缺乏清理(如果其中一个不包含 MultipleActiveResultSets)。
你根本不用那个 reader,所以我不明白你的代码。你想用 DataAdapter
填充 DataSet
,那么这是需要的(总是使用 Using
):
Dim ds As New DataSet()
Using dbconn As New SqlConnection("Data Source=JENELIE\SQLEXPRESS;Initial Catalog=feeding_monitoring_system;User ID=sa;Password=Jenelie19;MultipleActiveResultSets = true")
Dim sda = New SqlDataAdapter("select Count (Gender) as NumberofStudent, Gender from Student_Info Group by Gender", dbconn)
Try
sda.Fill(ds, "Student_Info") ' you dont need to open/close the connection
Catch ex As SqlException
MessageBox.Show(ex.Message)
End Try
End Using
首先,在那种情况下,你不需要使用reader,你只需要SQLDataAdapter.
其次,您应该使用 Conn.Close() 来关闭您的 SQL 连接,而不是 Conn.Dispose()。该错误意味着在您的代码中的某些地方,您事先打开了连接,但从未关闭它。
已经看过与我类似的问题,但 none 对我有用,这是我的代码
dbconn = New SqlConnection
dbconn.ConnectionString = ("Data Source=JENELIE\SQLEXPRESS;Initial Catalog=feeding_monitoring_system;User ID=sa;Password=Jenelie19; MultipleActiveResultSets = true")
Dim reader As SqlDataReader
Dim sda As New SqlDataAdapter
Dim ds As New DataSet()
Try
dbconn.Open()
Dim sql As String
sql = "select Count (Gender) as NumberofStudent, Gender from Student_Info Group by Gender"
dbcomm = New SqlCommand(sql, dbconn)
reader = dbcomm.ExecuteReader
sda.SelectCommand = dbcomm
sda.Fill(ds, "Student_Info")
Catch ex As SqlException
MessageBox.Show(ex.Message)
Finally
dbconn.Dispose()
End Try
然后在 sda.Fill(ds, "Student_Info") 发生错误
我会尝试确保所有一次性物品都在此功能中得到妥善处理。我建议使用 Using
语句来帮助确保任何一次性对象在超出范围时得到正确处理。我相信SqlConnection
、SqlDataReader
、SqlDataAdapter
和DataSet
都是一次性的。
编辑: 虽然我认为 Tim 的回答更针对你的问题(SqlDataReader
未使用且不必要),但你应该确保清理所有你的一次性物品也是如此。如果您确实使用了 SqlDataReader,您将希望在执行任何其他操作之前处理掉它,除非您只是想证明您可以 一次打开多个结果集,在这种情况下,可能是对同一连接的多次访问缺乏清理(如果其中一个不包含 MultipleActiveResultSets)。
你根本不用那个 reader,所以我不明白你的代码。你想用 DataAdapter
填充 DataSet
,那么这是需要的(总是使用 Using
):
Dim ds As New DataSet()
Using dbconn As New SqlConnection("Data Source=JENELIE\SQLEXPRESS;Initial Catalog=feeding_monitoring_system;User ID=sa;Password=Jenelie19;MultipleActiveResultSets = true")
Dim sda = New SqlDataAdapter("select Count (Gender) as NumberofStudent, Gender from Student_Info Group by Gender", dbconn)
Try
sda.Fill(ds, "Student_Info") ' you dont need to open/close the connection
Catch ex As SqlException
MessageBox.Show(ex.Message)
End Try
End Using
首先,在那种情况下,你不需要使用reader,你只需要SQLDataAdapter.
其次,您应该使用 Conn.Close() 来关闭您的 SQL 连接,而不是 Conn.Dispose()。该错误意味着在您的代码中的某些地方,您事先打开了连接,但从未关闭它。