2017-03-02 53 views
1
connection.Open(); 
var cmd = new SqlCommand("SELECT TOP 1000 [Id] ,[Name] FROM [SomeBase]", connection); //Here 
context.MaxID = 100; 
int en = 5; //Maximum number of rows in the slice 
int iter = 0; //Iterator for each single row in the slice 
try 
{ 
    SqlDataReader reader = cmd.ExecuteReader(); 
    if(reader.HasRows) 
    { 
     while (iter < en) //I need 1-5 rows in first iteration, 6-10 in second... 
     { 
      iter++; 
      reader.Read(); 
      context.TextLog += String.Format("{0}\t{1}\n", 
      reader.GetInt64(0), 
      reader.GetString(1)); 
     } 
    } 
    reader.Close(); 
} 

我試圖從結果中獲取片的行。 我期望:前五個,然後退出腳本。下一個開始將是第二個五個結果(6-10)等。 我如何管理它,例如使用MaxID或某種迭代器。如何用SQLReader使用.NET讀取片段查詢結果

+0

告訴數據庫服務器,您只需要那些帶有LIMIT/FETCH和OFFSET的部分。不要告訴它你想要1000個結果,只是扔掉它們。 –

+0

[在SQL Server中分頁結果的最佳方式是什麼]的可能重複(http://stackoverflow.com/questions/109232/what-is-the-best-way-to-paginate-results-in-sql-服務器) – bbsimonbb

回答

0

你不能,因爲讀者需要一個開放和可用的集合來從中獲取值。如果您要一次又一次地執行查詢並不是一種更好的做法,那麼您可以使用DataTable來滿足此要求。對於您可以使用下面的方法:

// populate the DataTable using adapter 
SqlDataAdapter adapter = new SqlDataAdapter(); 
adapter.SelectCommand = new SqlCommand("SELECT TOP 1000 [Id] ,[Name] FROM [SomeBase]", connection); 
adapter.Fill(dataset); 
// Call the method whenever you need Slice 
// Which will give you a List<DataRow> 
public List<DataRow> GetMySlice(DataTable inputDataTable, int minSlice, int maxSlice) 
{ 
    return inputDataTable.AsEnumerable() 
         .Skip(minSlice) 
         .Take(maxSlice) 
         .ToList(); 
} 

如果你需要的結果作爲一個DataTable意味着你可以在這種情況下,利用.CopyToDataTable()而不是爲.ToList(),該方法的返回類型是DataTable而不是爲List<DataRow>

0

如果您仍然需要分頁並使用MS SQL Server,您可以將其添加到您的查詢中SELECT子句, ROW_NUMBER() OVER (ORDER BY <ColumnName>)並用SELECT *包裝它。使用帶參數的WHERE子句。

SELECT * FROM 
(
    SELECT [Id] ,[Name], ROW_NUMBER() OVER (ORDER BY <ColumnName>) AS RNUM FROM [SomeBase] 
) AS T 
WHERE (T.RNUM BETWEEN @from AND @to) 
相關問題