2016-11-10 74 views
1

我有一个Windows服务,当开始去我定义和收集文件列表的路径,每个文件都有记录在我插入数据库(甲骨文)。我的问题是,如果这个数据库下来或如果有一些例外我将如何回滚从文件插入之前的纪录.. 对于实例如何在Windows Service中回滚?

我有10个文件,每个文件都有5条 7解析文件时存在像第四记录某种异常( db down或者其他)我想回滚从第7个文件插入的前3条记录,有可能吗?

我的代码是在这里..

protected override void OnStart(string[] args) 
{ 
    timer1 = new Timer(); 
    this.timer1.Interval = 30000; 
    this.timer1.Elapsed += new System.Timers.ElapsedEventHandler(this.timer_tick); 
    timer1.Enabled = true; 

    Upload.WriteErrorMessage("Service Started"); 

} 

private void timer_tick(object sender,ElapsedEventArgs e) 
{ 
    timer1.Enabled = false; 
    SwiftParser.Parse(); 
    timer1.Enabled = true; 
} 

protected override void OnStop() 
{ 
    timer1.Enabled = false; 
    Upload.WriteErrorMessage("service stoped"); 
} 

其中i上传数据的方法:

Upload obj = new Upload(); 
var files = db.SWIFT_FILES.Select(x => x.LASTFILENUMBER).Max(); 
int sFile = Convert.ToInt32(files); 
int sf1 = sFile; 
while (true) 
{ 
    string flName = @"D:\Projects\Recon\Nostro\swift\" + sFile.ToString("00000000").Trim() + ".swf"; 
    if (System.IO.File.Exists(flName)) 
    { 
     obj.SwiftParse(flName); 
    } 
    else 
    { 
     break; 
    } 
    sFile++; 
} 

在迅速的解析,我只是解析文件,并从中收集数据并保存在数据库中它实际上是一个很长的方法,所以我不想在这里混乱

总之 我做了一个表的对象,并保存在它

for(int i=0; i<length of record; i ++) 
{ 
    SwiftTable sw = new SwiftTable(); 
    sw.acc_no = from file i get acc no; 
    sw.amount= ......................; 
    sw.bank=.........................; 
    db.Add.SwiftTable(sw); 
    db.SaveChanges(); 
} 

请告诉我什么是这种或任何建议的解决方法将帮助完整。 我正在使用Oracle数据库和c#窗口服务和实体框架5

回答

1

最简单的方法是将您的db.SaveChanges()调用放在文件循环之外。另一种方式是使用交易,如下所示:

((IObjectContextAdapter)db).ObjectContext.Connection.Open(); 

using (System.Data.Common.DbTransaction transaction = ((IObjectContextAdapter)db).ObjectContext.Connection.BeginTransaction(System.Data.IsolationLevel.ReadCommitted)) 
    { 
     try 
     { 
      using (db) 
      { 
       for(int i=0; i<length of record; i ++) 
       { 
        SwiftTable sw = new SwiftTable(); 
        sw.acc_no = from file i get acc no; 
        sw.amount= ......................; 
        sw.bank=.........................; 
        db.Add.SwiftTable(sw); 
        db.SaveChanges(); 
       } 

       transaction.Commit(); 
      } 
     } 
     catch (Exception ex) 
     { 
      transaction.Rollback(); 
     } 
    } 
+0

我得到InvalidoperationException说连接不是打开..任何想法?你的解决方案看起来不错@JanneP –

+0

对不起,我编辑了我的答案,包括连接开放。 – JanneP

+0

另一个例外是Dbcontext已经处置 –