三层从两个表中选择日期

时间:2013-05-08 18:55:30

标签: c# winforms combobox three-tier

我尝试过google很多东西,但找不到答案 - 所以我希望有人可以帮助我!

我正在尝试做什么: 在我的winform应用程序中,我需要通过组合框选择计算机名称,选择后,我的列表框将填充有关计算机的一些数据(软件名称,版本和内容)

组合框正在工作,但我只获得了id,而不是所有其他领域。

My Listview,正在使用数据库调用,如下所示:

clSoftwarePerPC SF = new clSoftwarePerPC();
DataTable DT = SF.SelectSoftware(ZoekId);



// voor iedere rij een nieuw nummer geven (r)
for (int r = 0; r < DT.Rows.Count; r++)
{
    LVI = new ListViewItem();
    // cdnummer als titel
    //LVI.Text = (string)(DT.Rows[r]["idComputer"]);
    LVI.Text = ((string)(DT.Rows[r]["IDInstallatie"]).ToString());
    // titels toevoegen in deze kolom
    LVI.SubItems.Add((string)(DT.Rows[r]["SoftwareNaam"]));
    LVI.SubItems.Add((string)(DT.Rows[r]["Ontwikkelaar"]));
    LVI.SubItems.Add((string)(DT.Rows[r]["Omschrijving"]));
    LVI.SubItems.Add((string)(DT.Rows[r]["Versie"]));
    LVI.SubItems.Add(((string)(DT.Rows[r]["UpdateDatum"]).ToString()));
    LVI.Tag = (((string)(DT.Rows[r]["IDInstallatie"]).ToString()));
    // alle opgevraagde velden weergeven
    lv.Items.Add(LVI);
}
// wanneer er records zijn
if (DT.Rows.Count > 0)
{
    // eerste rij selecteren
    lv.Items[0].Selected = true;
    lv.Select();
}

我的数据库调用(工作和测试)/ clSoftwarePerPC:

public DataTable SelectSoftware(string ZoekId)
{
    // selecteren van alle inhoud van tabel Computers en orderen op Merk naam
    // string SQL = "select * from SoftwareOpComputer order by IDComputer where Model = '" + ZoekId + "'";
    string SQL = "select * from Software, SoftwareOpComputer where software.IDSoftware = SoftwareOpComputer.IDSoftware and SoftwareOpComputer.IDComputer =  '" + ZoekId + "'";
    // uitoveren van query
    return clDatabase.executeSelect(SQL);
}

*现在选择:select * from [table names]我试图使用像这样的完整位置:Software.Version,但这也不起作用。 ZoekId是组合框中我选择计算机的价值。

数据库: 我的数据库看起来像这样:pbs.twimg.com/media/BJw-wD9CMAACZiO.jpg:large我需要以下字段:SoftwareOpComputer.Versie,SoftwareOpComputer.UpdateDatum,Software.Softwarenaam,Software.Ontwikkelaar。

当我使用这个方法并且只使用一个表(我的应用程序的其他页面)时,它可以工作,但是当我使用这个屏幕并且需要2个表时,它不起作用。

1 个答案:

答案 0 :(得分:0)

我会尝试使用连接。

 string SQL = "select c.Versie, c.UpdateDatum, s.Softwarenaam, s.Ontwikkelaarfrom " +
              "FROM Software s INNER JOIN SoftwareOpComputer c " + 
              "ON s.IDSoftware = c.IDSoftware " + 
              "WHERE c.IDComputer =  '" + ZoekId + "'";

这将在Software和SotwareOpComputer之间产生连接。它返回SoftwareSoftwareOpComputer表中具有匹配ID的所有行,不包括没有匹配ID的行,然后WHERE条件限制输出。

不幸的是,您使用的方法clDatabase.executeSelect似乎不允许传递参数以避免字符串连接。我建议你搜索一下Parametrized query和Sql Injection来实现这段代码的弱点

Here some documentation on JOIN

我希望改进的另一个方面是将行添加到ListView

的循环
foreach (DataRow row in DT.Rows)
{
    LVI = new ListViewItem();
    LVI.Text = row.Field<string>("IDInstallatie"));
    LVI.SubItems.Add(row.Field<string>("SoftwareNaam"));
    .... etc ... 
}