C# 如何在c语言中分页和查询大数据#
我需要通过C#和ADO.NET(C# 如何在c语言中分页和查询大数据#,c#,sql-server-2005,ado.net,C#,Sql Server 2005,Ado.net,我需要通过C#和ADO.NET(IDbDataReader和IDbCommandAPI)从数据库中查询大量数据。 我创建了如下查询: WITH v as (SELECT myFields, Datefield ROW_NUMBER() OVER (ORDER BY Datefield ASC) AS CurrentRow FROM dbTable WHERE /**/ AND Datefield BETWEEN @pStart AND @pEnd // ... ) S
IDbDataReader
和IDbCommand
API)从数据库中查询大量数据。
我创建了如下查询:
WITH v as
(SELECT myFields, Datefield
ROW_NUMBER() OVER (ORDER BY Datefield ASC) AS CurrentRow
FROM dbTable
WHERE /**/
AND Datefield BETWEEN @pStart AND @pEnd
// ... )
SELECT myFields, Datefield from v where CurrentRow
BETWEEN @pRowStart AND @pRowEnd
从结果来看,我必须使用C#API来转换和生成新数据,
这就是为什么不能使用纯SqlServer解决方案的原因
我想查询页面大小为10000的数据库,直到没有更多数据为止。
差不多
while (true)
{
// ... execute reader
if (reader.HasRows)
break;
}
无法工作,因为我必须使用IDbDataReader接口
在我的情况下我能做什么
编辑+解决方案
我在while循环中迭代每个块并检查datareader的
HasRows
属性,因为我可以使用专用类型。在SQL Server 2012上,您可以使用OFFSET和FETCH子句进行简单高效的分页,如Y子句示例所示:
SELECT DepartmentID, Name, GroupName
FROM HumanResources.Department
ORDER BY DepartmentID ASC
OFFSET @StartingRowNumber - 1 ROWS
FETCH NEXT @RowCountPerPage ROWS ONLY;
在以前的版本中,您可以使用CTE和计算每行的数字并限制结果:
WITH OrdersRN AS
(
SELECT ROW_NUMBER() OVER(ORDER BY OrderDate, OrderID) AS RowNum
,OrderID
,OrderDate
,CustomerID
,EmployeeID
FROM dbo.Orders
)
SELECT *
FROM OrdersRN
WHERE RowNum BETWEEN (@PageNum - 1) * @PageSize + 1
AND @PageNum * @PageSize
ORDER BY OrderDate ,OrderID;
SQL Server 2012在ORDER BY子句中添加了OFFSET和NEXT子句以简化分页。请告诉我们您将运行哪个版本的SQL Server,并将此标记为答案,因为现在我知道如何在2012版本中执行此操作。