2016-11-10 5 views
1

У меня есть служба Windows, которая при запуске идет по пути, который я определяю и собираю список файлов, и у каждого файла есть записи в нем, которые я вставляю в базу данных (Oracle). Моя проблема в том, что если эта база данных сбилась или если некоторая исключение, как буду я откатить предыдущий рекорд, который вставляется из файла .. Для примераКак откат в Windows Service?

у меня есть 10 файлов каждый файл имеет 5 записей при разборе 7-файла Существует своего рода исключение на 4-е записи, как (db down или что-то еще) Я хочу откат предыдущих 3 записей, которые были вставлены из 7-го файла, возможно ли это?

Мой код здесь ..

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

метод, где я загрузки данных:

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

В быстром разборе я просто разобрать файл и собрать из него данные и сохранить в базе данных это было на самом деле длинный метод, поэтому я не хочу делать беспорядок здесь

in short Я создаю объект таблицы и сохраняю в нем

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 databse и C# windows service и Entity framework 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, который был удален –

 Смежные вопросы

  • Нет связанных вопросов^_^