【问题标题】:Data reader already open数据阅读器已打开
【发布时间】:2018-03-04 03:36:08
【问题描述】:

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

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") 发生错误

【问题讨论】:

  • 异常意味着它所说的 - 你刚刚打开了阅读器 2 行。不要创建你不需要的东西,所有你的 DBProvider 对象应该在 Using 块中使用
  • 你不使用那个阅读器,你在那里做什么?
  • 不要在它们使用的范围之外声明变量并且不要使用New 。这会创建一个新对象,一旦将新对象分配给变量,该对象就会被丢弃。例如,写Dim dbcomm = New SqlCommand(sql, dbconn) 足以在try 块内部 创建一个新命令。 Dim reader = dbcomm.ExecuteReader也是如此。
  • 而且您不应该在公共网站上公开您的密码。

标签: vb.net sqldatareader


【解决方案1】:

我会尝试确保所有一次性物品都在此函数中正确放置。我推荐Using 语句,以帮助确保任何一次性对象在超出范围时得到正确处理。我相信SqlConnectionSqlDataReaderSqlDataAdapterDataSet都是一次性的。

编辑:虽然我认为蒂姆的回答更针对您的问题(SqlDataReader 未使用且不必要),但您也应该确保清理所有一次性物品。如果您确实使用了 SqlDataReader,则需要在执行任何其他操作之前将其处理掉,除非您只是想证明您可以打开多个结果集一次,在这种情况下,可能是对同一连接的多次访问中缺乏清理(如果其中一个不包括 MultipleActiveResultSets)。

【讨论】:

  • using 语句 dispose 和 disposing 的行为关闭连接
  • @Aaron.S 原代码中没有using声明。
【解决方案2】:

你根本不使用那个阅读器,所以我不明白你的代码。您想用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

【讨论】:

    【解决方案3】:

    首先,在这种情况下,你不需要使用 reader,你只需要 SQLDataAdapter。

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

    【讨论】:

    • Conn.Close()not absolutely neccesary
    • 在大多数情况下 Close()Dispose() 做同样的事情。
    • @MatSnow 请澄清您的评论。如果使用 using 语句,则不需要关闭,对吗?如果没有使用 using 语句,则需要关闭
    • @AustinS90 你的例子是正确的,因为他没有将他的代码包装到使用中。一个 using 将处理并且也关闭了
    • @MatSnow 你是对的,但 Dispose 也会处理可能不需要的对象。如果您想重用该对象,那么如果调用 Dispose 而不是仅关闭,则需要再次新建它
    猜你喜欢
    • 2012-09-13
    • 1970-01-01
    • 2017-04-30
    • 1970-01-01
    • 1970-01-01
    • 2014-07-13
    • 1970-01-01
    • 1970-01-01
    • 2013-01-25
    相关资源
    最近更新 更多