今天做一個簡單的網上書店 在做搜尋商品頁時用到了ListView分頁,即將根據商品名稱或描述搜尋到的商品分頁,我將資料集中查詢某一頁的sql語句定義為:
SELECT *
FROM (SELECT Id, ProductID, Name, Description, Image, Listprice, Numinstock, CategoryId,
row_number() OVER (ORDER BY id) rownum
FROM Catalog
WHERE (Name LIKE '%' + LTRIM(RTRIM(@mmNameStr)) + '%') OR
(Description LIKE '%' + LTRIM(RTRIM(@mmNameStr)) + '%')) t
WHERE t .rownum > @startRowIndex AND
t .rownum <= @startRowIndex + @maximumRows
將查詢所有滿足條件的記錄條數的查詢定義為:
SELECT COUNT(*) AS Expr1
FROM Catalog
WHERE (Name LIKE '%' + LTRIM(RTRIM(@mmNameStr)) + '%') OR
(Description LIKE '%' + LTRIM(RTRIM(@mmNameStr)) + '%')
這樣便成功分頁了。但接下來又遇到了一個難題:
就是要實現一個更複雜的搜尋功能,增加根據商品種類查詢:
這時有兩種解決方案:一是修改查詢某一頁的sql語句,將兩個查詢條件整合到一起,不過我感覺這樣安全性不是很好,除非用預存程序。
第二種方案將根據種類查詢的條件單獨定義:
//查詢某一頁的sql語句
SELECT *
FROM (SELECT id, productid, name, description, image, listprice, numinstock, categoryid,
row_number() OVER (ORDER BY id) rownum
FROM catalog
WHERE categoryid = @categoryid) t
WHERE t .rownum > @startRowIndex AND
t .rownum <= @startRowIndex + @maximumRows
//查詢所有滿足條件的記錄條數的查詢
SELECT COUNT(*) FROM Catalog where CategoryId=@categoryid
最後我選擇了第二種方法,但在添加查詢某一頁的sql語句時categoryid參數老是不能自動添加上,無奈只能比著mmNameStr參數手動添加,並在查詢結果頁面載入的時候修改objectDataSource的SelectMethod和SelectCountMethod,可是添加完後測試老是報“未能找到帶參數的非泛型方法”的錯誤,後來我發現原始碼中有:
<SelectParameters>
<asp:QueryStringParameter Name="mmNameStr" QueryStringField="name"
Type="String" />
</SelectParameters>
於是我又添加了:
<SelectParameters>
<asp:QueryStringParameter Name="categoryid" QueryStringField="CatId" Type="Int32"/>
</SelectParameters>
可修改完後還是報“未能找到帶參數的非泛型方法”。
整了好久都沒解決,反正我知道,錯誤的根源肯定就是,在添加根據種類查詢某一頁的sql語句時參數不能自動添加。
後來我又一想乾脆再添加一個ObjectDataSource,當搜尋結果頁載入的時候修改ListView的DataSourceID,說做就做。
修改完成後,又給新加的ObjectDataSource添加了下面的代碼:
<SelectParameters>
<asp:QueryStringParameter Name="categoryid" QueryStringField="CatId" Type="Int32"/>
</SelectParameters>
OK 一切正常 。終於又解決了一個問題,雖然方法有可能有點笨拙,但我很欣慰。