C# 按块枚举数据表
我有一个DataTable,它填充了360000行SQL数据(这是预期的)。然而,这会遇到一些问题 这就是我所拥有的,然而,我不确定在最后一次间隔1000后如何处理所有事情。或者也许有更好的方法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
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
方法,同样的概念也存在于其他语言/技术中。谢谢-您是否有关于这些类型模式的链接或方法?