数据 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 语句来帮助确保任何一次性对象在超出范围时得到正确处理。我相信SqlConnectionSqlDataReaderSqlDataAdapterDataSet都是一次性的。

编辑: 虽然我认为 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()。该错误意味着在您的代码中的某些地方,您事先打开了连接,但从未关闭它。