如何在 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();
}
}
我有一个 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();
}
}