多条件组合查询的问题是,某条件可能有,也可能没有,这样sql的条件语句就不是固定的,随着查询条件的变化而变化,
而数据源控件SqlDatasource尽管可以执行参数化的查询,却不能对查询条件进行动态组合,要想进行动态查询,就必须
组合查询语句,动态对SqlDatasource的查询语句赋值,这有两种方式: 一种是,组合select查询的条件语句,直接给SqlDatasource的selectCommand属性赋值。
一种是,组合条件语句,赋值给SqlDataSource的filterExpression属性,利用SqlDatasource的筛选功能来进行动态条件查询。
在page_load事件里,对SqlDatasource进行上述两种sql语句动态赋值后,第一种情况可以正常取得结果,而第二种则无效,
而在设计状态下,通过属性窗口对filterExpression赋值,也可以取得正常的筛选结果。 请问为什么?怎么才能使手工编码对filterExpression的赋值生效呢? 除了上述两种方法外,在asp.net里进行动态条件组合查询,有其他“最佳实践”的方法吗?
或者不使用数据源控件,而自己手工编码控制数据的查询和数据绑定,这样可能更好点?
而数据源控件SqlDatasource尽管可以执行参数化的查询,却不能对查询条件进行动态组合,要想进行动态查询,就必须
组合查询语句,动态对SqlDatasource的查询语句赋值,这有两种方式: 一种是,组合select查询的条件语句,直接给SqlDatasource的selectCommand属性赋值。
一种是,组合条件语句,赋值给SqlDataSource的filterExpression属性,利用SqlDatasource的筛选功能来进行动态条件查询。
在page_load事件里,对SqlDatasource进行上述两种sql语句动态赋值后,第一种情况可以正常取得结果,而第二种则无效,
而在设计状态下,通过属性窗口对filterExpression赋值,也可以取得正常的筛选结果。 请问为什么?怎么才能使手工编码对filterExpression的赋值生效呢? 除了上述两种方法外,在asp.net里进行动态条件组合查询,有其他“最佳实践”的方法吗?
或者不使用数据源控件,而自己手工编码控制数据的查询和数据绑定,这样可能更好点?
MSDN上有现成的例子<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"><HTML>
<BODY>
<FORM runat="server"> <p>Show all employees with the following title:
<asp:DropDownList
id="DropDownList1"
runat="server"
AutoPostBack="True">
<asp:ListItem Selected>Sales Representative</asp:ListItem>
<asp:ListItem>Sales Manager</asp:ListItem>
<asp:ListItem>Vice President, Sales</asp:ListItem>
</asp:DropDownList></p> <asp:SqlDataSource
id="SqlDataSource1"
runat="server"
ConnectionString="<%$ ConnectionStrings:MyNorthwind%>"
SelectCommand="SELECT EmployeeID,FirstName,LastName,Title FROM Employees"
FilterExpression="Title='{0}'">
<FilterParameters>
<asp:ControlParameter Name="Title" ControlId="DropDownList1" PropertyName="SelectedValue"/>
</FilterParameters>
</asp:SqlDataSource> <p><asp:GridView
id="GridView1"
runat="server"
DataSourceID="SqlDataSource1"
AutoGenerateColumns="False">
<columns>
<asp:BoundField Visible="False" DataField="EmployeeID" />
<asp:BoundField HeaderText="First Name" DataField="FirstName" />
<asp:BoundField HeaderText="Last Name" DataField="LastName" />
</columns>
</asp:GridView> </FORM>
</BODY>
</HTML>根据dorpdownlist选择的值来过滤
手写代码的话,可以自己拼下SQL语句
后面动态加条件.可以简化很多逻辑处理.
Table
ID,Code,Name,Memo public DataTable SearchCustomer(Int64 id,string code,string name,string memo)
{ //组合你的查询
string strSql="";
strSql+=" ID,";
strSql+=" Code,";
strSql+=" Name,";
strSql+=" Memo";
strSql+=" FROM";
strSql+=" Customer";
strSql+=" WHERE 1=1"; //根据传入的参数组成语句(当然,默认值是不能用的,比如ID,你在数据库中就不能有 0 了,通常也不会有 0 的)
if (id!=0)
{
strSql += " ID=" + id.ToString();
} if (string.IsNullOrEmpty(code))
{
strSql += " Code like '%" + code + "'";
}
if (string.IsNullOrEmpty(name))
{
strSql += " name like '%" + name + "'%";
} if (string.IsNullOrEmpty(memo))
{
strSql += " memo like '%" + memo + "'%";
} ///这里省掉,定义你的数据访问,比如 SqlDBHelper dt = db.GetDataTable(strSql); return dt; }
也可以把前面那段放到存储过程中
------------
绝对不可取
拼sql 条件这种方法是最烂的
<asp:sqlDataSource ID="EmployeeDetailsSqlDataSource"
SelectCommand="SELEC T EmployeeID, LastName, FirstName FROM Employees WHER E (EmployeeName = @EmpName or @EmpName is null) "
这样,@EmpName没有赋值就等于不要这个条件来查询了啊
小弟不才,愿请教anncesky ,请给予指正其不妥之处?谢谢