大家入来研究下这个代码,可能会也想不明 你跟踪时nPosition的值怎么变,一般在多大时会重复 解决方案 » 免费领取超大流量手机卡,每月29元包185G流量+100分钟通话, 中国电信官方发货 这样修改试试,我以前曾碰到类似的问题 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; } } 不行,严重出错,出错提示是 ASSERT(CanRestart()); 你倒过来修改看看,我估计是索引的问题,倒过来修改,索引就不会发生变化。 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; } } 你这样修改看看, 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; } } 注意'Refresh' : is not a member of 'CDaoRecordset' 你这样修改看看,但愿能成功。 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; } } 或者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(); }} what a pity,program test had failed again! 源码发过来,我帮你测试看看[email protected] Sorry,其他字段都不可以当主索引。究竟是不是程序执行速度快的问题,有次逐个记录检测时,发现当执行到某行记录时,其下一行并没有执行到,结果显示表明是执行了再下一行(即跳了一行),此时就即时出现重复的错误,有无头绪怎改? 关于上面的检测是在原代码中加入了两行代码: 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(); } “有次逐个记录检测时,发现当执行到某行记录时,其下一行并没有执行到,结果显示表明是执行了再下一行(即跳了一行),此时就即时出现重复的错误,”我早就意识到是这个问题,我以前也遇到过。不过那时我是用ADO编写的,所以在Update之后调用了Resync就可以了但是在DAO中我没有找到类似的函数。所以我建议使用绝对位置来更新数据。只是我也没有使用它的经验。 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都有分!多谢参与。 tcp服务器连接数多少合适 如何在窗口的图片静态控件上增加横和坚的滚动条? 出差归来,散分 什么是字符型协议?什么是比特流型协议? 界面设计问题 各位,小弟问问分割视图的,会的来啊 急, XP系统下,如何限制多个用户之能同时启动一个程序进程。 请问:ADO VC++ Extentions是什么东西,怎么用呀?? 帮个忙,请问java中某个class找不到咋办? 关于控件消息的问题 断点续传与Cache的问题 如何往CString插入回车和换行和空格
{
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;
}
}
不行,严重出错,出错提示是 ASSERT(CanRestart());
{
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;
}
}
{
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;
}
}
注意'Refresh' : is not a member of 'CDaoRecordset'
{
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;
}
}
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();
}
}
what a pity,program test had failed again!
Sorry,其他字段都不可以当主索引。究竟是不是程序执行速度快的问题,有次逐个记录检测时,发现当执行到某行记录时,其下一行并没有执行到,结果显示表明是执行了再下一行(即跳了一行),此时就即时出现重复的错误,有无头绪怎改?
关于上面的检测是在原代码中加入了两行代码:
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();
}
但是在DAO中我没有找到类似的函数。所以我建议使用绝对位置来更新数据。只是我也没有使用它的经验。
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都有分!多谢参与。