为什么在MySQL更新语句中出现“连接已经打开”错误?

问题描述:

我正在用Winforms,MySQL和C#做一个大学出勤项目。为什么在MySQL更新语句中出现“连接已经打开”错误?

因为我想在一个表格中更新“Total Absent”和“Total Present”。所以我写了这样的代码:

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() 

这引发错误“的连接已经打开”。如果我在循环之后放置更新语句,我只能得到最后一条记录。

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

+0

使用2个不同的连接,一个更新和一个选择阅读器循环 –

+0

谢谢。是我想使用差异连接只?或命令也?。 – Sagotharan

+1

我不知道回滚。所以很不幸我点击。 – Sagotharan

看着你R代码里面你已经取消了大部分的什么是不相关的打开或关闭连接后:

… 
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块中,以确保即使出现问题,连接也会关闭。

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

您正在打开while循环之外的连接,然后尝试再次打开相同的连接,在while循环内创建一个新的连接或断开连接并执行需要完成的操作,然后关闭它。

您可以使用此检查连接的状态:

if (myConnection.State != ConnectionState.Open) 

    myConnection.Open(); 

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

finally 

{

 myConnection.Close(); 

}