2012-06-22 6 views
0

C# 및 ADO.NET (IDbDataReaderIDbCommand API)을 통해 데이터베이스에서 많은 양의 데이터를 쿼리해야합니다. - 유일한 해결책은 사용할 수 없습니다 I 변환하고 SQLSERVER가 왜 새로운 데이터, 그게 전부를 생성하는 것 C#을 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 

: 가 나는 follwing을 같은 쿼리를 만들었습니다.

더 이상 데이터가 없을 때까지 10000의 pagesize로 데이터베이스에 대해 쿼리를 수행하려고합니다. 나는 IDbDataReader 인터페이스를 사용할 필요가 원인

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

같은 뭔가가 작동하지 않습니다.

내 상황에서는 어떻게해야합니까?

EDIT + 솔루션 난 while 루프의 각 반복 블록 내가 특수 유형을 사용할 수 원인, DataReader를 HasRows의 특성을 확인한다. SQL 서버 2012에

+1

당신이 사용할 수있는 pagging CTE는 서버 2012 페이징 – Nighil

+0

SQL 무엇 V 알려주세요 SQL 서버의 임포트 –

+0

을 단순화하기 위해 ORDER BY 절에 OFFSET 및 다음 조항을 추가했다 –

답변

1

당신은 OFFSET을 사용하고 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; 
+0

2012 버전에서 수행하는 방법을 알고 있기 때문에 이것을 답으로 표시합니다. – Khh

관련 문제