如何从文件执行读取数据,然后验证数据并将数据异步插入到数据库操作中

时间:2014-02-27 18:28:55

标签: c# sql sql-server csv asynchronous

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

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

  • 方法2:按员工ID,姓名等验证数据。

  • 方法3:用于将数据插入数据库表。

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

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

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

2 个答案:

答案 0 :(得分: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');

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

答案 1 :(得分:0)

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