我想用排序和分頁的GridView來顯示來自SQL服務器的數據,查詢使用3個連接,全文搜索包含穩定。查詢的from部分使用連接中的所有3個表。Gridview的SQL數據源
這樣做的最好方法是什麼?我可以直接在SQLDataSource中創建一個存儲過程,SQL,並在數據庫中創建一個視圖。 我想要良好的性能,並希望儘可能利用gridview的自動排序和分頁功能。
編輯: 關於大小,我懷疑只有很少的記錄,總共大約1000和查詢將典型的結果不超過100個記錄,大多數時間少得多。
我想用排序和分頁的GridView來顯示來自SQL服務器的數據,查詢使用3個連接,全文搜索包含穩定。查詢的from部分使用連接中的所有3個表。Gridview的SQL數據源
這樣做的最好方法是什麼?我可以直接在SQLDataSource中創建一個存儲過程,SQL,並在數據庫中創建一個視圖。 我想要良好的性能,並希望儘可能利用gridview的自動排序和分頁功能。
編輯: 關於大小,我懷疑只有很少的記錄,總共大約1000和查詢將典型的結果不超過100個記錄,大多數時間少得多。
我的建議是使用存儲過程。您可以從連接到Gridview的SQLDataSource設置存儲過程參數輸入。我會勸阻在數據源中使用直接的SQL select語句,因爲使用參數規範調用存儲過程的IMHO更安全。
希望這有助於 希德
我將創建與所有的輸入參數的搜索程序,並附上這些輸入字段到您的SQL數據源。這樣,當用戶輸入過濾條件時,您只需調用grid.DataBind()來應用過濾器。
以下是我最後做
.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
感謝您的答覆。我想了解一下爲什麼視圖不是一個好選擇,如果你有時間的話:-) – Karsten 2010-04-14 20:03:15
你可能想檢查一下MSDN,看看SQLDataSource是否支持使用View。我似乎記得直接的SQL代碼或存儲過程,但不要讓我那樣:)否則,真正由您決定如何維護數據庫結構。如果您能夠在sqldatasource中使用視圖,則必須刷新服務器端的視圖,以確保將最新數據推送到Web應用程序的gridview。當您從Web應用程序調用存儲過程時,您將獲得滿足參數的最新一組數據。 – SidC 2010-04-14 20:19:36