如何在 windows 服务中回滚?

How to roll back in windows Service?

我有一个 windows 服务,当它启动时会转到我定义和收集文件列表的路径,每个文件中都有我插入数据库(Oracle)的记录。我的问题是,如果该数据库出现故障,或者如果出现异常,我将如何回滚从文件中插入的先前记录。 例如

我有10个文件每个文件有5条记录 解析第 7 个文件时,第 4 个记录出现某种异常(数据库下降或其他任何情况)我想回滚从第 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 解析中,我只是解析文件并从中收集数据并保存在数据库中,这实际上是一个很长的方法,所以我不想在这里弄得一团糟

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

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 服务和 Entity framework 5

最简单的方法是将 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();
        }
    }