2012-02-09 90 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