使用_RecordsetPtr进行查询,正常情况下可以正确运行并取得数据,但如果sql语句写错了(比如写错了表名),Open时,程序立即崩溃。  try 
{
catch(_com_error *e)
{
          }也没起作用,请高手指点。急,谢谢!

解决方案 »

  1.   

    当然不能起作用了,除非你自己写个sql语句检查,不然别想catch到
      

  2.   

    语法可以检查,表名错了一点办法也没有
    那个SQL不归程序处理
    是提交给数据库处理的,程序得到的是数据库返回的数据
      

  3.   

    死哦,如果真的是这样,我的应用就无法用ado来实现了,因为我的这个应用的SQL语句是由以后的使用者来写的,并不能保证是完全正确,如果一个SQL语句错误就是程序崩溃,那也说不过去啊。有没有其他好法子(比如其他数据库连接模式)。小弟一直用java,刚接触vc++ 谢谢!
      

  4.   

    语法可以检查,表名错了一点办法也没有
    那个SQL不归程序处理
    是提交给数据库处理的,程序得到的是数据库返回的数据
      

  5.   

    语句错了,程序也不会崩溃啊?
    你的代码show一下
      

  6.   

    数据库处理不了,应该是返回错误码啊,什么会使程序弄崩呢。在java可以捕获到这个异常,然后做错误处理就是可以了。vc 真是郁闷呢,该不会是用ODBC连接就可以吧?
      

  7.   

    用 catch (_com_error&)
    别用 catch (_com_error*)
    试试
      

  8.   

    在catch块里面,处理出错信息之后要return
      

  9.   

    try
    {
    .....
    }
    catch (_com_error&e)
    {
    .....
    }
    catch(...)
    ....
    {
    }写错表名应该不会崩溃的,可能你程序由于表名错误牵涉其他模块造成的
      

  10.   


    把catch的范围加大,肯定能捕获的
      

  11.   

    问题搞定了,是我有个地方写错了,最终的答案是:sql语句写错,程序不会崩溃,try catch是可以捕获到错误。谢谢大家的讨论。以下是我正确的代码: // 初始化COM,创建ADO连接等操作
    if(!AfxOleInit())//这就是初始化COM库
    {
    CString errormessage;
    errormessage.Format("创建ADO连接等操作失败!");
    AfxMessageBox(errormessage);
    return FALSE;
    } _ConnectionPtr m_pConnection;
    _RecordsetPtr m_pRecordset; try //建立数据库连接 orcloracle11g 
    {
    m_pConnection.CreateInstance(__uuidof(Connection));
    m_pConnection->Open("Provider=OraOLEDB.Oracle.1;Password=fst;Persist Security Info=True;User ID=fst;Data Source=orcloracle11g;","","",adConnectUnspecified);
    }
    catch(_com_error e)
    {
    CString errormessage;
    errormessage.Format("数据库连接失败!\r\n错误信息:%s", e.ErrorMessage());
    AfxMessageBox(errormessage);
    return FALSE;
    }   try
    {
    m_pRecordset.CreateInstance(__uuidof(Recordset));
    _bstr_t sql="select t1.c1,t2.c2 from fst.t1,fst.t2 where t1.c1=t2.c1";
    m_pRecordset->Open(sql,(IDispatch*)m_pConnection,adOpenStatic,adLockBatchOptimistic,adCmdText); if(!m_pRecordset->BOF)//判断表内数据是否为空
    m_pRecordset->MoveFirst();
    else{
    AfxMessageBox("BookType表内数据为空");
    return FALSE;
    }
    while(!m_pRecordset->adoEOF){
    _variant_t c1 = m_pRecordset->GetCollect("c1"); CString item;
    if(c1.vt != VT_NULL)
    {
    item.Format("c1:%s", (LPCSTR)_bstr_t(c1));
    AfxMessageBox(item);
    }
    m_pRecordset->MoveNext();
    }
    }
    catch(_com_error e)
    {
    CString errormessage;
    errormessage.Format("查询错误:%s", e.ErrorMessage());
    AfxMessageBox(errormessage);
    return FALSE;
    }   m_pRecordset->Close();
    m_pConnection->Close();