已经有一个打开的 DataReader 与此命令关联,必须先关闭

Posted

技术标签:

【中文标题】已经有一个打开的 DataReader 与此命令关联,必须先关闭【英文标题】:There is already an open DataReader associated with this Command which must be closed first 【发布时间】:2012-03-13 15:27:43 【问题描述】:
Dim staffid = TextBox1.Text
    Dim conn As New SqlConnection
    conn.ConnectionString = SqlDataSource1.ConnectionString

    Dim command1 As New SqlCommand("SELECT StaffDetails.StaffID, SUM(HolidayRequests.RequestTotalDays) AS Expr1 FROM HolidayRequests INNER JOIN StaffDetails ON HolidayRequests.Username = StaffDetails.UserName WHERE (StaffDetails.StaffID = staffID) GROUP BY StaffDetails.StaffID, HolidayRequests.ApprovalStatus HAVING (HolidayRequests.ApprovalStatus = N'approved')", conn)
    Dim command2 As New SqlCommand()
    conn.Open()
    Dim rdr As SqlDataReader
    rdr = command1.ExecuteReader
    Dim UpdateQuery As String
    While (rdr.Read())

        UpdateQuery = "UPDATE HolidayEntitlement set Holiday_Taken = @Expr1"
        command2.Parameters.AddWithValue("@Expr1", rdr("Expr1").ToString())

        'run update query

        command2.CommandText = UpdateQuery
        command2.ExecuteNonQuery()

        conn.Close()
    End While

以下错误: command2.ExecuteNonQuery:连接属性尚未初始化。

【问题讨论】:

为什么要关闭循环中的连接?至少使用using statement 进行连接(它会隐式关闭)。 【参考方案1】:

您好,您需要创建第二个命令对象。由于您正在从同一个命令对象中读取,因此您正在尝试执行更新语句。

此外,您正在关闭 while 循环内的连接。之后你必须这样做。

【讨论】:

【参考方案2】:

创建第二个命令。换句话说,一个光标用于阅读,另一个用于更新。

【讨论】:

以上是关于已经有一个打开的 DataReader 与此命令关联,必须先关闭的主要内容,如果未能解决你的问题,请参考以下文章

已经有一个打开的 DataReader 与此命令关联,必须先关闭

已经有一个与此命令关联的打开的 DataReader 必须首先关闭 linq [重复]

调用另一个 repo 时出错 - '已经有一个打开的 DataReader 与此命令关联,必须先关闭'

已经有一个打开的 DataReader 与此命令关联,必须先关闭

错误:已经有一个与此命令关联的打开DataReader,必须先关闭它。多个用户

entityframework 已经有一个与此命令关联的打开的 DataReader 必须先关闭