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

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

于 2012-10-05T14:19:42.250 回答
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

用。。。来代替

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在该领域中提供的很少是重用。

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

如果您在单独的类中进行调用(或者在 a 中更好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");
}
于 2012-10-05T15:18:02.600 回答
0

我有同样的问题,我解决它的懒惰方法如下:

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

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

于 2012-10-05T13:54:10.830 回答
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 的任何控件之前。

于 2018-07-02T23:38:03.653 回答