0

私は多くのことをグーグルで検索しようとしましたが、答えを見つけることができませんでした.誰かが私を助けてくれることを願っていました!

私がやろうとしていること:私のwinformアプリケーションでは、コンボボックスからコンピューター名を選択する必要があります。選択すると、リストボックスにコンピューターに関するデータ(ソフトウェア名、バージョンなど)が入力されます

コンボボックスは機能していますが、他のすべてのフィールドではなく、ID のみを取得します。

データベース呼び出しを使用している私のリストビューは、次のとおりです。

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]I've try to use the full location like this one:Software.Versionですが、これもうまくいきませんでした。ZoekId は、コンピューターを選択したコンボボックスの値です。

データベース: 私のデータベースは次のようになります: pbs.twimg.com/media/BJw-wD9CMAACZiO.jpg:large 次のようなフィールドが必要です: SoftwareOpComputer.Versie、SoftwareOpComputer.UpdateDatum、Software.Softwarenaam、Software.Ontwikkelaar。

このメソッドを使用して 1 つのテーブル (アプリケーションの他のページ) のみを使用すると機能しますが、この画面を使用して 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 の間の結合が生成されます。一致する ID を持たない行を除いて、一致するSoftwareおよびSoftwareOpComputerテーブルからすべての行が返され、WHERE 条件によって出力が制限されます。ID

残念ながら、clDatabase.executeSelect文字列の連結を回避するためにパラメーターを渡すことを許可していないように見えるメソッドを使用しています。このコードがいかに弱いかを理解するために、パラメータ化されたクエリと SQL インジェクションについて検索することをお勧めします。

ここにJOINに関するいくつかのドキュメントがあります

改善したいもう 1 つの側面は、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 に答える