2016-12-02 6 views
0

2つのチェックボックスリストがあり、1つは部門と1つはコース用です。 1つの部門には多くのコースがありますので、選択した部門で提供されている別のチェックボックスリストにコースを10つしか表示しないため、自分の部門を選ぶことができます。チェックボックスリストで選択された値に基づいてSQL文を書き込む

前駆情報:私が選択した部門のリストを取得するためにこれを使用

protected void GetDiv() 
{ 
    string query = " Select distinct uio.OFFERING_ORGANISATION as [Div], ou.FES_FULL_NAME as [Division] From UNIT_INSTANCE_OCCURRENCES uio " + 
        " inner join ORGANISATION_UNITS ou on uio.OFFERING_ORGANISATION = ou.ORGANISATION_CODE " + 
        " inner join REPORTYEARS ry on uio.CALOCC_OCCURRENCE_CODE = ry.CAL_OCC " + 
        " Where ry.REPORT_YEAR = (select DETAILS from EF_REFERENCE_DATA Where REC_TYPE = 'Rep_Year') and uio.OFFERING_ORGANISATION is not null Order By [Division] "; 

    cbDivSelect.DataSource = GetData(query); 
    cbDivSelect.DataTextField = "DIVISION"; 
    cbDivSelect.DataValueField = "DIV"; 
    cbDivSelect.DataBind(); 
} 

private DataTable GetData(string query) 
{ 
    string constr = ConfigurationManager.ConnectionStrings["DatabaseName"].ConnectionString; 

    using (SqlConnection con = new SqlConnection(constr)) 
    { 
      using (SqlCommand cmd = new SqlCommand()) 
      { 
       cmd.CommandText = query; 

       using (SqlDataAdapter sda = new SqlDataAdapter()) 
       { 
        cmd.Connection = con; 
        sda.SelectCommand = cmd; 

        using (DataSet ds = new DataSet()) 
        { 
         DataTable dt = new DataTable(); 
         sda.Fill(dt); 
         return dt; 

        } 
       } 
      } 
    } 
} 

これは私がDivisionsチェックボックスのリストにデータをバインドする私のコードです

protected void cbDivSelect_SelectedIndexChanged(object sender, EventArgs e) 
{ 
     foreach (ListItem item in cbDivSelect.Items) 
     { 
      if (item.Selected) Divisions.Add(item); 
     } 
    } 

これがコースを表示する:

protected void GetCourse() 
    { 
     foreach(ListItem item in Divisions) 
     { 
      string GetCourses = "SELECT distinct Course_Code,Course_Code + ' - ' + Marketing_Title AS COURSE, Parent FROM e_prospectus WHERE (Div = '" + item.Value.ToString() + "') ORDER BY Course_Code"; 
      cbCourseSelect.DataSource = GetData(GetCourses); 
      cbCourseSelect.DataTextField = "COURSE"; 
      cbCourseSelect.DataValueField = "Course_Code"; 
      cbCourseSelect.DataBind(); 
     } 
    } 

現在、選択されているリストの中で最も低いコースしか表示されていません。私はデータソースを変更し続けるため、蓄積しませんが、コードを変更できます私が欲しいものを収容する?おかげ

+0

パラメータ化されたクエリ/ストアドプロシージャを使用してください。文字列連結を使用してクエリを構築しないでください。予期せぬ構文エラーや、さらに重要なのはSQLインジェクション攻撃に脆弱になります。 – ADyson

+0

'GetData(GetCourses)'はリストを返します?その場合、 'GetData()'の結果を 'DataSource'と' AddRange() 'として使用するリストを作成するだけです。バインディングを更新する必要があるので、 'BindingList'を使うのがベストです。 – Mats391

+0

パラメータ化されたクエリを完全に認識しています。文字列としてクエリを作成し、パラメータとして追加することを好むだけです。 –

答えて

0

それにDataSourceMerge()として1 DataTableGetData()の結果を作成します。

これはメモリ全体を構成します。 1つのクエリを作成してデータベースからすべてのコースを一度に取得するという、FakeisMeのアプローチを使用すると予想されるコースの数に応じて、より高速になる場合があります。

0
 string divisions = string.empty ; 
    foreach(ListItem item in Divisions) 
      { 
      divisions = divisions + item.Value.tostring() + ","; 
      } 

    if (divisions != string.empty) 
    { 
    divisions = divisions.Remove(divisions.Length -1, 1) 
    string GetCourses = "SELECT distinct Course_Code,Course_Code + ' - ' + Marketing_Title AS COURSE, Parent FROM e_prospectus 
    WHERE (Div in (" + divisions + ")) ORDER BY Course_Code"; 
       cbCourseSelect.DataSource = GetData(GetCourses); 
       cbCourseSelect.DataTextField = "COURSE"; 
       cbCourseSelect.DataValueField = "Course_Code"; 
       cbCourseSelect.DataBind(); 
    } 
+0

これは最後の部門の構文が間違っているカンマを残していませんか? –

+0

あなたは正しいです。お返事を – FakeisMe

+0

編集しました、自分自身でこれを追加しました:) –

関連する問題