CSDN首页 空间 新闻 论坛 Blog 下载 读书 网摘 搜索 .NET Java 视频 接项目 求职 在线学习 买书 程序员 通知
山寨机中的战斗机! 程序优化工程师到底对IT界有没有贡献
CSDN社区
搜索 收藏 打印 关闭
CSDN社区 >  VC/MFC >  数据库

急!ADO删除数据库纪录集成功,但程序报错。(附源码)

楼主heartthrob(还我汉家服,归我汉家魄)2002-05-20 10:32:17 在 VC/MFC / 数据库 提问

下面是我的删除纪录代码:  
   
  _RecordsetPtr   m_Recordset=NULL;  
  try  
  {  
  m_Recordset.CreateInstance("ADODB.Recordset");  
  //删除数据  
  m_Recordset->Open(select   *   from   纪录表   where   类别=1,_variant_t((IDispatch*)m_Connection,true),adOpenStatic,adLockPessimistic,adCmdText);  
   
  while(!m_Recordset->adoEOF)  
  {  
   
  m_Recordset->Delete(adAffectCurrent);//删除当前纪录  
  m_Recordset->MoveNext();  
  }  
   
  m_Recordset->Close();  
  }  
   
  catch(_com_error&   e)  
  {  
  AfxMessageBox(   (TCHAR*)   e.Description()   );  
  return   false;  
  }  
  return   true;  
   
          当我删除指定记录时,假如共有10条纪录,则在删除完最后一条纪录(第十条),然后MoveNext()时程序被捕作到异常,报错原因:“行句柄引用了一个删除的行或被标志为删除的行”。但纪录已经被全部删除。请问我该如何防止这种情况?  
   
        我这样尝试过:  
   
  while(!m_Recordset->adoEOF)  
  {  
   
  m_Recordset->Delete(adAffectCurrent);//删除当前纪录  
  m_Recordset->MoveFirst();  
  }  
   
  m_Recordset->Close();  
    发现更行不通。  
    尝试另外一种方法:  
  while(!m_Recordset->adoEOF)  
  {  
   
  m_Recordset->Delete(adAffectCurrent);//删除当前纪录  
                                                                          if(m_Recordset->adoEOF)  
                                                                                      break;  
  m_Recordset->MoveNext();  
  }  
    但是也不行。  
      请高手指教,我该怎么写?     十分感谢。   分不是问题。  
  m_Recordset->Close(); 问题点数:100、回复次数:42Top

1 楼zengchangshuo(救救我吧)回复于 2002-05-20 10:54:47 得分 5

_ConnectionPtr   pConn;  
  HRESULT   hr;  
  CString   strSql=_T("delete   *   from   纪录表   where   类别=1");  
  hr=pConn.CreateInstance(__uuidof(Connection));  
  try  
  {  
   
  hr=pConn->Open((LPCTSTR)       strDataSource,"","",adModeUnknown);  
  if   (!SUCCEEDED(hr))    
  return   false;  
  }  
  catch   (_com_error   &e) //   Any   errors?  
  {  
   
  //   Display   the   error  
  CString   strError;  
  strError.Format("运行时出错:   '%d   (%x)'",e.Error(),e.Error()   );  
  strError   +="\n";  
  strError   +=e.Description();  
  AfxMessageBox("设置GPS核心数据库失败!\n"+strError);  
  return   FALSE;  
  }  
  pConn->Execute(strSql,...)     //后面的参数没有写,自己添上吧!Top

2 楼heartthrob(还我汉家服,归我汉家魄)回复于 2002-05-20 11:35:19 得分 0

上面这未仁兄搞错了吧,我的错误并不在连接,而在于删除纪录。  
  while(!m_Recordset->adoEOF)  
  {  
   
  m_Recordset->Delete(adAffectCurrent);//删除当前纪录  
  m_Recordset->MoveNext();  
  }  
  假如一共有10条纪录,那么当执行到删除最后一条纪录的时候m_Recordset->Delete(adAffectCurrent);然后再m_Recordset->MoveNext()时报错:“行句柄引用了一个删除的行或被标志为删除的行”。但数据库中的所有指定数据均已经成功删除。Top

3 楼chenchongpan(苍松)回复于 2002-05-20 11:54:24 得分 5

可以这样试试:  
  1.while(!m_Recordset->adoEOF)  
  {  
          m_Recordset->Delete(adAffectCurrent);//删除当前纪录  
          if(!m_Recordset->adoEOF)   m_Recordset->MoveNext();  
  }  
  2.   难道不能用sql语句直接提交给数据库吗?为什么要采用删除记录集的方式?Top

4 楼mryinliang(海崖)回复于 2002-05-20 12:37:58 得分 0

楼上说的对,直接用sql删除就行了,或则  
  在删除最后一个的时候判断是否到结尾  
  Top

5 楼fire_zxv(辉)回复于 2002-05-20 12:41:21 得分 0

按你的最后一个方法应该能行的啊  
  恩  
  还是用SQL语句吧Top

6 楼tleon(澎蜞)回复于 2002-05-20 12:43:29 得分 5

你可以用这个  
   
  try  
  {  
  m_Recordset.CreateInstance("ADODB.Recordset");  
  //删除数据  
  m_Recordset->Open(select   *   from   纪录表   where   类别=1,_variant_t((IDispatch*)m_Connection,true),adOpenStatic,adLockPessimistic,adCmdText);  
  //得到总的记录数  
  int   reCords   =   m_Recordset->RecordCount;  
  for   (int   i   =0;   i<   reCords;i++)  
  {  
   
  m_Recordset->Delete(adAffectCurrent);//删除当前纪录  
  m_Recordset->MoveNext();  
  }  
  m_Recordset->Close();  
  }  
   
  catch(_com_error&   e)  
  {  
  AfxMessageBox(   (TCHAR*)   e.Description()   );  
  return   false;  
  }  
  return   true;  
  Top

7 楼gxingmin(小高)回复于 2002-05-20 12:44:32 得分 0

直接用SQL语句吧,因为在你进入循环体后,循环总数已经固定不变,但是你的记录已经在不断减少,所以到后来你表中已经没有记录,但是循环还没有结束。Top

8 楼nppas(小苏)回复于 2002-05-20 13:02:51 得分 0

不知道你的目的是什么,如果只是删除类别=1的记录,只要  
  _RecordsetPtr   pRecordSet;  
  _bstr_t   Query("delete   表名   where   类别=1");  
  _variant_t   vRecsAffected(0L);  
  try  
  {  
                  pRecordSet=m_pConnection->Execute           (Query,&vRecsAffected,adOptionUnspecified);  
  }  
  catch   (_com_error   &e)  
  {  
  TRACE("删除记录错误;错误:%08lx.\n",e.Error());  
  TRACE("错误消息:%s.\n",e.ErrorMessage());  
  TRACE("错误来源:%s.\n",(LPCTSTR)_bstr_t(e.Source()));  
  TRACE("错误描述:%s.\n",(LPCTSTR)_bstr_t(e.Description()));  
  }  
  catch(...)  
  {  
  TRACE("\n***系统内部错!!***\n");  
  }  
  而不用先查询到RecordSet中,在删除,这样效率不高,而且容易出错。Top

9 楼heartthrob(还我汉家服,归我汉家魄)回复于 2002-05-20 14:10:39 得分 0

我这个程序是不能直接用SQL语句的,因为我要对读出的每条纪录数据均要先做处理,然后再把他删除。  
  chenchongpan(苍松)   说的方法  
  while(!m_Recordset->adoEOF)  
  {  
          m_Recordset->Delete(adAffectCurrent);//删除当前纪录  
          if(!m_Recordset->adoEOF)   m_Recordset->MoveNext();  
  }  
  我试了,不行。  
  tleon(澎蜞)   (     )   说的采用   m_Recordset->RecordCount;方法我前天用过,确实可以,但有一个问题,就是   m_Recordset->RecordCount当纪录个数较多时候并不准确。  
   
  难道没有办法了吗?Top

10 楼heartthrob(还我汉家服,归我汉家魄)回复于 2002-05-20 14:14:09 得分 0

m_Recordset->Open(select   *   from   纪录表   where   类别=1,_variant_t((IDispatch*)m_Connection,true),adOpenStatic,adLockPessimistic,adCmdText);  
   
  while(!m_Recordset->adoEOF)  
  {  
                                                                        ............  
                                                                        //取该纪录数据,进行处理  
   
  m_Recordset->Delete(adAffectCurrent);//删除当前经过处理的纪录  
  m_Recordset->MoveNext();//取下一条纪录.  
  }  
   
  呵呵,   搞不定。删除成功,就是最后会报错。难道要我把捕作错误的语句去掉才行吗?Top

11 楼kingzai(stevenzhu)回复于 2002-05-20 14:22:35 得分 10

加这样的判断条件:  
  BOOL   isEmpty()  
  {  
  if(m_Recordset->adoBOF()   &&   m_Recordset->adoEOF())  
  {  
   
  return   TRUE;  
  }  
  else  
  return   FALSE;  
   
  }Top

12 楼heartthrob(还我汉家服,归我汉家魄)回复于 2002-05-20 14:37:38 得分 0

上面这句老兄的话我没看懂,m_Recordset->adoBOF说没有这个member,去掉括号也不行。Top

13 楼michaelshur(石心)回复于 2002-05-20 14:42:42 得分 5

while(pRecordset->GetRecordCount()   >   0)  
  {  
  pRecordset->Move(0,   _variant_t((long)adBookmarkFirst));  
  pRecordset->Delete(adAffectCurrent);  
  }  
  试试  
  Top

14 楼zengchangshuo(救救我吧)回复于 2002-05-20 14:53:16 得分 5

你还没有搞定吗?第一个恢复就可以,写一条delete语句就行了为什么还要用  
  Recordset,再说你用的Recordset没有考入到AOF参数,当然出错,因为你没有  
  搞定AdoEof和MoveNext的关系。如果你一定要用你自己的方法应该这样  
   
  while(1)  
  {  
          m_Recordset->Delete()  
          if(m_Recordset->adoEOF))  
                  跳出循环  
          else  
                m_Recordset->MoveNext();  
  }Top

15 楼heartthrob(还我汉家服,归我汉家魄)回复于 2002-05-20 15:08:48 得分 0

还是不行。  
  michaelshur(石心)   所说:  
  while(pRecordset->GetRecordCount()   >   0)  
  {  
  pRecordset->Move(0,   _variant_t((long)adBookmarkFirst));  
  pRecordset->Delete(adAffectCurrent);  
  }  
  不行。经调试,发现这个GetRecordCount值在删除纪录后根本就没有改变。  
   
    zengchangshuo(救救我吧)   所说:  
  while(1)  
  {  
          m_Recordset->Delete()  
          if(m_Recordset->adoEOF))  
                  跳出循环  
          else  
                m_Recordset->MoveNext();  
  }  
  跟我以前用过的另外一种方法:  
  while(!m_Recordset->adoEOF)  
  {  
   
  m_Recordset->Delete(adAffectCurrent);//删除当前纪录  
                                                                          if(m_Recordset->adoEOF)  
                                                                                      break;  
  m_Recordset->MoveNext();  
  }  
  是一样的,行不通。这个if(m_Recordset->adoEOF)语句好像不怎么起作用,在删除了最后一条纪录后m_Recordset->adoEOF仍然为0,然后执行m_Recordset->MoveNext()出错。  
   
   
  真受不了了。Top

16 楼fire_zxv(辉)回复于 2002-05-20 15:16:51 得分 5

干脆用TRY,CATCH  
  因为你是最后一句出错  
  然后就继续干下面的程序吧Top

17 楼heartthrob(还我汉家服,归我汉家魄)回复于 2002-05-20 15:49:57 得分 0

不是吧?  
  我要在很多地方用到啊。如果都这样.......    
  没有办法了吗?Top

18 楼heartthrob(还我汉家服,归我汉家魄)回复于 2002-05-20 17:25:11 得分 0

快来救命阿!!!  
  这么多高手在场夜搞不定,呜呜~~~~     真命苦。Top

19 楼heartthrob(还我汉家服,归我汉家魄)回复于 2002-05-21 10:00:41 得分 0

呼呼,终于搞定了,看来还得靠自力更生。我的方法如下:  
  _RecordsetPtr   m_Recordset=NULL;  
  try  
  {  
  m_Recordset.CreateInstance("ADODB.Recordset");  
  //删除业务数据(要先对数据进行处理)  
  m_Recordset->Open(select   *   from   表   where   类型=1",_variant_t((IDispatch*)m_Connection,true),adOpenStatic,adLockPessimistic,adCmdText);  
   
  //计算纪录集条数  
  int   n=0;  
  while(!m_Recordset->adoEOF)  
  {  
  m_Recordset->MoveNext();  
  n++;  
  }  
   
  //移动到第一条  
  if(!m_Recordset->BOF)  
  m_Recordset->MoveFirst();  
   
  //按条数删除  
  for(n;n>0;n--)  
  {  
  if(m_Recordset->adoEOF)  
  break;  
  m_Recordset->Delete(adAffectCurrent);//删除当前纪录  
  if(n==1)  
  break;  
  m_Recordset->MoveNext();  
  }  
   
  m_Recordset->Close();  
  }  
   
  catch(_com_error&   e)  
  {  
  AfxMessageBox("操作失败");  
  AfxMessageBox(   (TCHAR*)   e.Description()   );  
  return   false;  
  }  
   
   
          在这里我采用了 m_Recordset->MoveNext()的方法对记录集进行历遍,这样可以得到记录集的精确条数(采用GetRecordCount的方法得到的条数是不准确的),然后再对纪录一条条进行处理并逐条删除,当删除完最后一条的时候直接跳出来了。这样就不会出错了。  
   
          我的理解:adoEOF并不是用来判断到最后一条纪录的,而是判断是否定位在最后一个记录的后面!因为我的纪录在一条条删除,所以当执行到以后一条纪录删除的时候纪录已经被我删除空了,但此时adoEOF判断仍然为false,当movenext的时候他移动到下一条(即最后一条纪录的后一条,我也不只到到底是哪条),但由于此时纪录全被我删除,所以报错:“行句柄引用了一个删除的行或被标志为删除的行”。  
   
          我说的可能不是很清楚,欢迎大家继续讨论,贴子过一段时间再结。Top

20 楼tleon(澎蜞)回复于 2002-05-21 10:16:35 得分 5

你这样做速度会很慢的哦  
   
  我想到了另外的一个方法就是使用until  
   
  也就是先删除记录后,在判断m_Recordset->adoEOF()Top

21 楼heartthrob(还我汉家服,归我汉家魄)回复于 2002-05-21 11:22:43 得分 0

采用判断m_Recordset->adoEOF()的方法是行不通的。我的理解是他用来判断当前记录集是否是最后一个记录的"下一个"记录(这个"下一个"可能不存在,只用于判别作用,我不止到如何表达),而不是判断当前纪录是否是最后一条纪录。   删除纪录后判断m_Recordset->adoEOF()其值永远是FALSE。我验证过很多遍了,行不通。  
  Top

22 楼Knight_T(骑士)回复于 2002-05-21 12:35:54 得分 5

我没有见过这么“傻”的人,很象我大学三年级的时候。Top

23 楼cityyokel(原来如此)回复于 2002-05-21 13:51:49 得分 5

最简单办法:  
  CString   strDel;  
  strDel.Format("SELECT   *   FROM   表   WHERE   属性   LIKE   'XXX'");  
  _bstr_t   sqlDel=strDel;  
  _variant_t   RecordsAffect;  
  try{//如果结果只有一条  
  m_Recordset=m_Connection->Execute(sqlDel,&RecordsAffect,adCmdText);  
  /*如果结果不止一条:while(!m_Recordset->GetadoEOF()){...}*/  
  }catch(_com_error   &e){  
  AfxMessageBox(e.ErrorMessage());  
  }  
  当然,我假设你m_Connection已经初始化了。  
  并且已经连接上了。Top

24 楼cityyokel(原来如此)回复于 2002-05-21 13:57:06 得分 0

更正:  
  上述sql语句改为  
  DELETE   *   FROME   表   WHERE   属性   LIKE   'XXX'  
   
  结果集不管怎样都可以一干二净。  
  Top

25 楼littlecatie(cool)回复于 2002-05-21 14:19:23 得分 0

为什么要这么做,直接sql语句多快呀Top

26 楼littlecatie(cool)回复于 2002-05-21 14:20:36 得分 0

就像cityyokel(原来如此)   说的  
  DELETE   *   FROM   table   WHERE   属性   LIKE   'XXX'Top

27 楼heartthrob(还我汉家服,归我汉家魄)回复于 2002-05-21 14:22:40 得分 0

我上面说过了,不能直接用SQL   语句删除的阿。  
          我要先对取出来的数据进行处理,然后才删除的。处理一条删除一条。因为表中的数据每时每刻在不断的变化,我要即使的对这些新增的数据进行处理然后再删除他们。   能直接用SQL语句我早就用了。  
          各位从其它的地方下手吧。我能想到的只有采用movenext方法算出总数了。  
          有耐心的把前面的贴子都看一看。Top

28 楼jeffchen(Jeff)回复于 2002-05-21 14:29:15 得分 5

MoveNext会返回一个HRESULT值,如果已经移到最后一条将返回DB_S_ENDOFROWSETTop

29 楼heartthrob(还我汉家服,归我汉家魄)回复于 2002-05-21 16:16:56 得分 0

我这样写:  
  hr=m_Recordset->MoveNext();  
  if(hr==DB_S_ENDOFROWSET)  
  {  
  m_Recordset->Delete(adAffectCurrent);//删除当前纪录  
  break;  
  }  
   
  编译器说DB_S_ENDOFROWSET没有定义。   怎么回事?Top

30 楼jeffchen(Jeff)回复于 2002-05-21 16:35:37 得分 0

#include   <OLEDBERR.H>  
   
  应该这样写:  
  while(SUCCEDED(hr)   &&   hr!=DB_S_ENDOFROWSET)  
  {  
      //   do   something   here  
      hr=m_Recordset->MoveNext();  
  }Top

31 楼jeffchen(Jeff)回复于 2002-05-21 16:38:00 得分 0

少了一个E,应该是:  
  while(SUCCEEDED(hr)   &&   hr!=DB_S_ENDOFROWSET)  
   
  这段代码我这项目中用的,没错。Top

32 楼jintaos(happyhappy)回复于 2002-05-21 21:15:05 得分 5

对于数据库的记录集合,如果指针已经移动到最后条记录,如果在试图移动,会抛出异常Top

33 楼improgrammer(无忌)回复于 2002-05-22 02:19:02 得分 5

虽然说“表中的数据每时每刻在不断的变化,我要即使的对这些新增的数据进行处理然后再删除他们”,实际上还是查询一批,处理一批。  
  用SQL:DELETE   FROM   ...  
  能直接用SQL语句我早就用了。Top

34 楼improgrammer(无忌)回复于 2002-05-22 02:35:50 得分 0

虽然说“表中的数据每时每刻在不断的变化”,实际上还是查询一批,处理一批。  
   
  虽然不能用SQL:DELETE   FROM   ...,但是处理和删除是可以分开的。  
   
  在循环体内对ADODB::Recordset::Delete(adAffectCurrent)的调用是否可以用在循环体外(后面)用adAffectAll代替adAffectCurrent实现成批删除呢?(手头没有文档,不知有没有adAffectAll这个选项)  
   
  如果“选进记录集合的记录未必都该删除”,那么可以采取更笨重的办法:加一个标记字段,在逐条访问时标记那些该删的,然后不定时地调用DELETE   FROM语句成批删掉该删的记录。  
   
  总之,逐条调用Delete()不是好办法。  
   
  Top

35 楼zxs218(Frank Zhou)回复于 2002-05-22 08:50:31 得分 5

 
  你这样做:肯定可行;  
   
  m_Recordset->Delete(adAffectCurrent);//删除当前经过处理的纪录  
  m_Recordset->Resync(adAffectAll,   adResyncAllValues);  
  m_Recordset->MoveNext();//取下一条纪录.  
   
  ================================================================  
   
  CSDN   论坛助手   Ver   1.0   B0402提供下载。   改进了很多,功能完备!  
   
  ★     浏览帖子速度极快![建议系统使用ie5.5以上]。   ★     多种帖子实现界面。    
  ★     保存帖子到本地[html格式]★     监视您关注帖子的回复更新。  
  ★     可以直接发贴、回复帖子★     采用XML接口,可以一次性显示4页帖子,同时支持自定义每次显示帖子数量。可以浏览历史记录!    
  ★     支持在线检测程序升级情况,可及时获得程序更新的信息。  
   
  ★★   签名     ●      
            可以在您的每个帖子的后面自动加上一个自己设计的签名哟。  
   
  Http://www.ChinaOK.net/csdn/csdn.zip  
  Http://www.ChinaOK.net/csdn/csdn.rar  
  Http://www.ChinaOK.net/csdn/csdn.exe         [自解压]  
   
  Top

36 楼heartthrob(还我汉家服,归我汉家魄)回复于 2002-05-22 15:06:23 得分 0

to     jeffchen(Jeff):  
  我这样写,可仍然不行,原因相同:  
  m_Recordset->Open(select   *   from   表   where   类型=1",_variant_t((IDispatch*)m_Connection,true),adOpenStatic,adLockPessimistic,adCmdText);  
  while(!m_Recordset->adoEOF)  
  {  
  while(SUCCEEDED(hr)   &&   hr!=DB_S_ENDOFROWSET)  
  {  
  //   do   something   here  
  m_Recordset->Delete(adAffectCurrent);//删除当前纪录  
  hr=m_Recordset->MoveNext();  
  }  
  break;  
  }  
  假如我有4条纪录,则while(SUCCEEDED(hr)   &&   hr!=DB_S_ENDOFROWSET)循环会执行4次,并在最后一次执行hr=m_Recordset->MoveNext()时出错。看起来好像是hr!=DB_S_ENDOFROWSET没有起作用。   为什么?Top

37 楼heartthrob(还我汉家服,归我汉家魄)回复于 2002-05-22 15:09:34 得分 0

to   zxs218(Frank   Zhou):  
          当我执行到m_Recordset->Resync(adAffectAll,   adResyncAllValues)时,报错说"当前程序不支持刷新基础值",请问是什么意思?Top

38 楼chenchongpan(苍松)回复于 2002-05-22 17:40:55 得分 5

能不能这样?  
  先把满足条件的记录生成一个临时表(用select   *   into一次搞定),再对数据该怎么处理就怎么处理,然后删除的时候根据临时表的数据进行删除(delete   from   目标表   where   主键   in   (临时表中的主键),也是一次搞定),根据目前我对你这个问题的理解,这个方法应该行得通。Top

39 楼heartthrob(还我汉家服,归我汉家魄)回复于 2002-05-22 18:13:20 得分 0

上面的主意好像不错  
  不过速度方面是不是跟我那用一条条movenext算出纪录数,然后一条条处理在删除查不错或者还不占优势呢?毕竟你还要delete   from   目标表   where   主键   in   (临时表中的主键)。Top

40 楼zxs218(Frank Zhou)回复于 2002-05-23 09:44:43 得分 20

打开使用动态的方式:  
   
  m_Recordset->Open(select   *   from   纪录表   where   类别=1,_variant_t((IDispatch*)m_Connection,true),adOpenDynamic,adLockPessimistic,adCmdText);  
   
  注意这几种的区别:  
   
  Dynamic   cursor   —   allows   you   to   view   additions,   changes,   and   deletions   by   other   users;   allows   all   types   of   movement   through   the   Recordset   that   doesn't   rely   on   bookmarks;   and   allows   bookmarks   if   the   provider   supports   them.    
  Keyset   cursor   —   behaves   like   a   dynamic   cursor,   except   that   it   prevents   you   from   seeing   records   that   other   users   add,   and   prevents   access   to   records   that   other   users   delete.   Data   changes   by   other   users   will   still   be   visible.   It   always   supports   bookmarks   and   therefore   allows   all   types   of   movement   through   the   Recordset.    
  Static   cursor   —   provides   a   static   copy   of   a   set   of   records   for   you   to   use   to   find   data   or   generate   reports;   always   allows   bookmarks   and   therefore   allows   all   types   of   movement   through   the   Recordset.   Additions,   changes,   or   deletions   by   other   users   will   not   be   visible.   This   is   the   only   type   of   cursor   allowed   when   you   open   a   client-side   Recordset   object.    
  Forward-only   cursor   —   allows   you   to   only   scroll   forward   through   the   Recordset.   Additions,   changes,   or   deletions   by   other   users   will   not   be   visible.   This   improves   performance   in   situations   where   you   need   to   make   only   a   single   pass   through   a   Recordset.    
  Top

41 楼heartthrob(还我汉家服,归我汉家魄)回复于 2002-05-23 17:32:19 得分 0

谢谢大家。  
  把光标换成adOpenDynamic方式后,问题解决了。  
   
  十分感谢!Top

42 楼chenchongpan(苍松)回复于 2002-05-24 07:32:08 得分 0

to   heartthrob(小荣)    
  1.搞半天原来是这个错误!我在工作中只要是打开记录集,都是用adOpenDynamic方式,所以觉得你这个问题很高深,因为我碰到的情况只有可能不能返回正确的记录集数量(我碰到过一次,操作远程数据的时候),但是adoEOF是肯定能够正确返回的。  
  2.根据我自己的体会,delete   from   目标表   where   主键   in   ...的方式比movenext逐条删除要快(在操作远程数据的时候尤是如此),不过我一般用ado直接连接sqlserver数据库,如果用odbc的话可能你的方法要快(我没有具体体验过)。  
  Top

相关问题

  • ado报错
  • 删除指针为什么报错?
  • 一个书上的例子,为什么报错啊?(附源码)
  • 问ado控件,报错:查询过期
  • 用idHttp1.DoRequest()删除服务器上的文件,报错!
  • 删除空记录无法报错呢?大家来帮帮我
  • 我快不行了!!!求用DELPHI 5 ADO控件进行添加、修改、删除记录操作的源码!万分感谢!!!
  • 求ado,odbc也可源码
  • IIS中无法更新删除数据库记录(程序没报错)
  • 有关ADO删除记录

关键词

  • .net
  • 语句
  • hr
  • 数据库
  • 数据
  • recordset
  • 删除
  • 纪录
  • adoeof
  • adaffectcurrent

得分解答快速导航

  • 帖主:heartthrob
  • zengchangshuo
  • chenchongpan
  • tleon
  • kingzai
  • michaelshur
  • zengchangshuo
  • fire_zxv
  • tleon
  • Knight_T
  • cityyokel
  • jeffchen
  • jintaos
  • improgrammer
  • zxs218
  • chenchongpan
  • zxs218

相关链接

  • Visual C++类图书
  • Visual C++类源码下载

广告也精彩

反馈

请通过下述方式给我们反馈
反馈
提问
网站简介|广告服务|VIP资费标准|银行汇款帐号|网站地图|帮助|联系方式|诚聘英才|English|问题报告
北京创新乐知广告有限公司 版权所有, 京 ICP 证 070598 号
世纪乐知(北京)网络技术有限公司 提供技术支持
Copyright © 2000-2008, CSDN.NET, All Rights Reserved
GongshangLogo