1

私は ASP.NET で ListView を作成しており、CodeProject here で与えられた例に基づいています。セッションから提供された値から値が生成されるように、SqlDataSource の Select コマンドを動的にしたいと考えています。私はさまざまな可能性を試してみました。ここに私が望むものの例があります:

<asp:SqlDataSource ID="SqlDataSource1" runat="server" 
    ConnectionString="<%$ ConnectionStrings:TestDatabaseConnectionString %>" 
    SelectCommand="SELECT * FROM [Contacts] WHERE [Name] = <%# Eval("value") %> " >
</asp:SqlDataSource>

ASP を使用してそのような値を渡すにはどうすればよいですか? また、C# のバック ページでクエリを作成し、同様に構文SelectCommand = "<%# Eval("Query") %>"を使用してクエリを作成してみました。@valueどちらも機能しません!

4

6 に答える 6

1

これでうまくいくはずです。次のようにSessionParameterを定義し、を確認しName=Sql parameter name and SessionField is same as your session fieldます。必要に応じてDBTypeとDefaultValue...

<asp:SqlDataSource ID="SqlDataSource1" runat="server" 
    SelectCommandType="Text"
    ConnectionString="<%$ ConnectionStrings:TestDatabaseConnectionString %>" 
    SelectCommand="SELECT * FROM [Contacts] WHERE [Name] = @ParaName"

    <SelectParameters>
        <asp:SessionParameter 
               Name="ParaName" 
               SessionField="YourSessionFieldName" 
               DbType="String" 
               DefaultValue="" />
    </SelectParameters>
</asp:SqlDataSource>
于 2012-10-05T14:02:17.127 に答える
1

提供されるソリューションは非常に優れています。「値」をクエリに直接配置しようとすると、SQL インジェクション攻撃にさらされることにも注意してください。選択パラメーターを使用すると、これを防止および保護できます。

于 2012-10-05T14:19:42.250 に答える
1

と置換する

SelectCommand="SELECT * FROM [Contacts] WHERE [Name] = @Name"

@Name をパラメーターとして定義します

<SelectParameters>
    <asp:Parameter  DefaultValue="<%# Eval("Query") %>" Name="Name"  DbType="..." />
</SelectParameters>
于 2012-10-05T13:55:08.893 に答える
0

コントロールを使用しないことをお勧めしSqlDataSourceます。ASqlDataSourceは、再利用の領域ではほとんど提供しません。

プログラムで DB 呼び出しを行う

別のクラスで呼び出しを行う場合 (または、より良いDAL場合)、複数のページで簡単に使用できます。また、クエリに変更が発生した場合は、1 か所で変更するだけで済みます。

以下は、Entity Framework を使用してデータベースにアクセスするサンプルです。

マークアップ

<asp:DropDownList ID="ddlTest" runat="server"></asp>

コードビハインド

public List<Record> GetAllRecordsByUserName(string credentials)
{
    List<Record> recordList;
    using (CustomEntities context = new CustomEntities())
    {

        IQueryable<Record> recordQuery = from records in context.Records
                                              where records.UserName == credentials
                                              select records; 
        recordList = recordQuery.ToList<Record>();
    }
    return recordList;
}

public void ValidateAndBind(string username)
{
    List<Record> recordList = GetAllRecordsByUserName(username);

    // Do validation here

    ddlTest.DataSource = recordList;
    ddlTest.DataBind();
}

protected void Page_Load(object sender, EventArgs e)
{
    ValidateAndBind("test.username");
}
于 2012-10-05T15:18:02.600 に答える
0

私は同じ問題を抱えていましたが、それを解決するための私の怠惰なアプローチは次のようにすることでした:

command.CommandText = item.Query.Replace("@Value", Value);
command.ExecuteNonQuery();

汚い、簡単で、おそらく適切な方法ではありません。

于 2012-10-05T13:54:10.830 に答える
0

コード ビハインドなしで目標を達成するもう 1 つの方法は、非表示フィールドを使用して次のことを行うことです。

<asp:HiddenField runat="server" ID="HfieldID" Value='<%# Eval("value")%>'/>
<asp:SqlDataSource ID="SqlDataSource1" runat="server" ConnectionString="<%$ ConnectionStrings:TestDatabaseConnectionString %>" SelectCommand="SELECT * FROM [Contacts] WHERE [Name] = @Name">
    <SelectParameters>
        <asp:ControlParameter Name="Name" PropertyName="Value" ControlID="HfieldID" DbType="String" />
    </SelectParameters>
</asp:SqlDataSource>

この SqlDataSource を使用するすべてのコントロールの前に必ず配置してください。

于 2018-07-02T23:38:03.653 に答える