【发布时间】:2016-11-08 15:07:20
【问题描述】:
我的要求是处理多个成本文件,其中有数百万条记录。处理和验证后,我必须将这些记录添加到数据库中。
为了获得更好的性能,我在 foreach 循环中使用“yield”并一次返回一条记录,处理该记录并立即将该记录添加到带有文件编号的数据库中。在这个文件读取过程中,如果我遇到任何数据验证错误,我会抛出 InvalidRecordException。
我的要求是从与该文件相关的表中删除所有记录。简而言之,即使一条记录无效,我也想将该文件标记为无效文件,甚至不将该文件的一条记录添加到数据库中。
任何人都可以在这里帮助我,我如何在这里使用 TransactionScope。
public class CostFiles
{
public IEnumerable<string> FinancialRecords
{
get
{
//logic to get list of DataRecords
foreach (var dataRecord in DataRecords)
{
//some processing... which can throw InvalidRecord exception
yield return dataRecord;
}
yield break;
}
}
}
public void ProcessFileRecords(CostFiles costFile, int ImportFileNumber)
{
Database db = new Database();
using (TransactionScope scope = new TransactionScope(TransactionScopeOption.Required))
{
try
{
foreach (var record in costFile.FinancialRecords)
{
db.Add(record, ImportFileNumber);
}
}
catch(InvalidRecordException ex)
{
//here i want to delete all the records from the table where import file number is same as input paramter ImportFileNumber
}
}
}
【问题讨论】:
-
什么是
Database?TransactionScope(通常)用于分布式事务支持。Database是否为此提供支持?没有可以使用的原生事务概念吗? -
对于这种类型的事情,我建议使用存储过程来处理您的数据工作。通过痛苦的行来完成这一行对于数百万行来说会非常慢。
-
@DavidOsborne
TransactionScope不是“通常用于分布式事务支持”。如果您不重用相同的 SQL 连接对象,则 TransactionScope 仅将事务提升为分布式事务。 -
SQL Server 具有批量文件导入功能,比您在此处提出的要高效得多。
-
@CAbbott:它需要大量处理并向用户显示经过优化的数据......所以我继续采用这种方法......但是我肯定会考虑 SQL 批量文件导入选项。
标签: c# sql-server yield transactionscope