如何将值传递给SqlDataSource查询?

时间:2012-10-05 13:50:14

标签: c# asp.net

我在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语法。既不工作!

6 个答案:

答案 0 :(得分:1)

替换为

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

将@Name定义为参数

<SelectParameters>
    <asp:Parameter  DefaultValue="<%# Eval("Query") %>" Name="Name"  DbType="..." />
</SelectParameters>

答案 1 :(得分: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>

答案 2 :(得分:1)

提供的解决方案非常好。还应该注意的是,尝试将“值”直接放在查询中,您就是在接受SQL注入攻击。使用选择参数可以防止和保护您。

答案 3 :(得分:0)

我有同样的问题,我解决问题的懒惰方法是:

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

脏,容易,很可能不是正确的方法。

答案 4 :(得分:0)

我真的建议不要使用SqlDataSource控件。 SqlDataSource提供的领域很少是重用。

以编程方式进行数据库调用

如果您在单独的课程中进行通话(或者在DAL中更好),您将能够轻松地跨多个页面使用它。此外,当您的查询发生更改时,您只需在一个位置进行更改。

以下是使用实体框架访问数据库的示例

标记

<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");
}

答案 5 :(得分:0)

另一种无需编写代码即可实现目标的方法是使用隐藏字段并执行以下操作:

<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的任何控件 之前。