2011-08-01 32 views
1

我正在用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

回答

5

看着你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塊。

2

您正在打開while循環之外的連接,然後嘗試再次打開相同的連接,在while循環內創建一個新的連接或斷開連接並執行需要完成的操作,然後關閉它。

5

您可以使用此檢查連接的狀態:

if (myConnection.State != ConnectionState.Open) 

    myConnection.Open(); 

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

finally 

{

 myConnection.Close(); 

}

相關問題