Sql 当读卡器关闭时调用Read的尝试无效。读卡器打开时出错

Sql 当读卡器关闭时调用Read的尝试无效。读卡器打开时出错,sql,asp.net,Sql,Asp.net,我有以下代码: { c = Request.QueryString["city"]; SqlConnection objConn2 = new SqlConnection(ConfigurationManager.ConnectionStrings["ConnectionString"].ConnectionString); SqlCommand objCmd2; SqlDataReader objRdr2; // String strCmd2; objConn2.Open();

我有以下代码:

{
  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:在以下情况下调用读取的尝试无效 读卡器已关闭

谁能帮我解释一下为什么我会出现这个错误

Close()
应该在
之后,而
循环如下

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

objRdr2.Close();
objConn2.Close();
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();
objRdr2.Read();
Label122.InnerText = (string)objRdr2["Name"].ToString().ToUpper();
objRdr2.Close();
objConn2.Close();
然后在
标签122中。InnerText也将是查询的第一个值。

Close()
应位于
之后,而
循环如下

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

objRdr2.Close();
objConn2.Close();
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();
objRdr2.Read();
Label122.InnerText = (string)objRdr2["Name"].ToString().ToUpper();
objRdr2.Close();
objConn2.Close();

然后在
Label122中。InnerText也将是查询中的第一个值。

您应该删除
objRdr2.Close()来自while循环
它应该在while循环之后

如下

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


        objConn2.Close();

    }

   objRdr2.Close();

如果在下一个循环中循环时在内部关闭它,则指定的错误将抛出您应该删除
objRdr2.close()来自while循环
它应该在while循环之后

如下

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


        objConn2.Close();

    }

   objRdr2.Close();

如果在下一个循环中循环时在内部关闭它,则指定的错误将抛出

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