gridview的SQL数据源

时间:2010-04-14 19:47:03

标签: asp.net sql-server data-binding gridview

我想使用带有排序和分页的gridview来显示来自SQL服务器的数据,该查询使用3个连接并且全文搜索包含stable。查询的from部分使用连接中的所有3个表。

最好的方法是什么?我可以直接在SQLDataSource中考虑存储过程SQL,并在数据库中创建视图。 我希望获得良好的性能,并希望尽可能地利用gridview的自动排序和分页功能。

编辑: 关于大小,我怀疑记录很少,总共大约1000个,查询通常会导致不超过100条记录,而且大多数时候会少得多。

4 个答案:

答案 0 :(得分:1)

我的建议是使用存储过程。您可以从附加到Gridview的SQLDataSource设置存储过程参数输入。我不鼓励在数据源中使用直接SQL select语句,因为IMHO调用带参数规范的存储过程更安全。

希望这有帮助, SID

答案 1 :(得分:1)

这完全取决于您所谈论的数据量。如果它有数百万条记录,那么我不会建议自动排序和分页。最好使用存储过程并使用Row_Number()功能(如果您使用的是SQL 2005)。

HTH

答案 2 :(得分: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

答案 3 :(得分:0)

我会创建一个包含所有输入参数的搜索过程,并将这些输入字段附加到您的Sql数据源。这样,当用户输入过滤条件时,您只需调用grid.DataBind()来应用过滤器。