2

mainSQLクラスのSELECTコマンドで使用するドロップダウンリストからの選択にアクセスして保存する方法を理解しようとしています。

詳細は次のとおりです。

DropDownList(Page.aspxというページ):

    <asp:DropDownList 
    ID="selectInfo1" 
    runat="server" 
    AutoPostBack="True"
    DataTextField="Info1"
    DataValueField="Info1Key"
    DataSourceID="SqlDB" >
    </asp:DropDownList>

(別のクラスファイルで)DDLにアクセスしようとしている関数:

public List<ListInfo> getList()
{
List<ListInfo> sList = new List<ListInfo>();
ListInfo objList = null;
    //This is where I need to declare a variable called Info1Key and set it to the value of the ddl!
string queryString = "SELECT [UniqueID], [Date], [Info1], [Info2], [Info3] FROM [ReportedSales] WHERE ([Info1] = ' " + Info1Key + "') ORDER BY [Date]";
using (SqlConnection connection = new SqlConnection(sqlConString))
{
    using (SqlCommand command = new SqlCommand(queryString, connection))
    {
        command.Connection.Open();
        using (SqlDataReader dataReader = command.ExecuteReader())
        {
            while (dataReader.Read())
            {
                objList = new ListInfo();
                objList.ID = Convert.ToInt16(dataReader["UniqueID"]);
                objList.Date = Convert.ToDateTime(dataReader["Date"]);
                objList.Info1 = (dataReader["Info1"] as int?) ?? 0;
                objList.Info2 = (dataReader["Info2"] as int?) ?? 0;
                objList.Info3 = (dataReader["Info3"] as int?) ?? 0;
                sList.Add(objList);
            }
        }
    }
}
return sList;
}

これは、getListメソッドを呼び出す唯一の関数です(かなり確かです)-

    private void FillListActivity()
    {
        List<ListInfo> objList = new List<ListInfo>();
        objList = new mainSQL().getList();

        ReportingGV.DataSource = objList;
        ReportingGV.DataBind();
    }

新しい問題-DDLを変更してもGVは変更されなくなりました。

それを修正できる1つの方法は、Page.aspx.csのPage_Loadを次のように変更することでした。

元は:

 protected void Page_Load(object sender, EventArgs e)
{
    if(!isPostBack)
    {
        FillSalesActivity();
    }
}

動作していますが、問題が発生しますか?:

    protected void Page_Load(object sender, EventArgs e)
    {
        FillSalesActivity();
    }
4

1 に答える 1

4

外部クラスがUI要素(ドロップダウンリストなど)について何も知らない、または気にしないようにする必要があります。可能な限りUIに依存しないようにする必要があります。

代わりに、この場合に実行したいのは、値を関数に渡すことです。したがって、関数のシグネチャを次のように変更します。

public List<ListInfo> getList(string Info1Key)
{
    // The code is the same, just use the Info1Key parameter that's been passed to the function.
}

次に、次のような関数を呼び出します。

private void FillSalesActivity()
{
    List<SalesInfo> objSalesList = new List<SalesInfo>();
    objSalesList = new mainSQL().getSalesList(selectInfo1.SelectedValue);

    SalesReportingGV.DataSource = objSalesList;
    SalesReportingGV.DataBind();
}

注意すべきいくつかのこと:

  • SelectedValue関数を呼び出す前に、ページにエラーチェックを含めて、値があることを確認することをお勧めします。
  • コードにはSQLインジェクションの脆弱性があるため、SQLインジェクションの脆弱性を実際に調べる 必要があります。ドロップダウンリストからの値であり、それらを制御していると思われる場合でも、クライアントからの値を暗黙的に信頼しないでください。あなたはそうしない。クライアントは、必要に応じて任意の値を送信できます。その値には、関数が必要なすべてのアクセス許可を使用してデータベースに対して陽気に実行するSQLコードを含めることができます。「パラメータ化されたクエリ」、さらにはORMフレームワークの使用を検討してください。Linq To Sqlのようなものは、セットアップが非常に速く、学習曲線が短く、多くの機能を利用できます。
于 2013-01-08T21:46:56.147 に答える