0

我试过用谷歌搜索很多东西,但找不到答案——所以我希望有人能帮助我!

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

组合框正在工作,但我只得到 id,而不是所有其他字段。

我的 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 个表时,它不起作用。

4

1 回答 1

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似乎不允许传递参数以避免字符串连接。我建议您搜索有关参数化查询和 Sql 注入以了解此代码的弱点

这里有一些关于 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 ... 
}
于 2013-05-08T19:10:54.173 回答