2012-02-09 87 views
4

我在一个非常简单的应用程序中使用了SqlDataSource。我允许用户通过文本框为SDS的选择命令设置几个搜索参数,为每个参数设置一个文本框(认为txtFirstName,txtLastName等)。我打算使用按钮单击事件处理程序来设置SqlDataSource的SelectCommand属性,默认情况下它将返回所有记录(用于我的目的)。我想完善这个选择命令,可能会添加一个或多个WHERE子句,具体取决于用户是否在我的任何文本框中输入搜索条件。SqlDataSource中的动态WHERE子句

例的情况下,我没有说清楚:

默认情况下,我的SqlDataSource的SelectCommand属性将是这样的:如果用户在txtFirstName进入“鲍勃”

SELECT * FROM MyTable 

,我想到SelectCommand属性是这样的:如果用户在txtLastName进入“琼斯”

SELECT * FROM MyTable WHERE [FirstName]='Bob' 

,我想SelectCommand属性看起来像这样:

SELECT * FROM MyTable WHERE [FirstName]='Bob' AND [LastName]='Jones' 

我的问题:
有没有一种方法可以动态地创建这些凡未经我子句不必测试空文本框和手工构建一个WHERE子句?

我的小应用程序只有三个参数,所以蛮力强迫我通过这种方式并不痛苦,但我想知道是否有更简单的方法来做到这一点,这是可能的,我需要添加更多的参数未来。另外我可能想要添加通配符搜索。

回答

2

正如您所说,构建该查询并不难,因为您始终在where子句中对字段进行AND操作。

请注意,如果你这样做,不要格式化字符串。使用SqlParameters来避免SQL注入:http://en.wikipedia.org/wiki/SQL_injection

因此,您可以从WHERE开始,对于每个具有值的文本框,附加[(fieldName)] = @(fieldname)并绑定该sql参数。

参见:http://msdn.microsoft.com/en-us/library/system.data.sqlclient.sqlparameter.aspx

如果你愿意使用LINQ到SQL或实体框架,看到这个谓词建设者:http://www.albahari.com/nutshell/predicatebuilder.aspx

2

你可以设置为ConvertEmptyStringToNull="false"并且做:

SELECT * 
FROM MyTable 
WHERE [FirstName] = CASE @firstname WHEN '' THEN [FirstName] END AND 
    [LastName] = CASE @lastname WHEN '' THEN [LastName] END 

或者您可以设置转换ertEmptyStringToNull =“true”,并做到:

SELECT * 
FROM MyTable 
WHERE [FirstName] = ISNULL(@firstname, [FirstName]) AND 
    [LastName] = ISNULL(@lastname,[LastName]) 

在这类原因,如果用户离开文本框为空,CASEISNULL声明引起where语句的每一部分进行比较,以自身信息,并返回TRUE和产生相同的记录,就好像该条款的那部分完全不存在一样。这是一个很好且简单的解决方案,它将查询和参数保持为静态,并将逻辑推送到SQL端。

但是,与仅仅说"SELECT * FROM MyTable"相比,它将具有(小)性能。那些CASEISNULL操作不是免费的;)如果这是一个问题,Bryanmac的解决方案是一个完全可以接受的解决方案。

4

如果您使用的是SqlDataSource控件,并且您的参数值来自页面控件,则可以提供ControlParameters并使用具有短路参数的静态where子句。这可能只是快速敲出一些代码的票据。

<asp:SqlDataSource ID="SqlDataSource1" runat="server" 
    ConnectionString="<%$ ConnectionStrings:AdventureworksConnectionString %>" 
    SelectCommand=" SELECT FirstName, LastName, Age 
        FROM Contacts 
        WHERE ([email protected] or @FirstName = '') 
        AND (LastName = @LastName or @LastName = '' 
        AND (Age = @Age or @Age = 0" > 
     <SelectParameters> 
      <asp:ControlParameter Name="FirstName" ControlID="TBFirstName" Type="String" /> 
      <asp:ControlParameter Name="LastName" ControlID="TBLastName" Type="String" /> 
      <asp:ControlParameter Name="Age" ControlID="TBAge" Type="Int16" /> 
     </SelectParameters> 
    </asp:SqlDataSource> 
+0

我可以做你类似的东西我的问题在这里:http://stackoverflow.com/questions/25309010/how-to-make-multiple-dropdownlist-change-based-on-selection-from-其他-dropdownl – SearchForKnowledge 2014-08-14 13:25:11