多条件组合查询的问题是,某条件可能有,也可能没有,这样sql的条件语句就不是固定的,随着查询条件的变化而变化, 
            而数据源控件SqlDatasource尽管可以执行参数化的查询,却不能对查询条件进行动态组合,要想进行动态查询,就必须 
            组合查询语句,动态对SqlDatasource的查询语句赋值,这有两种方式:             一种是,组合select查询的条件语句,直接给SqlDatasource的selectCommand属性赋值。 
            一种是,组合条件语句,赋值给SqlDataSource的filterExpression属性,利用SqlDatasource的筛选功能来进行动态条件查询。 
            在page_load事件里,对SqlDatasource进行上述两种sql语句动态赋值后,第一种情况可以正常取得结果,而第二种则无效, 
            而在设计状态下,通过属性窗口对filterExpression赋值,也可以取得正常的筛选结果。             请问为什么?怎么才能使手工编码对filterExpression的赋值生效呢?             除了上述两种方法外,在asp.net里进行动态条件组合查询,有其他“最佳实践”的方法吗? 
            
            或者不使用数据源控件,而自己手工编码控制数据的查询和数据绑定,这样可能更好点? 

解决方案 »

  1.   

    使用数据源控件
     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语句
      

  2.   

    where 1=1
    后面动态加条件.可以简化很多逻辑处理.
      

  3.   

    在page_Init事件里面写filterExpression属性也可以试试
      

  4.   

    harryheart 发的是msdn的例子,我们要做的是动态添加或加入查询条件。可否给一个实际的例子看看。
      

  5.   

    我的通常的解决办法是.在DAL中(放在存储过程中也行)自动生成以下格式的代码,每个DAL都有一个专用于不定条件查询的方法,例如:表结构:
    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;        }
    也可以把前面那段放到存储过程中
      

  6.   

    where 1=1 
    ------------
    绝对不可取
    拼sql 条件这种方法是最烂的
      

  7.   

    你可以这样写就好了,比如:
    <asp:sqlDataSource ID="EmployeeDetailsSqlDataSource" 
      SelectCommand="SELEC T EmployeeID, LastName, FirstName FROM Employees WHER E (EmployeeName = @EmpName or @EmpName is null) "
    这样,@EmpName没有赋值就等于不要这个条件来查询了啊
      

  8.   

    或请参考http://blog.csdn.net/powerboy/archive/2007/11/08/1873057.aspx
      

  9.   


    小弟不才,愿请教anncesky ,请给予指正其不妥之处?谢谢