none
下拉問題 RRS feed

  • 問題

  • DropDownList1有A,B,C各代表資料庫不同資料表,

    DropDownList2有A,B,C為上述DropDownList1各代表不同資料表的內的欄位,如A代表登入日期,B代表性別,C出生日期

    TextBox1輸入我要查詢的條件,和一個Button1送出鈕產生初我要的GridView1資料出現

    請教一下要怎可以寫出二個下拉選單可以讓他自動連結到他要的資料表和欄位查詢

    目前我用這方法是可以,但決的方法不太對,可否指導一下該如何更改才對

    謝謝!!

        If DropDownList1.SelectedItem.Value = "A" Then
                If DropDownList2.SelectedItem.Value = "A" Then
                    SQL = "Select  * From A資料表 where A欄位 LIKE TextBox1要查詢的資料
                         ElseIf DropDownList2.SelectedItem.Value = "B" Then
                    SQL = "Select  * From A資料表 Where B欄位 LIKE TextBox1要查詢的資料
                           ElseIf DropDownList2.SelectedItem.Value = "C" Then
                    SQL = "Select  * From A資料表 Where C欄位 LIKE TextBox1要查詢的資料
                                          End If
            ElseIf DropDownList1.SelectedItem.Value = "B" Then
                If DropDownList2.SelectedItem.Value = "A" Then
                    SQL = "Select  * From B資料表 where A欄位 LIKE TextBox1要查詢的資料
                           ElseIf DropDownList2.SelectedItem.Value = "B" Then
                    SQL = "Select  * From B資料表 Where B欄位 LIKE TextBox1要查詢的資料
                         ElseIf DropDownList2.SelectedItem.Value = "C" Then
                    SQL = "Select  * From B資料表 Where C欄位 LIKE TextBox1要查詢的資料
                                              End If
            ElseIf DropDownList1.SelectedItem.Value = "C" Then
                If DropDownList2.SelectedItem.Value = "A" Then
                    SQL = "Select  * From C資料表 where A欄位 LIKE TextBox1要查詢的資料
                             ElseIf DropDownList2.SelectedItem.Value = "B" Then
                    SQL = "Select  * From C資料表 Where B欄位 LIKE TextBox1要查詢的資料
                ElseIf DropDownList2.SelectedItem.Value = "C" Then
                    SQL = "Select  * From C資料表 Where C欄位 LIKE TextBox1要查詢的資料
                                            End If
                      End If

    2012年5月28日 上午 01:40

解答

  • 那麼為何不使用DropDownList1.SelectedItem.Value 來輔助組合你的SQL

    像是這樣的方法,
      SQL = "Select  * From " & DropDownList1.SelectedItem.Value  & " where  " &  DropDownList2.SelectedItem.Value  & " LIKE TextBox1要查詢的資料

    然後DropDownList1 和 DropDownList2 則是把關鍵字換成value

    如果有安全性考量的話,也可以利用另一個小Function 搭配Switch case方式轉換 SelectedItem.Value 的文字成 資料表名稱 以及 欄位名稱之類。

    此外記得再利用參數化的方式重新整理整個架構避免被攻擊


    • 已編輯 Bruce_柏 2012年5月28日 上午 02:44
    • 已標示為解答 檸檬水 2012年5月28日 上午 05:48
    2012年5月28日 上午 02:42
  • 選擇A他就固定為A資料表。選擇B就是固定為B資料表

    那麼您的SQL就用動態方式組合就好了

    DropDownList1 & DropDownList2的item value就弄成是您的TableName及ColumnName

    只是您要注意一點就是SQL Injection問題

    由於SQL是Dynamic的,建議您可以改成用Store procedure方式去exec sql 


    軟體開發領域裡區區一個迷途工程師
    MyBlog: http://www.dotblogs.com.tw/ian/
    開發ASP.NET您要瞭解的基楚

    • 已標示為解答 檸檬水 2012年5月28日 上午 05:48
    2012年5月28日 上午 03:09
    版主

所有回覆

  • 您的DropDownList1及DropDownList2裡的item是寫死的嗎?

    您的DropDownList1.SelectedItem.Value = "A",這裡的A是資料表名稱,那A是固定寫死的值還是說DropDownList1的item是變動的,而SQL是直接抓取

    item的值來組成SQL的?


    軟體開發領域裡區區一個迷途工程師
    MyBlog: http://www.dotblogs.com.tw/ian/
    開發ASP.NET您要瞭解的基楚

    2012年5月28日 上午 02:00
    版主
  • 選擇A他就固定為A資料表。選擇B就是固定為B資料表。

    item是用來組成SQL沒錯。

    2012年5月28日 上午 02:38
  • 那麼為何不使用DropDownList1.SelectedItem.Value 來輔助組合你的SQL

    像是這樣的方法,
      SQL = "Select  * From " & DropDownList1.SelectedItem.Value  & " where  " &  DropDownList2.SelectedItem.Value  & " LIKE TextBox1要查詢的資料

    然後DropDownList1 和 DropDownList2 則是把關鍵字換成value

    如果有安全性考量的話,也可以利用另一個小Function 搭配Switch case方式轉換 SelectedItem.Value 的文字成 資料表名稱 以及 欄位名稱之類。

    此外記得再利用參數化的方式重新整理整個架構避免被攻擊


    • 已編輯 Bruce_柏 2012年5月28日 上午 02:44
    • 已標示為解答 檸檬水 2012年5月28日 上午 05:48
    2012年5月28日 上午 02:42
  • 選擇A他就固定為A資料表。選擇B就是固定為B資料表

    那麼您的SQL就用動態方式組合就好了

    DropDownList1 & DropDownList2的item value就弄成是您的TableName及ColumnName

    只是您要注意一點就是SQL Injection問題

    由於SQL是Dynamic的,建議您可以改成用Store procedure方式去exec sql 


    軟體開發領域裡區區一個迷途工程師
    MyBlog: http://www.dotblogs.com.tw/ian/
    開發ASP.NET您要瞭解的基楚

    • 已標示為解答 檸檬水 2012年5月28日 上午 05:48
    2012年5月28日 上午 03:09
    版主
  • 大家都提到了,請透過parameter來預防SQL injection攻擊。

    這邊提一個比較上層層次的設計:請用三層式設計方式。

    1. 訂一個商業邏輯來代表物件的職責與行為。
    2. 將不同資料表來源,定義為不同的Dao物件,都實作同樣的資料存取介面。
    3. 透過下拉式選單,來決定商業邏輯物件上,資料存取介面的實際DAO instance該裝載哪一個DAO。
    4. DAO的方法就跟頁面與商業邏輯無關。只根據參數的條件,撈自己所屬這張表的相關資料。

    這樣設計,才會乾淨。


    授人以魚,三餐之需;授人以漁,終生之用。
    希望各位發問的朋友,得到的是如何釣魚的知識。之後也可以分享給別人,釣魚的知識。而不是肚子餓了,就上來討魚吃。

    若您的程式碼有SQL injection的問題,在修改完畢之前,我不願意給您任何解答。因為解決了您的程式問題,造成更大的系統漏洞問題,還不如讓程式壞掉。

    請參考:SQL injection簡介與解決方式

    常用資源參考:


    小弟的blog: In 91,wiki: my wiki

    2012年5月28日 上午 05:23
    版主