2016-01-22 47 views
0

我正在做一個「加載」按鈕來加載SQL數據庫中的所有數據,將它們放入列表視圖中。如何用2個表中的數據填充一個C#窗體窗體列表視圖?

if(lstEnsemble.Items.Count == 0) 
{ 
    MySqlConnection connexion = OpenConnection(); 
    MySqlCommand reqRemplissageClient = new MySqlCommand("select * from client order by idClient ASC;", connexion); 
    MySqlCommand reqRemplissagePanne = new MySqlCommand("select * from Panne order by idClient ASC;", connexion); 

    MySqlDataReader resultatClient = reqRemplissageClient.ExecuteReader(); 
    MySqlDataReader resultatPanne = reqRemplissageClient.ExecuteReader(); 

    while (resultatClient.Read() && resultatPanne.Read()) 
    { 
     ListViewItem item = new ListViewItem(resultatClient["nomCli"].ToString()); 
     item.SubItems.Add(resultatClient["prenomCli"].ToString()); 
     if (resultatClient["idClient"] == resultatPanne["idClient"]) 
     { 
      item.SubItems.Add(resultatPanne["appareil"].ToString()); 
     } 
     item.SubItems.Add(resultatClient["villeCli"] + " " + resultatClient["cpCli"] + " " + resultatClient["rueCli"]); 
     item.SubItems.Add(resultatClient["telCli"].ToString()); 
     if (resultatClient["idClient"] == resultatPanne["idClient"]) 
     { 
      item.SubItems.Add(resultatPanne["description"].ToString()); 
      item.SubItems.Add(resultatPanne["dateEntree"].ToString()); 
     } 
     item.SubItems.Add(resultatClient["mailCli"].ToString()); 
     lstEnsemble.Items.Add(item); 
    } 

    CloseConnection(connexion); 
} 

這顯然不起作用,但我無法設法找到另一種方法來做到這一點。 我試圖分別做兩個請求,但我又錯過了這個邏輯。

+0

你是否認爲/ _hope_那個'idClient'完全匹配兩個表?或者是否可以並且有效地將行與不同的'idClient'值組合起來? –

回答

1

在你的問題中,你不完全清楚你正在使用什麼樣的數據。看來你假設(或更好的希望idClient值完全匹配在兩個表中。

我假定你真正想做一個JOIN。如果不是這樣,我會再次刪除這篇文章。

所以,你應該用一個JOIN做只有一個查詢:

if(lstEnsemble.Items.Count == 0) 
{ 
    string sql = @"SELECT nomCli, prenomCli, appareil, villeCli, rueCli, 
        cpCli, telCli, description, dateEntree, mailCli 
        FROM client LEFT JOIN Panne ON (client.idClient = Panne.idClient)"; 

    MySqlConnection connexion = OpenConnection(); 
    MySqlCommand request = new MySqlCommand(sql, connexion); 

    MySqlDataReader resultat = requestExecuteReader(); 
    while (resultat.Read()) 
    { 
     ListViewItem item = new ListViewItem(resultat["nomCli"].ToString()); 
     item.SubItems.Add(resultat["prenomCli"].ToString()); 
     item.SubItems.Add(resultat["appareil"].ToString()); 
     item.SubItems.Add(resultat["villeCli"] + " " + resultat["cpCli"] + " " + resultat["rueCli"]); 
     item.SubItems.Add(resultat["telCli"].ToString()); 
     item.SubItems.Add(resultat["description"].ToString()); 
     item.SubItems.Add(resultat["dateEntree"].ToString()); 
     item.SubItems.Add(resultat["mailCli"].ToString()); 
     lstEnsemble.Items.Add(item); 
    } 

    CloseConnection(connexion); 
} 

但是你應該知道,在clientPanne沒有匹配行的行會出現在結果null值。因此,您需要首先在列索引(sql查詢中的位置)上使用resultat.IsDbNull()來檢查它們。
或者,您可以使用INNER JOIN而不是LEFT JOIN來僅獲取兩個表中存在的行。

+0

我感覺遲緩。我完全忘記了你可以加入桌子。非常感謝您的快速回答!祝你今天愉快 – Fenwyr

0

你應該改變一些東西的話,就變得很容易。

  1. 做一個簡單的SQL查詢。只需加入你的表格並選擇你需要的東西。
  2. 將數據庫訪問分開填充您的列表視圖。把你的結果放在一個數組或數據表中。
  3. 使用可用的數據,您可以輕鬆地綁定它或遍歷它以生成ListViewItems。
+0

也謝謝你,我忘記了你可以加入表格......對我感到羞恥 – Fenwyr

相關問題