【问题标题】:How to perform read data from file, then validate data and insert data in to Database operations asynchronously如何从文件中读取数据,然后验证数据并将数据异步插入到数据库操作中
【发布时间】:2014-03-31 09:31:31
【问题描述】:

我的 Windows 服务中有以下三种方法用于将 CSV 数据文件转换为 Sql server 数据库。

  • 方法一:从CSV文件中读取数据(每行包含一个Employee数据)

  • 方法 2:通过员工 ID、姓名等验证数据。

  • 方法3:将数据插入到数据库表中。

目前,我正在从CSV文件中读取一行并一一调用上述3个方法(意思是在完成方法1后我将启动方法2,在完成方法2后我将启动方法3。然后我会再次阅读CSV 文件中的另一行并重复相同的步骤)

由于这是一个同步过程,因此处理一个包含数万条记录的文件需要很长时间。

如果我想让它成为一个异步过程,我将如何异步调用我的方法,以及我应该使用哪些 C# 类来实现这一点?

【问题讨论】:

  • 我假设插入的顺序无关紧要?
  • 只需改变你的方法,首先读取 csv 将完整数据插入表中,然后验证整个表的数据并插入到主表中,这将提高性能
  • 是的,插入的顺序无关紧要。
  • 但是如果我在插入数据库后进行验证,那么我需要删除无效数据。这又需要数据库操作。
  • 如果您对此感兴趣,可以在 SSIS 中轻松完成此操作。

标签: c# sql sql-server csv asynchronous


【解决方案1】:

要做到这一点,最好的办法是在代码中创建您的类,制作您的类的列表,在验证时将已验证的数据添加到此列表中,而未验证的数据您可以将它们放在字符串或其他列表中以显示其余的没有插入。

接受员工名单

public List<Employee> acceptedEmployees = new List<Employee>();

员工类

class Employee {
   public int ID{ get; set; }
   public string Name{ get; set; }

   public Employee(int ID, string name)
        {
           ID = ID;
           Name = name;
        }
}

在循环中,您可以将它们添加到列表中,然后从该列表中创建批量插入或制作日志或将它们发送回客户端。

当您将批次添加到数据库时,请确保使用 1 连接来插入所有内容,不要在每个插入批次上连接,这会使您的系统变慢。

列表完成后,您可以创建每个语句 500 的批量插入,例如:

INSERT INTO mytable (ID, NAME) VALUES (1,'Dan'),(2,'Stack'),(3,'Whatever');

当所有查询都准备好后,您可以按顺序运行它们。

【讨论】:

  • 批量插入,手感不错!
  • CtrlDot,几周前我遇到了同样的问题,它是用 Java 但同样的概念......我带来了批量插入和相同的连接,这让我的速度提高了 80%,所以我希望它有所帮助:)
【解决方案2】:
string[] csvLines = File.ReadAllLines(@"c:\employees.csv")

List<Task> tasks = new List<Tasks>();

foreach(var line in csvLines )
{//spawn tasks to parse, validate , save
   var task = Task<ValidationResult>.Factory.StartNew(()=>
     {//async task start

         var validationResult = Validate(line);
         if(validationResult.IsValid)
         {
            Save(validationResult.Employee);
         }     

         return validationResult; 

     });//async task end

     tasks.Add(task);

}

//wait for results
var allResults = new List<ValidationResult>();    
foreach(var t in tasks)
{
 allResults.Add(t.Result);
}

【讨论】:

  • 如果我的文本文件中有 1,00,000 行,File.ReadAllLines() 方法是否会阻塞我的系统 RAM?
  • 应该可以的,我以前用过,情况很类似,如果担心内存占用,还是用文件流,一行一行的消费。这个想法是,一旦您以任何读取方法从 csv 文件中获得一行,您就可以继续并启动一个异步任务,该任务验证并在数据库中插入该记录。
猜你喜欢
  • 1970-01-01
  • 2019-05-15
  • 1970-01-01
  • 1970-01-01
  • 2023-03-29
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多