在C#中以小部分从数据库中获取数据

时间:2011-04-25 13:02:42

标签: c# database loops

在我的C#应用​​程序中,我有一个存储过程,它从数据库中返回某种数据。我传递给过程的输入参数是开始日期,结束日期和所谓的“行数”参数。每行代表数据库中的一个条目。由于数据库调用限制,每次调用我不能将超过5000行传递给该过程。这就是为什么我想创建一种类型的循环来发送5000行,获取相应的数据,然后另外5000行等,直到我得到一个小于5000的行的输出,这意味着没有剩余的行。有人能帮助我了解如何做到这一点吗?

感谢。

3 个答案:

答案 0 :(得分:0)

听起来您可以使用table-valued parameters向存储过程提供数据。

答案 1 :(得分:0)

我只看到一种可能的解决方案 - 您应该按主键选择数据。 DBMS将返回按主键排序的数据。您应该记住键“最大值”,并在下次添加条件PK> “最大值”,其中PK是主键。这将强制DBMS返回给您下一个数据包,您可以通过“行数”调整包的大小,如前所述

<强> [编辑]
我无法提供代码示例,因为我实际上从未在C#中使用过DB。但是这个事实并没有消除DBMS总是对表主键进行排序。例如,您有下一列的表:

  • ID(int)[PK]
  • DATA(CHAR255)

在此表中,ID是主键。所以你可能会做下面的事情(pesudo代码):

< declaration of array which will hold you data from DB > - intTab

SELECT * FROM < your DB tab > UP TO 5000 ROWS
  INTO CORRESPONDING FIELDS OF TABLE intTab
    WHERE < your conditions > 
      AND ID > 0.

这个SELECT会从表中“返回”第一行5000行。 “first”表示按主键索引的第一行。要选择接下来的5000行,您应该这样做:

var maxID = < max id from intTab >

SELECT * FROM < your DB tab > UP TO 5000 ROWS
  INTO CORRESPONDING FIELDS OF TABLE intTab
    WHERE < your conditions > 
      AND ID > maxID.

此选择将返回“下一行”5000行ID > maxID条件。

答案 2 :(得分:0)

如果您的存储过程实现了分页,您可以这样做:

IEnumerable<SomeType> StoredProcedure()
{
    var results = new List<IList<SomeType>>();

    int i = 0;
    while (true)
    {
        var result = StoredProcedure(i, pageSize);
        i += pageSize;
        results.Add(result);
        if (result.Count == 0)
            break;
    }

    return results.SelectMany(r => r);
}