0

IDbDataReader我需要通过 C# 和 ADO.NET(和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 

// ... )


SELECT myFields, Datefield from v where CurrentRow 
BETWEEN @pRowStart AND @pRowEnd

从结果来看,我必须使用将转换和生成新数据的 C# API,这就是为什么不能使用 SqlServer - only 解决方案的原因。

我想查询页面大小为 10000 的数据库,直到没有更多数据为止。就像是

while (true)
{
  // ... execute reader
  if (reader.HasRows) 
     break;
}

将不起作用,因为我必须使用 IDbDataReader 接口。

在我的情况下我能做什么?

编辑+解决方案 我在while循环中遍历每个块并检查HasRows数据读取器的属性,因为我可以使用专门的类型。

4

1 回答 1

1

在 SQL Server 2012 上,您可以使用 OFFSET 和 FETCH 子句进行简单高效的分页,如ORDER B Y 子句示例所示:

SELECT DepartmentID, Name, GroupName
FROM HumanResources.Department
ORDER BY DepartmentID ASC 
    OFFSET @StartingRowNumber - 1 ROWS 
    FETCH NEXT @RowCountPerPage ROWS ONLY;

在以前的版本中,您可以使用 CTE 和ROW_NUMBER()计算每行的数字并限制结果:

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;
于 2012-06-22T08:12:39.303 回答