2012-09-03 68 views
2

我有一個程序,用c#實時列出當前在列表框中運行的所有進程。我有一個問題插入到MySQL數據庫。我從進程的線程列表框中檢索數據,然後保存到數據庫。當列表框刷新時,我遇到了問題,重複將相同的數據插入到mysql數據庫中。得到當前正在運行的進程

有人可以幫助我嗎?

這是示例代碼

foreach (String item in listBox1.Items) 
{ 
    cmd.CommandText = "SELECT * FROM sample"; 
    MySqlDataReader msdr = cmd.ExecuteReader(); 

    while (msdr.Read()) 
    { 
     var items = msdr["log"].ToString(); 
     if(items != item) 
     { 
      String query = "INSERT INTO sample values('','"+item+"')"; 
      cmd.CommandText = query; 

      using(MySqlDataReader reader = cmd.ExecuteReader()) 
      { 
       reader.Close(); 
      } 
     } 
    } 
    msdr.Close(); 
} 
+0

與您的程序明顯的問題是,當你做'如果(項目=項目!)'例如,如果在數據庫中結果的第一行包含一個會發生什麼不相同的項目將插入一個新項目到數據庫,但在數據庫記錄集的第二(或第三或第n)行可能有一個項目是相同的。這種情況會導致重複。 – mortb

回答

1

第一:內INSERT聲明從未使用字符串。 總是使用Parameters

二:這取決於其中此代碼調用。如果在刷新事件中調用事件,則可能正確的做法是瞭解是否存在實際更改的內容,並且僅在正面結果上執行SQL查詢。

+0

感謝您的建議先生。 – user1643284

+0

其實代碼在線程列表框中調用。這樣當列表框刷新時會自動插入到數據庫中。但不幸的是我得到了相同的數據重複刷新。我的想法是首先檢索數據庫中的所有數據並與列表框項目匹配。但它似乎並沒有工作 – user1643284

+0

@ user1643284:可能是最好將代碼移動到某個命令,如按鈕單擊? – Tigran

1

喜歡的東西(未測試):

foreach (String item in listBox1.Items) 
{ 
    cmd.CommandText = "SELECT COUNT(*) as cnt FROM sample WHERE log = @log"; 
    cmd.Parameters.AddWithValue("@log", item) 
    bool found = ((int)cmd.ExecuteScalar()) > 0 

    if(!found) 
    { 

     String query = "INSERT INTO sample values('',@log)"; 
     cmd.CommandText = query; 
     cmd.Parameters.AddWithValue("@log", item); 
     cmd.ExecuteNonQuery(); 

    } 
} 
+0

我在這部分出錯了bool found =((int)cmd.ExecuteScalar())> 0 – user1643284

+0

你能告訴我們什麼錯誤嗎? – mortb

+0

未處理的異常 – user1643284

相關問題