如何在Windows服务中回滚?

时间:2016-11-10 05:14:37

标签: c# oracle entity-framework windows-services

我有一个Windows服务,当它开始进入我定义的路径并收集文件列表,每个文件都有记录,我插入数据库(Oracle)。我的问题是,如果这个数据库关闭或如果有一些例外我将如何回滚从文件中插入的前一条记录.. 例如

我有10个文件,每个文件有5条记录 解析第7个文件时,第4条记录上有某种异常,如(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");
}

我上传数据的方法:

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

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

简而言之 我制作一个表格的对象并保存在其中

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#windows服务以及实体框架5

1 个答案:

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