用c#从数据库中获取数据

本文关键字:获取 数据 数据库 | 更新日期: 2023-09-27 17:52:42

在我的c#应用程序中,我有一个从数据库返回某种数据的存储过程。我传递给过程的输入参数是开始日期、结束日期和所谓的"行数"参数。每一行表示数据库中的一个条目。由于数据库调用限制,我不能将超过5000行传递给每次调用的过程。这就是为什么我想创建某种循环来发送5000行,获取相应的数据,然后再发送5000行,等等,直到我得到的输出行数少于5000行,这意味着没有更多的行了。有人能告诉我怎么做吗?

谢谢。

用c#从数据库中获取数据

我认为你只有一个可能的解决方案-你应该选择你的数据主键。DBMS将返回按主键排序的数据。你应该记住带有"最大值"的键,下次你应该添加条件PK>"最大值",其中PK是主键。这将迫使DBMS返回给您下一个数据包,数据包的大小您可以通过"行数"来调节,如前所述

[编辑]
我不能提供代码示例,因为我实际上从来没有在c#中使用DB。但是这个事实并没有消除DBMS总是对表的主键进行排序的事实。例如,您的表有以下列:

  • ID (int) [PK]
  • 数据(CHAR255)

在该表中,ID是主键。所以你可以像下面这样做(伪代码):

< 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.

这个select将返回"下一个"5000行,由于ID > maxID条件

听起来您可以使用表值参数来向存储过程提供数据。

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

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);
}