2017-03-02 58 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) 
相关问题