-2

以下を生成するドロップダウンリストがあります。

SiteId の可能な値:

 "Select Site"
 "1"
 "2"
 "3"
 "4"

Select Site がデフォルト値であることに注意してください。

    <asp:DropDownList ID="ddlSite" DataSourceID = "siteDS" runat="server" OnSelectedIndexChanged="ddlSite_SelectedIndexChanged" AutoPostBack="true" DataTextField="SiteName" 
            DataValueField="SiteId" AppendDataBoundItems="true">
            <asp:ListItem>Select Site</asp:ListItem>
    </asp:DropDownList>

次のクエリがありますが、より良い方法があるかどうかはわかりません

     // this checks to see if the value is Select Site or an actual siteid (1,2,3)
     int siteID = 0;
     int Site;
     bool result = Int32.TryParse(ddlSite.SelectedValue, out Site);
     if (result)
     {
        siteID = Site;
     }


     if (result)
     {
        NTDS.SelectCommand = "SELECT *  FROM [tbl1] where siteId = " + siteID;
     }
     else
     {
        NTDS.SelectCommand = "SELECT *  FROM [tbl1]";
     }

if else がある理由は、ユーザーが選択した場合: サイトを選択します。値がサイトを選択する siteId がないため、SELECT を実行したくありません。

これを行うより効率的な方法はありますか?

4

2 に答える 2

3

まず第一に、Sql インジェクションについて読むことをお勧めします。クエリを実際にパラメータ化する必要があります。

次に、DataText と DataValue の両方のプロパティがあるため、"SelectSite" をTextプロパティにValueして、0 または -1 (または単に空) にすることができます。

いずれにせよ、次のようなことができます。

if (Int32.TryParse(ddlSite.SelectedValue, out Site) && Site  > 0)
{
    // Parameterized SELECT
}
else
{
  ...
}

SiteSiteIdの両方が不要

于 2013-03-28T17:05:59.047 に答える
1
// your initial item or better off you can add a client side validator
// preventing them from submitting the page with the initial value, also call Page.IsValid on server side to make sure they didn't hacked your client side validation.
if (ddlSite.SelectedIndex != 0)
{
   var siteId = 0;
   if (int.TryParse(ddlSite.SelectedValue, out siteId)
   {
      // then here build a helper for adding conditions if siteId is present.
      // try using parameterized queries for avoiding sql injection.
   }
   else
   {
      // call your same helper without siteId and it should be smart enough to
      // return a query without where clause.
   }
}

パラメータ化されたクエリの詳細については、こちらをご覧ください。

于 2013-03-28T17:11:00.217 に答える