2010-04-14 65 views
0

我想用排序和分頁的GridView來顯示來自SQL服務器的數據,查詢使用3個連接,全文搜索包含穩定。查詢的from部分使用連接中的所有3個表。Gridview的SQL數據源

這樣做的最好方法是什麼?我可以直接在SQLDataSource中創建一個存儲過程,SQL,並在數據庫中創建一個視圖。 我想要良好的性能,並希望儘可能利用gridview的自動排序和分頁功能。

編輯: 關於大小,我懷疑只有很少的記錄,總共大約1000和查詢將典型的結果不超過100個記錄,大多數時間少得多。

回答

1

我的建議是使用存儲過程。您可以從連接到Gridview的SQLDataSource設置存儲過程參數輸入。我會勸阻在數據源中使用直接的SQL select語句,因爲使用參數規範調用存儲過程的IMHO更安全。

希望這有助於 希德

+0

感謝您的答覆。我想了解一下爲什麼視圖不是一個好選擇,如果你有時間的話:-) – Karsten 2010-04-14 20:03:15

+0

你可能想檢查一下MSDN,看看SQLDataSource是否支持使用View。我似乎記得直接的SQL代碼或存儲過程,但不要讓我那樣:)否則,真正由您決定如何維護數據庫結構。如果您能夠在sqldatasource中使用視圖,則必須刷新服務器端的視圖,以確保將最新數據推送到Web應用程序的gridview。當您從Web應用程序調用存儲過程時,您將獲得滿足參數的最新一組數據。 – SidC 2010-04-14 20:19:36

1

這一切都取決於你所談論的數據量上。如果它有數百萬條記錄,那麼我不會建議自動排序和分頁。最好使用存儲過程並使用Row_Number()功能(如果您使用的是SQL 2005)。

HTH

+0

你有沒有發現整個事情,Gridview,Datasouce和存儲過程的一個很好的例子。我知道我可以自己Google,但最好的結果並不總是很容易找到。 – Karsten 2010-04-14 20:04:50

+0

http://forums.asp.net/t/1539169.aspx這是我在另一個網站上發佈的文章的鏈接,它在代碼中顯示了這一點。 – SidC 2010-04-14 20:29:13

0

我將創建與所有的輸入參數的搜索程序,並附上這些輸入字段到您的SQL數據源。這樣,當用戶輸入過濾條件時,您只需調用grid.DataBind()來應用過濾器。

1

以下是我最後做

.aspx 
<asp:GridView ID="gridAnnoncer" runat="server" AutoGenerateColumns="false" DataSourceID="dsAnnonceSearch" DataKeyNames="Id" AllowPaging="true" AllowSorting="true" PageSize="1"> 
    <Columns> 
     .. 
    </Columns> 
</asp:GridView> 

<asp:LinqDataSource ID="dsAnnonceSearch" runat="server" AutoPage="false" OnSelecting="AnnonceSearchOnSelecting"> 
</asp:LinqDataSource> 


.aspx.cs 
protected void AnnonceSearchOnSelecting(object sender, LinqDataSourceSelectEventArgs e) 
{ 
    using (TheContext context = new TheContext()) 
    { 
     int? totalRows; 
     string orderby = e.Arguments.SortExpression.ToLower().Replace(" desc", "").Replace(" asc", "").Trim(); 
     string sortDirection = e.Arguments.SortExpression.ToLower().Contains("desc") ? "desc" : "asc"; 
     e.Result = context.AnnonceSearch("test", orderby, sortDirection, e.Arguments.StartRowIndex, e.Arguments.MaximumRows, out totalRows); 
     e.Arguments.TotalRowCount = (int) totalRows; 
    } 
} 


Stored procedure 
ALTER PROCEDURE [dbo].[AnnonceSearch] 
    @keywords nvarchar(4000), 
    @orderby varchar(100), 
    @orderDirection varchar(100), 
    @startRowIndex int, 
    @maximumRows int, 
    @totalRows int output 
AS 
BEGIN 
    SET NOCOUNT ON; 

    if @keywords is null or @keywords = '' set @keywords = '""' 
    if @startRowIndex < 0 RAISERROR('startRowIndex parameter is invalid', 0, 1) 
    if @maximumRows < 1 RAISERROR('getRows parameter is invalid', 0, 1) 

    select TOP (@maximumRows) Id, Productname, description, Zipcode from 
     (select row_number() over (order by 
      case when lower(@orderDirection) = 'desc' then 
        case lower(@orderby) 
         when 'description' then Annoncer.description 
         when 'Productname' then Annoncer.Productname 
        end 
      end desc, 
      case when lower(@orderDirection) = 'asc' then 
        case lower(@orderby) 
         when 'description' then Annoncer.description 
         when 'Productname' then Annoncer.Productname 
        end 
      end 
      ) as RowNumber, 
     Annoncer.Id, Annoncer.Productname, Annoncer.description from Annoncer 

     where @keywords = '""' or (contains(Annoncer.Productname, @keywords) or 
            contains(Annoncer.description, @keywords))) searchResult 
    where RowNumber > @startRowIndex 

    SELECT @totalRows = COUNT(*) FROM Annoncer 
END