做了一个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.....回滚    }
}

解决方案 »

  1.   

    试试在插入oracle数据时catch一下异常
    并把从当前从sql读的数据库的id记录起来
    看看插入的时候有那些id的记录有异常
      

  2.   

    加上try异常处理,然后看一下有没有异常情况!
      

  3.   

    子类的伪代码结构如下:
    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秒执行一次.超过操作需要的时间,不知道有没有关系;
      

  4.   

    dataset ds = new dataset();
            string sql= "select a from tb";
            ds = 执行得到结果集(sql);
    -------------------------------------------
    考虑使用sqldataReader,逐条处理数据,这样会比较容易定位到错误,
    insert to oracle时,捕捉一下异常。
    而且楼主这样的做法,当dataset数据量过大时,可能使oracle的事物锁过多,可以考虑逐条提交的方式。good luck.
      

  5.   

    TO:
    测试时,定时器的间隔比较小,大概是1秒执行一次.超过操作需要的时间,不知道有没有关系楼主这样做个测试,不用定时器,直接往里面写,看会不有有问题...如果没问题,那加上Timer,不过Timer的时间设的时间稍长一点,比如10s,再测试下有没有问题...
      

  6.   

    你说Timer的1s超过操作所需的时间,何以见得呢?你测试过?
      

  7.   

    to liujia_0421() 
    跟踪时就知道,当读数据库的代码在执行时,新的调用又开始了.
      

  8.   

    to terryshi(terryshi) 
    确认数据都读到dataset里面了.
      

  9.   

    可能与你的Timer有关系。
    最好是一个Timer处理完毕,在执行另外一个,设置1s,那么以前的没有执行完毕,可能就会出错。
      

  10.   

    大家都没错..原因是我中途执行了一个存储过程,出现异常,这个存储过程就ROLLBACK了前面的操作,造成数据丢失的假象~~