分页的最佳做法是在存储过程中执行此操作,因此您可以限制要撤回的数据量,例如:
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
Run Code Online (Sandbox Code Playgroud)
这是特定于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 ;
Run Code Online (Sandbox Code Playgroud)
编辑,似乎你正在使用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
Run Code Online (Sandbox Code Playgroud)
效率不是很高,但你可以使用你所拥有的东西.现在,在服务器端,您可以创建一个方法来获取结果,例如:
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();
}
}
}
}
Run Code Online (Sandbox Code Playgroud)
然后,您可以将其绑定到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" />
Run Code Online (Sandbox Code Playgroud)
这不是一个完整的解决方案,但应该足以让你前进.
更新我的一位朋友在Sql 2000中找到了一篇关于分页的替代文章:http://www.codeproject.com/KB/database/SQLServer2KPagingSorting.aspx
| 归档时间: |
|
| 查看次数: |
3306 次 |
| 最近记录: |