【问题标题】:Invalid attempt to call Read when reader is closed. error while reader is open阅读器关闭时调用 Read 的尝试无效。阅读器打开时出错
【发布时间】:2015-05-22 11:21:35
【问题描述】:

我有以下代码:

{
  c = Request.QueryString["city"];
  SqlConnection objConn2 = new SqlConnection(ConfigurationManager.ConnectionStrings["ConnectionString"].ConnectionString);

SqlCommand objCmd2;
SqlDataReader objRdr2;
//  String strCmd2;
objConn2.Open();

objCmd2 = new SqlCommand("SELECT * FROM subject_details WHERE Roll_no = " +"'" + c + "'", objConn2);

objRdr2 = objCmd2.ExecuteReader();

while (objRdr2.Read())
{
    Label122.InnerText = (string)objRdr2["Name"].ToString().ToUpper();

    objRdr2.Close();
    objConn2.Close();

}

这段代码运行得很好,突然我得到了错误:

System.InvalidOperationException:尝试调用 Read 时无效 阅读器已关闭。

谁能帮助我为什么会出现这个错误

【问题讨论】:

  • 请使用sql参数传递那个城市。如果恰好包含'(sql 注入),您的代码将失败(或更糟)

标签: sql asp.net


【解决方案1】:

Close() 应该在while 循环之后,如下所示

while (objRdr2.Read())
    {
        Label122.InnerText = (string)objRdr2["Name"].ToString().ToUpper();
    }

objRdr2.Close();
objConn2.Close();

但上面的代码设置为Label122.InnerText 查询中的最后一个值。所以你应该在查询中添加TOP 1

objCmd2 = new SqlCommand("SELECT TOP 1* FROM subject_details WHERE Roll_no = " +
"'" + c + "'", objConn2);

然后Label122.InnerText 将是您查询的第一个值。您还可以删除while 循环,如下所示

objRdr2.Read();
Label122.InnerText = (string)objRdr2["Name"].ToString().ToUpper();
objRdr2.Close();
objConn2.Close();

那么Label122.InnerText 也将是查询中的第一个值。

【讨论】:

    【解决方案2】:

    你应该从 while 循环中删除 objRdr2.Close(); 它应该在while循环之后

    如下图

    while (objRdr2.Read())
        {
            Label122.InnerText = (string)objRdr2["Name"].ToString().ToUpper();
    
    
            objConn2.Close();
    
        }
    
       objRdr2.Close();
    

    如果你在下一个循环的while循环中关闭它,你指定的错误将会抛出

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多