C# 按块枚举数据表

C# 按块枚举数据表,c#,datatable,ado.net,C#,Datatable,Ado.net,我有一个DataTable,它填充了360000行SQL数据(这是预期的)。然而,这会遇到一些问题 这就是我所拥有的,然而,我不确定在最后一次间隔1000后如何处理所有事情。或者也许有更好的方法 int catchInt = 0; string combineWhereClause = string.Empty; for (int i = 0; i < ThousandLoopTable.Rows.Count; i++) { catchInt++; combineWher

我有一个DataTable,它填充了360000行SQL数据(这是预期的)。然而,这会遇到一些问题

这就是我所拥有的,然而,我不确定在最后一次间隔1000后如何处理所有事情。或者也许有更好的方法

int catchInt = 0;
string combineWhereClause = string.Empty;

for (int i = 0; i < ThousandLoopTable.Rows.Count; i++)
{
    catchInt++;
    combineWhereClause = combineWhereClause + 
                        "','" + 
                         ThousandLoopTable.Rows[i].ItemArray[0].ToString();

    if (catchInt >= 1000)
    {
        catchInt = 0;
        combineWhereClause = combineWhereClause.TrimStart('\'');
        combineWhereClause = combineWhereClause.TrimStart(',');

        Directory.CreateDirectory(ExportDirectory);
        SQLProcessing.SQLProcessor.MasterSqlConnection = 
            SQLProcessing.SQLProcessor.OpenMasterSqlConnection(SQLServer);
        DataTable dtTable = 
            SQLProcessing.SQLProcessor.QueryDataTable(sql_selectionquery);
        for (int m = 0; m < dtTable.Rows.Count; m++)
        {
            string FileName = dtTable.Rows[m].ItemArray[0].ToString() + ".txt";
            string OCR = dtTable.Rows[m].ItemArray[1].ToString();
            File.AppendAllText(ExportDirectory + "\\" + FileName, OCR);

        }

        combineWhereClause = string.Empty;
    }
}
int-catchInt=0;
string combineWhereClause=string.Empty;
对于(int i=0;i=1000)
{
catchInt=0;
CombineWhere子句=CombineWhere子句.TrimStart('\'');
CombineWhere子句=CombineWhere子句.TrimStart(',');
CreateDirectory(ExportDirectory);
SQLProcessing.SQLProcessor.MasterSqlConnection=
SQLProcessing.SQLProcessor.OpenMasterSqlConnection(SQLServer);
数据表dtTable=
SQLProcessing.SQLProcessor.QueryDataTable(sql\u selectionquery);
for(int m=0;m

因此,例如,如果有3120行,这将处理3000行,但不会处理最后120行。但是,我不确定如何处理最后120个,因为我真的不想在for循环中这样做,是吗?

考虑将LINQ to SQL与/methods一起使用。

考虑将LINQ to SQL与/methods一起使用。

为了避免OutOfMemory异常,您可以遵循一些简单的规则:

从不

  • 使用整个数据集
  • 在内存中加载整个数据集
  • 执行阻塞服务器端数据库的长时间运行的事务代码
  • 始终

  • 处理小块数据
  • 加载小数据块(分页模式)
  • 运行非阻塞服务器代码
  • 如果在服务器上可以做任何事情,就让它来做吧

  • 确保服务器上的数据不可更改(没有人更改)。如果这无法保证,您可能需要重新考虑您的体系结构,并使用队列和其他表来处理数据。

    为了避免OutOfMemory异常,您可以遵循以下简单规则:

    从不

  • 使用整个数据集
  • 在内存中加载整个数据集
  • 执行阻塞服务器端数据库的长时间运行的事务代码
  • 始终

  • 处理小块数据
  • 加载小数据块(分页模式)
  • 运行非阻塞服务器代码
  • 如果在服务器上可以做任何事情,就让它来做吧

  • 确保服务器上的数据不可更改(没有人更改)。如果无法保证这一点,您可能需要重新考虑您的体系结构,并使用队列和其他表格来处理数据。

    可能有更好的方法来处理数据(请参阅其他答案),但我认为这正是您当前方法所需要的:

    不要为每个批次重置catchInt。相反,将其初始化为
    1
    ,并让其作为整个操作的计数器运行。然后将
    if
    更改为:

    if (catchInt % 1000 == 0 || catchInt == ThousandLoopTable.Rows.Count)
    {
        // Execute your batch
    }
    

    这使用来确定何时
    catchInt
    可被1000整除。

    可能有更好的方法来处理数据(请参阅其他答案),但我认为这是您当前方法所需要的:

    不要为每个批次重置catchInt。相反,将其初始化为
    1
    ,并让其作为整个操作的计数器运行。然后将
    if
    更改为:

    if (catchInt % 1000 == 0 || catchInt == ThousandLoopTable.Rows.Count)
    {
        // Execute your batch
    }
    

    这将使用来确定何时
    catchInt
    可被1000整除。

    我没有,但我强烈考虑了它-您的示例代码包含一些随机自定义类/变量(可能与DB access相关,因为它们的名称中有SQL)和一些与查询SQL绝对无关的代码。对于这个问题,它没有太大的价值。我没有,但仔细考虑了一下-您的示例代码由一些随机的自定义类/变量组成(可能与DB access有关,因为它们的名称中有SQL),而一些代码与查询SQL完全无关。对于这个问题,它没有多大价值。整个数据集无法容纳memory@Mike我可能没能解释这一点。将整个数据集加载到内存中是一种反模式。您应该做的是加载该数据集的一小部分并对其进行处理,保存结果并丢弃数据。然后加载下一个块,处理它,依此类推。因此,在任何时刻,内存中都有少量记录。在LINQ中,您可以使用
    Skip
    Take
    方法,在其他语言/技术中也存在相同的概念。谢谢-您是否有这些类型模式的链接或方法?整个数据集无法容纳memory@Mike我可能没能解释这一点。将整个数据集加载到内存中是一种反模式。您应该做的是加载该数据集的一小部分并对其进行处理,保存结果并丢弃数据。然后加载下一个块,处理它,依此类推。因此,在任何时刻,内存中都有少量记录。在LINQ中,您可以使用
    Skip
    Take
    方法,同样的概念也存在于其他语言/技术中。谢谢-您是否有关于这些类型模式的链接或方法?