C# System.InvalidOperationException:当读卡器关闭时调用读取的尝试无效

C# System.InvalidOperationException:当读卡器关闭时调用读取的尝试无效,c#,C#,我的以下代码中有以下错误: 当读卡器关闭时调用Read的尝试无效 我测试了我的代码,但是我没有发现代码中的错误。有人能告诉我我的代码哪里不正确,或者为什么会发生这个错误吗 /*start calculate grade of SA2 */ SqlConnection con = new SqlConnection(); con.ConnectionString = ConfigurationManager.ConnectionStrings["con1"].Connection

我的以下代码中有以下错误:

当读卡器关闭时调用Read的尝试无效

我测试了我的代码,但是我没有发现代码中的错误。有人能告诉我我的代码哪里不正确,或者为什么会发生这个错误吗

   /*start calculate grade of SA2 */
   SqlConnection con = new SqlConnection();
   con.ConnectionString = ConfigurationManager.ConnectionStrings["con1"].ConnectionString;
    if (Convert.ToString(ddlexam.SelectedItem) == "SA2")
    {


        int SA2;
        string grade = null;
        SqlCommand comm;
        SqlDataReader dr;
        con.Open();
        comm = new SqlCommand("select SA2 from terms_marks where admission_no=@admission_no and sub_id=@sub_id", con);
        comm.Parameters.AddWithValue("@sub_id", sub_id);
        comm.Parameters.AddWithValue("@admission_no", admission_no);
        dr = comm.ExecuteReader();
        while (dr.Read())
        {
            SA2 = Convert.ToInt32(dr["SA2"].ToString());
            markspercentage = (SA2 * 100) / maxmarks;
            if (markspercentage >= 91 && markspercentage <= 100)
            {
                grade = "A1";
            }
            else if ((markspercentage >= 81) && (markspercentage <= 90))
            {
                grade = "A2";
            }
            else if (markspercentage >= 71 && markspercentage <= 80)
            {
                grade = "B1";
            }
            else if (markspercentage >= 61 && markspercentage <= 70)
            {
                grade = "B2";
            }
            else if (markspercentage >= 51 && markspercentage <= 60)
            {
                grade = "C1";
            }
            else if (markspercentage >= 41 && markspercentage <= 50)
            {
                grade = "C2";
            }
            else if (markspercentage >= 33 && markspercentage <= 40)
            {
                grade = "D";
            }
            else if (markspercentage >= 21 && markspercentage <= 32)
            {
                grade = "E1";
            }
            else if (markspercentage >= 0 && markspercentage <= 20)
            {
                grade = "E2";
            }
        }
        dr.Close();
        cmd = new SqlCommand();
        cmd.Connection = con;
        cmd.CommandText = "CreategradeDetails";
        cmd.CommandType = CommandType.StoredProcedure;
        cmd.Parameters.AddWithValue("@st_id", st_id);
        cmd.Parameters.AddWithValue("@roll_no", roll_no);
        cmd.Parameters.AddWithValue("@admission_no", admission_no);
        cmd.Parameters.AddWithValue("@sub_id", sub_id);

        cmd.Parameters.AddWithValue("@FA1", DBNull.Value);
        cmd.Parameters.AddWithValue("@FA2", DBNull.Value);
        cmd.Parameters.AddWithValue("@SA1", DBNull.Value);
        cmd.Parameters.AddWithValue("@Total_FirstTerm", DBNull.Value);
        cmd.Parameters.AddWithValue("@FA3", DBNull.Value);
        cmd.Parameters.AddWithValue("@FA4", DBNull.Value);
        cmd.Parameters.AddWithValue("@SA2", grade);
        cmd.Parameters.AddWithValue("@Total_SecondTerm", DBNull.Value);
        cmd.Parameters.AddWithValue("@Total_FA", DBNull.Value);
        cmd.Parameters.AddWithValue("@Total_SA", DBNull.Value);
        cmd.Parameters.AddWithValue("@GrandTotal", DBNull.Value);

        result = cmd.ExecuteNonQuery();
        con.Close();

    }
    /*end calculate SA2 grade */
    /* start calculate Total_SecondTerm grade;*/
    if (Convert.ToString(ddlexam.SelectedItem) == "SA2")
    {
        int TotalST;
        string grade = null;
        SqlCommand comm;
        SqlDataReader dr;
        con.Open();
        comm = new SqlCommand("select Total_SecondTerm from terms_marks where admission_no=@admission_no and sub_id=@sub_id", con);
        comm.Parameters.AddWithValue("@sub_id", sub_id);
        comm.Parameters.AddWithValue("@admission_no", admission_no);
        dr = comm.ExecuteReader();
        if (dr.Read())
        {
            TotalST = Convert.ToInt32(dr["Total_SecondTerm"].ToString());
            dr.Close();
            comm = new SqlCommand("select Total_SecondTerm from max_marks where admission_no=@admission_no and sub_id=@sub_id", con);
            comm.Parameters.AddWithValue("@sub_id", sub_id);
            comm.Parameters.AddWithValue("@admission_no", admission_no);
            if (dr.Read())
            {
                total_STmaxmarks = Convert.ToInt32(dr["Total_SecondTerm"].ToString());
                secondterm_percentage = (TotalST * 100) /total_STmaxmarks;


            }
            dr.Close();
            if (secondterm_percentage >= 91 && secondterm_percentage <= 100)
            {
                grade = "A1";
            }
            else if ((secondterm_percentage >= 81) && (secondterm_percentage <= 90))
            {
                grade = "A2";
            }
            else if (secondterm_percentage >= 71 && secondterm_percentage <= 80)
            {
                grade = "B1";
            }
            else if (secondterm_percentage >= 61 && secondterm_percentage <= 70)
            {
                grade = "B2";
            }
            else if (secondterm_percentage >= 51 && secondterm_percentage <= 60)
            {
                grade = "C1";
            }
            else if (secondterm_percentage >= 41 && secondterm_percentage <= 50)
            {
                grade = "C2";
            }
            else if (secondterm_percentage >= 33 && secondterm_percentage <= 40)
            {
                grade = "D";
            }
            else if (secondterm_percentage >= 21 && secondterm_percentage <= 32)
            {
                grade = "E1";
            }
            else if (secondterm_percentage >= 0 && secondterm_percentage <= 20)
            {
                grade = "E2";
            }

        }

        dr.Close();
        cmd = new SqlCommand();
        cmd.Connection = con;
        cmd.CommandText = "CreategradeDetails";
        cmd.CommandType = CommandType.StoredProcedure;
        cmd.Parameters.AddWithValue("@st_id", st_id);
        cmd.Parameters.AddWithValue("@roll_no", roll_no);
        cmd.Parameters.AddWithValue("@admission_no", admission_no);
        cmd.Parameters.AddWithValue("@sub_id", sub_id);

        cmd.Parameters.AddWithValue("@FA1", DBNull.Value);
        cmd.Parameters.AddWithValue("@FA2", DBNull.Value);
        cmd.Parameters.AddWithValue("@SA1", DBNull.Value);
        cmd.Parameters.AddWithValue("@Total_FirstTerm", DBNull.Value);
        cmd.Parameters.AddWithValue("@FA3", DBNull.Value);
        cmd.Parameters.AddWithValue("@FA4", DBNull.Value);
        cmd.Parameters.AddWithValue("@SA2", DBNull.Value);
        cmd.Parameters.AddWithValue("@Total_SecondTerm", grade);
        cmd.Parameters.AddWithValue("@Total_FA", DBNull.Value);
        cmd.Parameters.AddWithValue("@Total_SA", DBNull.Value);
        cmd.Parameters.AddWithValue("@GrandTotal", DBNull.Value);

        result = cmd.ExecuteNonQuery();
        con.Close();

    }
    /* end calculate Total_SecondTerm grade;*/

您正在关闭此行上的读卡器:

dr.Close();
四行之后,你要做的是:

if (dr.Read())
错误信息非常清楚:关闭读卡器后无法使用它

请注意,这是您正在使用的
dr
的第二个实例,而不是第一个实例——它是您在if块内创建的实例,您在其中有注释:

/*end calculate SA2 grade */
/* start calculate Total_SecondTerm grade;*/
我的建议是,您应该稍微清理一下代码,以减少导致问题的混乱,并使查找问题变得更加困难。此外,您还应该使用实现一次性模式的with类,如
System.Data.SqlClient.SqlConnection
System.Data.SqlClient.SqlCommand
,以及
System.Data.SqlClient.SqlDataReader
。例如,这里有一种编写与数据读取器交互的代码的干净方法:

using (var conn = new System.Data.SqlClient.SqlConnection(usingConnectionString))
{
    using (var command = new System.Data.SqlClient.SqlCommand(usingQuery, conn))
    {
        using (var reader = command.ExecuteReader())
        {
            // do your work here...
        }
    }
}

请注意,我从未调用过
Close
,因为一旦代码存在,就会使用
作用域自动调用

您正在这一行关闭读卡器:

dr.Close();
四行之后,你要做的是:

if (dr.Read())
错误信息非常清楚:关闭读卡器后无法使用它

请注意,这是您正在使用的
dr
的第二个实例,而不是第一个实例——它是您在if块内创建的实例,您在其中有注释:

/*end calculate SA2 grade */
/* start calculate Total_SecondTerm grade;*/
我的建议是,您应该稍微清理一下代码,以减少导致问题的混乱,并使查找问题变得更加困难。此外,您还应该使用实现一次性模式的with类,如
System.Data.SqlClient.SqlConnection
System.Data.SqlClient.SqlCommand
,以及
System.Data.SqlClient.SqlDataReader
。例如,这里有一种编写与数据读取器交互的代码的干净方法:

using (var conn = new System.Data.SqlClient.SqlConnection(usingConnectionString))
{
    using (var command = new System.Data.SqlClient.SqlCommand(usingQuery, conn))
    {
        using (var reader = command.ExecuteReader())
        {
            // do your work here...
        }
    }
}

请注意,我从未调用过
Close
,因为一旦代码存在,就会使用
作用域自动调用

您正在这一行关闭读卡器:

dr.Close();
四行之后,你要做的是:

if (dr.Read())
错误信息非常清楚:关闭读卡器后无法使用它

请注意,这是您正在使用的
dr
的第二个实例,而不是第一个实例——它是您在if块内创建的实例,您在其中有注释:

/*end calculate SA2 grade */
/* start calculate Total_SecondTerm grade;*/
我的建议是,您应该稍微清理一下代码,以减少导致问题的混乱,并使查找问题变得更加困难。此外,您还应该使用实现一次性模式的with类,如
System.Data.SqlClient.SqlConnection
System.Data.SqlClient.SqlCommand
,以及
System.Data.SqlClient.SqlDataReader
。例如,这里有一种编写与数据读取器交互的代码的干净方法:

using (var conn = new System.Data.SqlClient.SqlConnection(usingConnectionString))
{
    using (var command = new System.Data.SqlClient.SqlCommand(usingQuery, conn))
    {
        using (var reader = command.ExecuteReader())
        {
            // do your work here...
        }
    }
}

请注意,我从未调用过
Close
,因为一旦代码存在,就会使用
作用域自动调用

您正在这一行关闭读卡器:

dr.Close();
四行之后,你要做的是:

if (dr.Read())
错误信息非常清楚:关闭读卡器后无法使用它

请注意,这是您正在使用的
dr
的第二个实例,而不是第一个实例——它是您在if块内创建的实例,您在其中有注释:

/*end calculate SA2 grade */
/* start calculate Total_SecondTerm grade;*/
我的建议是,您应该稍微清理一下代码,以减少导致问题的混乱,并使查找问题变得更加困难。此外,您还应该使用实现一次性模式的with类,如
System.Data.SqlClient.SqlConnection
System.Data.SqlClient.SqlCommand
,以及
System.Data.SqlClient.SqlDataReader
。例如,这里有一种编写与数据读取器交互的代码的干净方法:

using (var conn = new System.Data.SqlClient.SqlConnection(usingConnectionString))
{
    using (var command = new System.Data.SqlClient.SqlCommand(usingQuery, conn))
    {
        using (var reader = command.ExecuteReader())
        {
            // do your work here...
        }
    }
}
请注意,我从未调用过
Close
,因为一旦代码存在,就会使用
作用域自动调用

问题在于:

dr.Close();  //Here
cmd = new SqlCommand();
cmd.Connection = con;
cmd.CommandText = "CreategradeDetails";
在读卡器读取之前,您已关闭连接。当连接打开时,读卡器将只读。

问题在于:

dr.Close();  //Here
cmd = new SqlCommand();
cmd.Connection = con;
cmd.CommandText = "CreategradeDetails";
在读卡器读取之前,您已关闭连接。当连接打开时,读卡器将只读。

问题在于:

dr.Close();  //Here
cmd = new SqlCommand();
cmd.Connection = con;
cmd.CommandText = "CreategradeDetails";
在读卡器读取之前,您已关闭连接。当连接打开时,读卡器将只读。

问题在于:

dr.Close();  //Here
cmd = new SqlCommand();
cmd.Connection = con;
cmd.CommandText = "CreategradeDetails";

在读卡器读取之前,您已关闭连接。当连接打开时,阅读器将只读。

下次,请先在Google中搜索您的问题。作为补充说明,您应该将重复代码(例如嵌套的
if
)重构为一个方法,该方法采用百分比并返回一个等级,可能是
字符串GetGrade(int-mark)下次,请先在Google中搜索您的问题。作为补充说明,您应该将重复代码(例如嵌套的
if
)重构为一个方法,该方法采用百分比并返回一个等级,可能是
字符串GetGrade(int-mark)下次,请先在Google中搜索您的问题。作为补充说明,您应该将重复代码(例如嵌套的
if
)重构为一个方法,该方法采用百分比并返回一个等级,可能是
字符串GetGrade(int-mark)下次,请先在Google中搜索您的问题。作为补充说明,您应该将重复代码(例如嵌套的
if
)重构为一个方法,该方法采用百分比并返回一个等级,可能是
字符串GetGrade(int-mark)谢谢你的回复问题已解决谢谢你的回复问题已解决谢谢你的回复问题已解决谢谢你的回复问题已解决谢谢你的回复问题已解决