如何使用.NET使用SQLReader slices读取查询结果


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或某种迭代器来管理它。

您不能,因为读者需要一个开放且可用的收藏来从中获得值。如果您要一次又一次地执行查询,这将不是一个更好的练习,您可以在其中使用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();
}

如果您需要该结果作为数据表,则可以在这种情况下使用.CopyToDataTable()而代替.ToList(),该方法的返回类型为DataTable,而不是List<DataRow>

如果您仍然需要分页并使用MS SQL-Server,则可以添加到查询选择子句, 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)