2013-05-08 59 views
0

我曾嘗試谷歌上搜索了很多東西,但無法找到答案 - ,所以我希望有人能幫助我!三層次選擇日期從兩個表

我想要做的事: 在我的WinForm應用程序,我需要通過一個下拉框,選擇計算機名,在選擇時,我的列表框將與有關計算機的一些數據(softwarename,版本之類的東西)

填充

組合框正在工作,但我只得到身份證,而不是所有其他領域。

我的列表視圖,它是使用數據庫調用,羅列如下:

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是我選擇計算機的組合框中的值。

數據庫: 我DATABSE看起來是這樣的:我pbs.twimg.com/media/BJw-wD9CMAACZiO.jpg:large需要像場:SoftwareOpComputer.Versie,SoftwareOpComputer.UpdateDatum,Software.Softwarenaam,Software.Ontwikkelaar。

當我使用這個方法,只使用一個表(我的應用程序的其他網頁)它的工作原理,但是當我使用這個畫面,需要2個表就不起作用。

+0

循環你爲什麼不使用JOIN? – Steve 2013-05-08 18:59:44

+0

'where software.IDSoftware = SoftwareOpComputer.IDSoftware'應該是一個連接嗎?或者'SoftwareOpComputer.IDSoftware'設置在其他地方? – devilfish17 2013-05-08 19:04:40

+0

你好,我從加入聽說過,但不知道如何處理。 – RunnicFusion 2013-05-08 19:04:55

回答

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 + "'"; 

這將產生軟件和SotwareOpComputer之間的連接。它返回所有從SoftwareSoftwareOpComputer表中的行已匹配ID排除不具有匹配的ID,然後將WHERE條件限制輸出的行。

不幸的是,你使用的方法clDatabase.executeSelect似乎沒有允許傳遞參數,以避免字符串連接。我建議你去搜索一下參數化查詢和SQL注入來實現這個代碼是如何薄弱

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 ... 
} 
+0

謝謝,但如何選擇值?這不工作:LVI.SubItems.Add((字符串)(DT.Rows [r] [「s.SoftwareNaam」])); ?。我的選擇:字符串SQL = 「SELECT * FROM軟件的內在JOIN SoftwareOpComputer C對s.IDSoftware = c.IDSoftware」 + 「其中c.IDComputer = '」 + ZoekId + 「'」; – RunnicFusion 2013-05-09 17:12:03

+0

當從DataRow讀取值時,不需要以's.'作爲前綴。只需'SoftwareNaam'就足夠了。調試時嘗試查看DataTable對象的Columns集合以檢查正確的列名稱。然後,您可以使用數據庫提供的適當交互式界面(例如Sql Server Management Studio for Sql Server或MS-Access for MDB文件等)來嘗試查詢。還可以查看循環遍歷錶行的已更改代碼沒有使用索引器'(r)' – Steve 2013-05-09 18:02:14

+1

謝謝,它的工作原理! – RunnicFusion 2013-05-09 19:47:09