2012-10-05 65 views
1

我在ASP.NET中创建一个ListView,并基于CodeProject here给出的示例。我想使SqlDataSource的Select命令成为动态的,以便从会话提供的值生成一个值。我试过不同的可能性,这里是我想要的一个例子:如何将值传递给SqlDataSource查询?

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

回答

0

我有同样的问题,我的偷懒的办法解决这是应该做如下:

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

脏,容易,最有可能不是正确的方式来做到这一点。

+0

这是不好的。它打开你的查询,直到一个SQL注入攻击。切勿直接替换SQL查询中的变量,而不要先清理它们。 – user1437891

+0

正如我所说,不是正确的做法,也不会导致问题,如果您已经在更换前已经验证了值 –

1

替换

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

,并定义为@Name参数

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

我现在试图使用这个,但我怎样才能得到“<%#” Eval(“Query”)%>“来自父DataList的项目吗? – alwaysVBNET

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> 
+0

这是一个体面的解决方法,但我认为用户会更好地编程设置数据并将其绑定到控件而不是使用SqlDataSource。 –

1

提供的解决方案非常好。还应该注意的是,试图将“价值”直接放在查询中,你会打开自己的SQL注入攻击。使用选择参数可防止并保护您免受此影响。

0

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

编程方式使DB调用

如果您在一个单独的类电话(甚至更好的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"); 
}