任何人都可以链接到带有分页的示例代码,可以将其更改为在(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/