数据阅读器已经打开

时间:2017-09-22 14:05:48

标签: vb.net sqldatareader

已经看过类似我的问题,但它们都不适合我,这是我的代码

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")发生错误 enter image description here

3 个答案:

答案 0 :(得分:4)

你根本不使用那个阅读器,所以我不理解你的代码。您想要使用DataSet填充DataAdapter,然后需要这样做(始终使用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

答案 1 :(得分:1)

我会尝试确保所有一次性物品都在此功能中妥善处理。我建议使用Using语句来帮助确保任何一次性对象在超出范围时得到妥善处理。我相信SqlConnectionSqlDataReaderSqlDataAdapterDataSet都是一次性的。

编辑虽然我认为Tim的答案更针对您的问题(SqlDataReader未使用且不必要),但您也应该确保清理所有的一次性物品。如果你使用SqlDataReader,你需要在做任何其他事情之前处置它,除非你只是想证明你可以打开多个结果集在这种情况下,在同一连接的多次访问中缺少清理可能是负责的(如果其中一个不包含MultipleActiveResultSets)。

答案 2 :(得分:1)

首先,在这种情况下,您不需要使用阅读器,只需要SQLDataAdapter。

其次,您应该使用Conn.Close()来关闭SQL连接,而不是Conn.Dispose()。该错误意味着您的代码中的某些位置,您事先打开了连接,但从未关闭它。