0

IDbDataReaderC# と 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 のみのソリューションは使用できません。

データがなくなるまで、ページサイズが 10000 のデータベースに対してクエリを実行したいと考えています。何かのようなもの

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

IDbDataReader インターフェイスを使用する必要があるため、機能しません。

私の状況では何ができますか?

編集 + 解決策 while ループ内の各ブロックを繰り返し処理しHasRows、データリーダーのプロパティを確認します。これは、特殊な型を使用できるためです。

4

1 に答える 1

1

SQL Server 2012では、ORDER B Y句の例に示すように、OFFSET句とFETCH句を使用して、単純で効率的なページングを行うことができます。

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 に答える