如何使用2个表中的数据填充c#windows窗体列表视图?

时间:2016-01-22 09:37:45

标签: c# sql listview

我正在做一个"加载"按钮,用于从SQL数据库加载所有数据,将它们放在列表视图中。

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);
}

显然,这不起作用,但我无法找到另一种方法来做到这一点。 我试图单独做两个请求,但我再次错过了这个逻辑。

2 个答案:

答案 0 :(得分: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个值。因此,您需要首先使用列索引上的resultat.IsDbNull()检查它们(sql查询中的位置) 或者,您可以使用INNER JOIN而不是LEFT JOIN来仅获取两个表中存在的行。

答案 1 :(得分:0)

你应该改变一些事情,然后变得非常容易。

  1. 制作一个SQL查询。只需将您的桌子加在一起并选择您需要的东西。
  2. 将数据库访问权限与填写列表视图分开。将结果放在数组或数据表中。
  3. 使用您的数据,您可以轻松地绑定它或迭代它以生成ListViewItems。