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();
}我正在尝试从结果中按切片获取行。我期望:首先是5,然后退出脚本。下一个开始将是第二个五个结果(6-10)等。我如何管理它,例如使用MaxID或某种迭代器。
发布于 2017-03-02 15:38:39
你不能,因为阅读器需要一个开放的和可用的集合来从中获取值。如果每次都要一次又一次地执行查询,这并不是一种更好的做法,您可以使用DataTables来满足这一要求。为此,您可以使用以下方法:
// 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>
发布于 2017-03-02 16:29:28
如果您仍然需要分页并使用MS 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)https://stackoverflow.com/questions/42549205
复制相似问题