65.9K
CodeProject 正在变化。 阅读更多。
Home

带 SQL 分页的 Gridview

starIconstarIconstarIconemptyStarIconemptyStarIcon

3.00/5 (4投票s)

2009年6月5日

CPOL

2分钟阅读

viewsIcon

24559

downloadIcon

269

一个简单而详细的 ASP.NET 程序,使用 Gridview 在 SQL 2005 中进行分页。

引言

这是一个简单的 C# 网站,它使用 ASP Gridview 来显示记录,但仅显示从执行的 SQL 分页函数返回的部分数据。

背景

在我还不熟悉 SQL 2005 的时候,我一直在想 SQL 2005 有什么新功能,以及我如何从中受益。在那里我发现了 row_number() 函数,这个函数类似于表中的自动标识种子,只是它是在查询执行期间实现的。

在这里,我的示例程序将向您展示如何将 row_number() 的功能扩展到您的 ASP.NET 网页!

请记住,我在这里使用的 SQL 可以很容易地用作数据库中的存储过程。

Using the Code

现在,我将讨论 GetSQL() 方法,或者我们的主要 SQL 分页。

string GetSQL()
{
    /* My Generated SQL Paging */
    return @" 
                   
    /* Here we declare our main variable, this will be your 
    parameters when you use this as a Stored Procedure */ 

    DECLARE 
          @START    AS INT , 
          @MAX    AS INT , 
          @SORT    AS VARCHAR(100) , 
          @FIELDS AS VARCHAR(MAX) , 
          @OBJECT AS VARCHAR(MAX) 

    SELECT 
          @START = {3} ,
          @MAX = {4} , 
          @SORT = '{2}' , 
          @FIELDS = '{1}' ,
          @OBJECT = '{0}'

    /* CLEANING PARAMETER VALUES */
    IF (ISNULL(@SORT , '') = '') BEGIN SET @SORT = 'SELECT 1' END 
    IF (@START < 1) BEGIN SET @START = 1 END 
    IF (@MAX < 1) BEGIN SET @MAX = 1 END 

    /* SET THE LENGTH OF RESULT */
    DECLARE @END AS INT 
    SET @END = (@START + (@MAX - 1))

    /* Here we get the total rows therein based from the 
       Object or main SQL Query given to the parameter @object */ 

   /* GET THE TOTAL PAGE COUNT */
   DECLARE 
       @SQL_COUNT AS NVARCHAR(MAX) 

       SET @TOTAL = 0
       SET @SQL_COUNT = 'SELECT @GET_TOTAL = COUNT(*) 
                         FROM (' + @OBJECT + ') AS [TABLE_COUNT]'

       EXEC sp_executesql @SQL_COUNT, N'@GET_TOTAL INT OUTPUT', 
                                        @GET_TOTAL = @TOTAL OUTPUT 

    /* Here we are now creating the actual SQL paging script to 
       produce the desired partial records */ 

    /* GET THE RECORDS BASED FROM THE GIVEN STATEMENT AND CONDITION */
    DECLARE @SQL AS NVARCHAR(MAX)
    SET @SQL = 
        'SELECT ' + @FIELDS + ' 
         FROM 
         (
             SELECT 
                (ROW_NUMBER() OVER(ORDER BY ' + @SORT + ')) AS [ROWNUM] , * 
             FROM ( 
                     SELECT ' + @FIELDS + ' 
                     FROM (' + @OBJECT + ') AS [SOURCE_TABLE]
                   ) AS [SOURCE_COLLECTION]
             ) AS TMP
             WHERE 
                [ROWNUM] BETWEEN ' + CAST(@START AS VARCHAR(10)) + 
                 ' AND ' + CAST(@END AS VARCHAR(10)) + '
          '

          EXEC(@SQL) /* we now execute the script */
    ";
} 

现在我们开始为方法赋值。

在这里,我们赋值给对象或主查询。我们可以使用 SQL VIEW,但在这个例子中,我们赋值给纯查询。

string MAIN_SQL = @" Select A.ProductId, A.ProductName, A.UnitPrice, A.UnitsInStock, 
                           B.CompanyName From Products AS A Inner Join Suppliers AS B on 
                          (B.SupplierId = A.SupplierId)";

在这里,我们赋值要在 GridView 中显示的字段。

string FIELDS_TO_DISPLAY = 
	"ProductId, ProductName, UnitPrice, UnitsInStock,CompanyName";

在这里,我们赋值要排序的字段。在我们的例子中,只有一个字段,并且按升序排序。

string FIELDS_TO_BE_SORT = " ProductName ASC ";

现在我们只需将变量放在其索引赋值中。请记住,如果您使用的是存储过程,将会更容易和更具描述性,因为在我们的例子中,我们只是使用了从 .NET 获取的 string 格式。

SQL = string.Format(SQL, MAIN_SQL, FIELDS_TO_DISPLAY, 
	FIELDS_TO_BE_SORT, rows_start, rows_per_page);

接下来只是让您尝试;这些只是您需要了解的主要字段,其他都是我们日常使用的普通代码。

我知道这篇文章还有改进的空间,所以请随时留下您的评论。

关注点

我希望我能与大家分享一篇好的文章!

您可以通过 tom.bauto@gmail.com 与我联系。

历史

  • [2009.05.27] - Tom Bauto { 版本 1.0.0 }
© . All rights reserved.