为什么我在 MySQL 更新语句期间收到"connection is already open"错误?



我正在用Winforms、MySQL和c#做一个大学出勤率项目。

我想在一个表中更新"总缺席"one_answers"总出席"。我为此写了代码:

int p = 0;
int a = 0;
string sno = "";
MySqlDataReader Reader;
command.CommandText = "select * from attendance_monthly_rpt";
connection.Open();
Reader = command.ExecuteReader();           
while (Reader.Read())
{
    p = 0;
    a = 0;
    sno = Reader[1].ToString();
    for (int k = 3; k <= 33; k++)
    {
        if ((Reader[k].ToString() == "P") || (Reader[k].ToString() =="OD"))
        {
            p += 1;
        }
        else if (Reader[k].ToString() == "Ab")
        {
            a += 1;
        }
    }
}
connection.Close();

现在我得到了"sno", "a", "p"值。但是我想在MySQL表中更新这条记录。所以我添加了一个UPDATE语句:

while (Reader.Read())
{
    p = 0;
    a = 0;
    sno = Reader[1].ToString();
    for (int k = 3; k <= 33; k++)
    {
        if ((Reader[k].ToString() == "P") || (Reader[k].ToString() =="OD"))
        {
            p += 1;
        }
        else if (Reader[k].ToString() == "Ab")
        {
            a += 1;
        }
    }           
    command.CommandText = "update attendance_monthly_rpt set tot_persent = " +
                          p + ", tot_absent = " + a + " where student_no = '" +
                          sno + "'";
    connection.Open();  // the connection is already open
    command.ExecuteNonQuery();
    connection.Close();
}
connection.Close()
这会抛出错误"连接已经打开"。如果我把update语句放在循环之后,我只得到最后一条记录。

请帮我更新每个"学生"的"Tot absent","Tot present"。

你可以用它来检查连接的状态:

if (myConnection.State != ConnectionState.Open)
{
    myConnection.Open();
}

,不要忘记使用try, catch和finally

finally
{
     myConnection.Close();
} 

删除大部分与打开或关闭连接无关的内容后,查看代码:

…
connection.Open();       // <--------------+
…                        //                |
                         //                |
while (…)                //                |
{                        //                |
    …                    //                |
    connection.Open();   // the connection is already open
    …
    connection.Close();  // <--------------+
}                        //                |
connection.Close()       // likewise, it'll already be closed here

现在很容易看出为什么在while循环第一次运行时连接已经打开。

适当:我建议您不要 .Open().Close()连接每一个命令。(除非必要,否则不应该保持联系,但你可能有点夸张了。:)相反,在开始更新之前打开连接一次,并在while循环后关闭它。并且,就像CodeBuzz已经建议的那样,将connection.Close()放在finally块中,以确保即使出现问题也关闭连接。

注::不要忘记.Dispose()所有的对象是IDisposable(即。数据读取器和连接对象),例如通过using块。

您在while循环外打开连接,然后尝试再次打开相同的连接,在while循环内创建新连接,或者保持连接打开并做需要做的事情,然后关闭它

最新更新