c# - 使用存储过程 (SQL 2000) 在 C# 中实现分页

标签 c# asp.net

任何人都可以链接到带有分页的示例代码,可以将其更改为在(10000 多条记录)表中工作?我想在我的 asp.net 页面上显示记录。

干杯

最佳答案

分页的最佳做法是在您的存储过程中进行分页,这样您就可以限制要拉回的数据量,例如:

CREATE PROCEDURE dbo.GetSomeData
  @page INT,
  @size INT = 25
AS
BEGIN

    DECLARE @offset INT
    SET @offset = (@page - 1) * @size;

    WITH OrderedSet AS
    (
      SELECT Field1, Field2, Field3, ROW_NUMBER() OVER (ORDER BY Field1) AS 'Index'
      FROM SomeTable
    )
    SELECT Field1, Field2, Field3 FROM OrderedSet WHERE [Index] BETWEEN @offset AND (@offset + @size)
END
GO

那是Sql Server特有的,MySql稍微简单一点:

DELIMITER $$
CREATE PROCEDURE GetSomeData(IN page INT, IN size INT DEFAULT 25)
BEGIN
  DECLARE offset INT DEFAULT 0
  SET offset = (page - 1) * size;

  SELECT `Field1`, `Field2`, `Field3` FROM `SomeTable` LIMIT offset, (offset + size);
END$$
DELIMITER ;

编辑,好像您正在使用 Sql 2000。

分页在 Sql 2000 上有点棘手,因为您没有任何内置函数来生成有效的页数。您可以做的是创建临时表:

CREATE PROCEDURE dbo.GetSomeData
  @page INT,
  @size INT = 25
AS
BEGIN

  DECLARE @offset INT
  SET @offset = (@page - 1) * @size

  CREATE TABLE #temp
  (
    [Index] INT IDENTITY(1, 1) PRIMARY KEY,
    [Field1] VARCHAR(100),
    [Field2] VARCHAR(100),
    [Field3] VARCHAR(100)
  )

  INSERT INTO #temp ([Field1], [Field2], [Field3])
  SELECT [Field1], [Field2], [Field3] FROM SomeTable

  SELECT [Field1], [Field2], [Field3] FROM #temp WHERE [Index] BETWEEN @offset AND (@offset + @size)
END
GO

CREATE PROCEDURE dbo.GetCoutOfSomeData
AS
BEGIN
    DECLARE @count INT
    SELECT @count = COUNT([Field1]) FROM SomeTable

    SELECT @count
END
GO

虽然效率不高,但您可以利用已有的资源进行工作。现在,在服务器端,您可以创建一个方法来返回结果,例如:

public class SomeDataSelector
{
  public IEnumerable<SomeDataType> GetSomeData(int page, int size)
  {
    List<SomeDataType> result = new List<SomeDataType>();
    using (SqlConnection conn = new SqlConnection(...)) {
      using (SqlCommand command = new SqlCommand("GetSomeData", conn)) {
        command.CommandType = CommandType.StoredProcedure;

        using (SqlDataReader reader = command.ExecuteReader()) {
          while (reader.Read()) {
            // Do work here to create instance of SomeDataType.


          }
        }
      }
    }

    return result;
  }

  public int GetCoutOfSomeData()
  {
    using (SqlConnection conn = new SqlConnection(...)) {
      using (SqlCommand command = new SqlCommand("GetSomeData", conn)) {
        command.CommandType = CommandType.StoredProcedure;

        int result = (int)command.ExecuteScalar();
      }
    }
  }
}

然后您可以将其绑定(bind)到您的 ASP.NET 控件。

<asp:ObjectDataSource ID="ObjectDataSource1" runat="server" TypeName="SomeDataSelector" SelectMethod="GetSomeData" SelectCountMethod="GetCoutOfSomeData" />

<asp:GridView ID="GridView1" AutoGenerateColumns="True" DataKeyNames="Field1" DataSourceID="ObjectDataSource1" AllowPaging="True" PageSize="25" />

这不是一个完整的解决方案,但应该足以让您继续前进。

更新 我的一个 friend 找到了一篇关于 Sql 2000 分页的替代文章:http://www.codeproject.com/KB/database/SQLServer2KPagingSorting.aspx

关于c# - 使用存储过程 (SQL 2000) 在 C# 中实现分页,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3264628/

相关文章:

c# - File.Copy 方法使文件无法访问

c# - 如何从 Visual Studio 中的包管理器控制台针对 SQL Azure 调用更新数据库?

c# - 反转和删除句子中的重复项

javascript - 如何从代码隐藏中的用户控件中提取所有 javascript 代码

c# - ASP.NET ImageButton Onclick 事件未处理

c# - 由 UpdatePanel 内的 GridView 内的 LinkBut​​ton 触发的完整回发

c# - 不同开发人员之间的 Visualsvn SQL 连接字符串

c# - 使用光线转换代替凝视指针

c# - 如何暂停 Threading.timer 以完成功能

c# - 是否可以在 Page_Load 事件后调用函数?