1

私の ASP Web ページには、プロジェクトに必要な多数のスキルをリストしたチェックボックス リストがあります。私がやりたいことは、このチェックボックスリストから複数の項目をチェックしてから、チェックされたものに関連するスキルを持つすべてのユーザーを一覧表示する検索機能を作成することです。これを機能させることはできますが、すべてのユーザーを表示するのではなく、1 人のユーザーのみを表示します。

たとえば、チェックボックス リストから「Planning」と「Designing」をチェックすると、必要なスキルを持っているユーザー「Peter」と「Vicki」がリストされますが、私のコードでは Peter しか表示されません。私のコードは以下の通りです:

StringBuilder sb2 = new StringBuilder();

foreach (ListItem item in chkGeneralSkills.Items)
        {
            if (item.Selected)
            {
                sb2.AppendFormat("{0}  ", item.Text);


                    using (SqlConnection oConn = new SqlConnection(ConfigurationManager.ConnectionStrings["connString"].ToString()))
                    {
                        string sql = "SELECT us.FName + ' ' + us.SName As 'Name', " +
                                 "sk.SkillsID, sl.SkillTitle " +
                                 "FROM Users us " +
                                 "LEFT JOIN Skills sk ON sk.UserID = us.UserID " +
                                 "LEFT JOIN SkillsListing sl ON sl.SkillsListingID = sk.SkillsListingID " +
                                 "WHERE sl.SkillTitle LIKE '" + item.Text + "'";
                        try
                        {
                            oConn.Open();
                            SqlCommand cmd = new SqlCommand(sql, oConn);
                            SqlDataReader reader = cmd.ExecuteReader();
                            chkMatchedUsers.DataTextField = "Name";
                            chkMatchedUsers.DataValueField = "Name";
                            chkMatchedUsers.DataSource = reader;

                            chkMatchedUsers.DataBind();

                            oConn.Close();
                        }
                        catch (Exception)
                        {
                            throw;
                        }
                    }
            }
        }
4

2 に答える 2

1

アイテムをループしているループでは、変数を追加し、その値を変数に割り当てます。次に、その変数をwhere句で使用します。また、SQL接続の開始を開始する前に、そのforeachループを終了します。あなたにそれが明確であることを願っています。

于 2013-02-16T13:43:48.467 に答える
0

選択した各アイテムのデータベースにヒットしていますが、ピーターがスキルの1つを持ち、ヴィッキーがもう1つを持っているという私の仮定が正しければ、最初の応答を無視し、2番目の応答をオーバーライドします。

すでに持っているものを使用して、アイテムをループするwhere句を作成してから、選択したアイテムごとではなく、データベースを1回だけ呼び出す必要があります。これにより、データベースのラウンドトリップも減少し、結果にVickyとPeterのどちらか一方ではなく、両方が返されるはずです。

テストされていないコード-達成する方法のアイデアを提供します。

var sb = new StringBuilder();
    foreach (ListItem item in chkGeneralSkills.Items)
    {
        if (item.selected)
        {       
           sb.Append("'" + item.text + "',");
        }
    }

    using (SqlConnection oConn = new SqlConnection(ConfigurationManager.ConnectionStrings["connString"].ToString()))
    {
        string sql = "SELECT us.FName + ' ' + us.SName As 'Name', " +
                    "sk.SkillsID, sl.SkillTitle " +
                    "FROM Users us " +
                    "LEFT JOIN Skills sk ON sk.UserID = us.UserID " +
                    "LEFT JOIN SkillsListing sl ON sl.SkillsListingID = sk.SkillsListingID " + 
                    " WHERE sl.SkillTitle IN (" + sb.ToString() + ")";
        try
        {
            oConn.Open();
            SqlCommand cmd = new SqlCommand(sql, oConn);
            SqlDataReader reader = cmd.ExecuteReader();
            chkMatchedUsers.DataTextField = "Name";
            chkMatchedUsers.DataValueField = "Name";
            chkMatchedUsers.DataSource = reader;

            chkMatchedUsers.DataBind();

            oConn.Close();
        }
        catch (Exception)
        {
            throw;
        }
    }
于 2013-02-16T13:35:51.900 に答える