最近第一次用Oracle做开发,以前用Ado方式做过MsSql,Access,Mysql,db2.都没有遇到这次这样变态的问题.
我是采用的Oracle的Oledb驱动.请大家看一下代码
try
{
  TESTHR(m_pConnection.CreateInstance(__uuidof(Connection)));
  m_pConnection->Open(Provider=OraOLEDB.Oracle;Data Source=a_localhost;User ID=SYSTEM;Password=manager","","",adModeUnknown);
  char strSql[512];
  sprintf(strSql, "select * from A");
  _RecordsetPtr pRst("ADODB.Recordset");
  pRst->Open(strSql, _variant_t((IDispatch *)m_pConnection,true), 
adOpenStatic, adLockReadOnly, adCmdText);
  if (!(pRst->EndOfFile)){
    pRst->MoveFirst();
    ....
  }
}
catch (_com_error &e) {
PrintErrorLog("CExpertSelSvr异常,异常信息:%s", e.ErrorMessage());
m_pConnection.Release();
return false;
}
catch (...) {
ErrorLog("CExpertSelSvr未知异常");
return false;
  }当A表中没有数据时,可以执行下去.只要A表中有数据,在pRst->Open这里就会出现异常,而且不是ADO异常,是catch (...)捕获.请指点一下,我犯了什么低级错误???

解决方案 »

  1.   

    偶用的是这个……
    adOpenKeyset,
    adLockOptimistic,
    adCmdText));
      

  2.   

    pRst->Open(
    strSql, 
    _variant_t((IDispatch *)m_pConnection,true), 
    adOpenForwardOnly,
    adLockReadOnly,
    adCmdText);pRst->MoveFirst();//去掉,仅向前的游标不支持向前移动游标//不知道行不行,以前一直都这样用,没有出现什么问题
      

  3.   

    ADOPENSTATIC(=3)      
    可读写,当前数据记录可自由移动,可看到新增记录ADLOCKREADONLY(=1)     
    缺省锁定类型,记录集是只读的,不能修改记录是否这个原因呢?
    这两个一起用,那到底是只读呢,还是可读写?
      

  4.   

    vieri_ch老大你眼花了?
    楼主好像没用adOpenForwardOnly啊~
      

  5.   

    把Provider=OraOLEDB.Oracle 改为Provider=MSDAORA.1
      

  6.   

    偶用的就是Provider=OraOLEDB.Oracle.1
      

  7.   

    to 21bird
    哦,我的意思是我以前用oracle这么组合游标类型和锁定类型,建议楼主业这么试试看看,可能意思没有表达清楚
      

  8.   

    连接串
    Provider=OraOLEDB.Oracle.1;Data Source=服务名(别名);Server=IP地址
    我一直用的这个。没问题
      

  9.   

    谢谢大家,问题已经解决了,本来已经放弃要睡了,躺下后一个想法冒了出来,会不会是表有问题.
    试了一下,果然是表的问题,建表的哥们儿是做java的,把所有表示日期时间的字段都做成了timestamp型.查了10g的资料才知道(居然9i的开发文档里不提,10g才有),timestamp是从9i才开始有的字段类型,如果想让ADO支持,需要把CursorLocation = adUseServer才可以.其实用Date型不就很好,问了建表的哥们儿,居然说以为Date型没法存时间,真想狠K他一顿,害我试了一个晚上!
      

  10.   

    恭喜,接分。oracle的文档一直做得不好。
      

  11.   

    看到这个问题的解决,有点让人无可奈何。也曾经遇到类似的问题。作为C++/VC开发者在项目中经常性的要为与之接口的java模块或者oracle模块来调整自己的代码,大量的问题出现之后,甚至属于上层系统的问题以及数据库的问题,经常都是C++开发者而发现并解决,而有些开发者对于系统之间的问题往往不太愿意去追查和解决,可能这样做不够优雅,对于JVM和中间件系统有着盲目不可亵渎的信任。无奈啊
      

  12.   

    我们这个项目就是要用Ora数据库,到时候有不会的地方各位哥哥姐姐们一定要帮忙啊
    支持!
      

  13.   

    呵呵,你将catch (_com_error &e)改为:catch (_com_error e)试试,我好像也出现过这样的问题
      

  14.   

    楼上的,你那样就登录没写catch差不多了吧
      

  15.   

    char strSql[512];
    sprintf(strSql, "select * from A");
    _RecordsetPtr pRst("ADODB.Recordset");
    pRst->Open(strSql, _variant_t((IDispatch *)m_pConnection,true),
    adOpenStatic, adLockReadOnly, adCmdText);

    用下面这段试下。
    CString strSql= "select * from A";
    _RecordsetPtr pRst("ADODB.Recordset");
    pRst->Open(_variant_t(strSql), _variant_t((IDispatch *)m_pConnection,true),
    adOpenStatic, adLockReadOnly, adCmdText);
    strSql[512]?开这么大后面不都是null字符了。