你跟踪时nPosition的值怎么变,一般在多大时会重复

解决方案 »

  1.   

    这样修改试试,我以前曾碰到类似的问题   while(!rs.IsEOF())
       {
    try
    {
    rs.Edit();
    var=COleVariant(++nPosition,VT_I4); //Long Type
    rs.SetFieldValue(0,var);
    rs.Update();
    rs.Requery();       // 加上这一句, 也许就会正确
    rs.MoveNext();
    }
    catch(CDaoException* e)
    {
    AfxMessageBox(e->m_pErrorInfo->m_strDescription);
    e->Delete();
    return FALSE;
    }
       }
      

  2.   


    不行,严重出错,出错提示是 ASSERT(CanRestart());
      

  3.   

    你倒过来修改看看,我估计是索引的问题,倒过来修改,索引就不会发生变化。   while(!rs.IsBOF())
       {
    try
    {
    rs.Edit();
    var=COleVariant(++nPosition,VT_I4); //Long Type
    rs.SetFieldValue(0,var);
    rs.Update();
    rs.MovePrev();
    }
    catch(CDaoException* e)
    {
    AfxMessageBox(e->m_pErrorInfo->m_strDescription);
    e->Delete();
    return FALSE;
    }
       }
      

  4.   

    你这样修改看看,   while(!rs.IsBOF())
       {
    try
    {
    rs.Edit();
    var=COleVariant(++nPosition,VT_I4); //Long Type
    rs.SetFieldValue(0,var);
    rs.Update();
    rs.Refresh();
    }
    catch(CDaoException* e)
    {
    AfxMessageBox(e->m_pErrorInfo->m_strDescription);
    e->Delete();
    return FALSE;
    }
       }
      

  5.   


    注意'Refresh' : is not a member of 'CDaoRecordset'
      

  6.   

    你这样修改看看,但愿能成功。   long lPos;   while(!rs.IsBOF())
       {
    try
    {
    rs.MoveNext();
    lPos = rs.GetAbsolutePosition();
    rs.MovePrev();
    rs.Edit();
    var=COleVariant(++nPosition,VT_I4); //Long Type
    rs.SetFieldValue(0,var);
    rs.Update();
    rs.SetAbsolutePosition(lPos);
    }
    catch(CDaoException* e)
    {
    AfxMessageBox(e->m_pErrorInfo->m_strDescription);
    e->Delete();
    return FALSE;
    }
       }
      

  7.   

    或者long lCount;
    long i;lCount = rs.GetRecordCount();for (i = 0; i < lCount; i++) {
        rs.SetAbsolutePosition(i);
        rs.GetFieldValue(0, var);
        if (var.lVal > /* 某个值 */) {
            var.lVal = /* 某个值 */;
            var.Edit();
            rs.SetFieldValue(0, var);
            rs.Update();
        }
    }
      

  8.   


    what a pity,program test had failed again!
      

  9.   

    源码发过来,我帮你测试看看[email protected]
      

  10.   


    Sorry,其他字段都不可以当主索引。究竟是不是程序执行速度快的问题,有次逐个记录检测时,发现当执行到某行记录时,其下一行并没有执行到,结果显示表明是执行了再下一行(即跳了一行),此时就即时出现重复的错误,有无头绪怎改?
      

  11.   


    关于上面的检测是在原代码中加入了两行代码:
    try
    {
    rs.Edit();                  CString k;
                      k.Format("%d",nPosition);
                      AfxMessageBox(k); var=COleVariant(++nPosition,VT_I4); //Long Type
    rs.SetFieldValue(0,var);
    rs.Update();
    rs.MoveNext();
    }
      

  12.   

    “有次逐个记录检测时,发现当执行到某行记录时,其下一行并没有执行到,结果显示表明是执行了再下一行(即跳了一行),此时就即时出现重复的错误,”我早就意识到是这个问题,我以前也遇到过。不过那时我是用ADO编写的,所以在Update之后调用了Resync就可以了
    但是在DAO中我没有找到类似的函数。所以我建议使用绝对位置来更新数据。只是我也没有使用它的经验。
      

  13.   


    Thanks:我的程序已经做出来了,其实上面有些Programmer的代码是没错的,后来我验证都正确,不过我原来我的代码中前几行要改成以下:原来:
       CDaoTableDef td(m_pDB);
       td.Open(m_TableName);   CDaoRecordset rs(m_pDB);   rs.Open(&td,dbOpenTable,0);改为:
       CDaoRecordset rs(m_pDB);
       rs.Open(dbOpenDynaset,"Select * From "+m_TableName);此时直接用我的原程序调试,无论多少记录都得出正确的结果。改成这样,是在查MSDN时得出的。虽然是得出了答案,但我还是不明白为什么一定要改过来,如各位可以理解的请告知一下,我就要结贴了,上面的Programmer都有分!多谢参与。