【问题标题】:SQL datasource for gridviewgridview 的 SQL 数据源
【发布时间】:2010-04-14 19:47:03
【问题描述】:

我想使用带有排序和分页功能的网格视图来显示来自 SQL 服务器的数据,查询使用 3 个连接,全文搜索包含表。查询的 from 部分使用连接中的所有 3 个表。

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

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

【问题讨论】:

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


    【解决方案1】:

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

    希望这会有所帮助, 席德

    【讨论】:

    • 感谢您的回复。如果您有时间,我想了解一下为什么视图不是一个好的选择:-)
    • 您可能想查看 MSDN 以查看 SQLDataSource 是否支持使用视图。我似乎记得直接 SQL 代码或存储过程,但不要让我这么说 :) 否则,你更喜欢如何维护你的数据库结构真的取决于你。如果您能够在 sqldatasource 中使用视图,则必须在服务器端刷新该视图,以确保将最新数据推送到 Web 应用程序的网格视图。当您从 Web 应用程序调用存储过程时,您将获得符合您的参数的最新数据集。
    【解决方案2】:

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

    HTH

    【讨论】:

    • 您是否碰巧知道一个很好的例子,它涵盖了整个事物、Gridview、Datasouce 和存储过程。我知道我可以自己谷歌搜索,但最好的结果并不总是很容易找到。
    • forums.asp.net/t/1539169.aspx 这是我在另一个网站上发布的帖子的链接,该帖子用代码显示。
    【解决方案3】:

    这就是我最终做的事情

    .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
    

    【讨论】:

      【解决方案4】:

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

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2020-07-14
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2014-11-28
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多