做了一个C#的小程序,定时把数据从sql server中取出,并放到oracle中,读两个数据库前都打开了事务,数据处理完后commit,但经常出现数据丢失的问题,在oracle中的数据与从sql server中读取的数据的数量不一致,请高手分析一下原因~程序的结构如下:
class father()
{
void BeforeExc()
{
打开连接...打开事务
} void AfterExc()
{
关闭连接
} virtual void OnExc()
{ }
}class CA :father
{
override void OnExc()
{
try
{
从sql server中取数据...
插入oralce中.. commit();
}
catch.....回滚 }
}
class father()
{
void BeforeExc()
{
打开连接...打开事务
} void AfterExc()
{
关闭连接
} virtual void OnExc()
{ }
}class CA :father
{
override void OnExc()
{
try
{
从sql server中取数据...
插入oralce中.. commit();
}
catch.....回滚 }
}
并把从当前从sql读的数据库的id记录起来
看看插入的时候有那些id的记录有异常
class CA :father
{
override void OnExc()
{
try
{
dataset ds = new dataset();
string sql= "select a from tb";
ds = 执行得到结果集(sql);
foreach(datarow dr in ds...rows)
{
string sql = "insert into d(a)values('"+dr["a"]+"');
执行插入(sql)
} commit();
}
catch.....回滚 }
}在窗体上,我使用了Threading.Timer来作定时器,在它的回调方法中
static void Work(object state)
{
CA ca = new CA();
CA.exc();
}
.......exc()是这个类的执行方法,执行读写数据库的行为测试时,定时器的间隔比较小,大概是1秒执行一次.超过操作需要的时间,不知道有没有关系;
string sql= "select a from tb";
ds = 执行得到结果集(sql);
-------------------------------------------
考虑使用sqldataReader,逐条处理数据,这样会比较容易定位到错误,
insert to oracle时,捕捉一下异常。
而且楼主这样的做法,当dataset数据量过大时,可能使oracle的事物锁过多,可以考虑逐条提交的方式。good luck.
测试时,定时器的间隔比较小,大概是1秒执行一次.超过操作需要的时间,不知道有没有关系楼主这样做个测试,不用定时器,直接往里面写,看会不有有问题...如果没问题,那加上Timer,不过Timer的时间设的时间稍长一点,比如10s,再测试下有没有问题...
跟踪时就知道,当读数据库的代码在执行时,新的调用又开始了.
确认数据都读到dataset里面了.
最好是一个Timer处理完毕,在执行另外一个,设置1s,那么以前的没有执行完毕,可能就会出错。