采用VC++,ADO访问Oracle 9i数据库,现在数据库已经链接成功,而且可以读出数据库中的内容,奇怪的是,当我向数据库中插入一条记录时,出现了致命错误:请看我写的代码,可错误信息:
                  在此之前,数据库已经打开,并且可以读取其内容:
try
{
             m_pRecordset->AddNew();
    m_pRecordset->PutCollect("NAME", _variant_t(m_RecName));
    m_pRecordset->PutCollect("SEX", _variant_t(m_RecSex));
    m_pRecordset->Update();
    AfxMessageBox("添加成功!");
}
catch(_com_error *e)
{
AfxMessageBox(e->ErrorMessage());
}错误信息:unhandled exception in connectionoracle.exe(KERNEL32.DLL)0xE06D7363:Microsoft C++ EXCEPTION 

解决方案 »

  1.   

    看是不是和表的关键字有关。在打开数据库前,添加如下语句试一下
    pRecordSet->CursorLocation = adUseClient;
      

  2.   

    跟踪一下,看是不是Update时出错,如果是这步出错,检查一下,记录集打开的方式是否是容许更新的
      

  3.   

    关键是程序连m_pRecordset->AddNew();都执行不过啊,错误正是由此条语句引起的,底下的就更不用说了.
      

  4.   

    而且记录集已经打开,并且可以访问。读取数据库的内容也是可以的。就是当执行到m_pRecordset->AddNew();时,就会出错。
    我现在怀疑是不是要更新msado15.dll支持文件。
      

  5.   

    用insert table() values看看。
    换一种方法
      

  6.   

    insert table() values的方法已经试过,出现同样的问题,真的不知道哪里出了问题,你说郁闷吗?
      

  7.   

    1.stdafx.h中加入
    #import "C:\Program Files\Common Files\System\ado\msado15.dll" no_namespace rename("EOF","adoEOF") 
    2。app文件的InitInstance中加入
    if(S_OK!=OleInitialize(NULL))
    {
    AfxMessageBox("初始化COM组件库错误");
    }
    下面就是数据库操作
    _ConnectionPtr pConn;
    _RecordsetPtr  pRs;
    CString strSQL;
    pConn.CreateInstance(__uuidof(Connection));
    pConn->CursorLocation=adUseClient;
    strSQL="Provider=SQLOLEDB;Server=Gooyan;DataBase=SkillsBox;UID=sa;PWD=aaaaaaaa";
    pConn->Open(_bstr_t(strSQL),"","",-1);pRs.CreateInstance(__uuidof(Recordset));
    pRs->CursorLocation=adUseClient;
    pRs->PutActiveConnection(pConn.GetInterfacePtr());pRs1.CreateInstance(__uuidof(Recordset));
    pRs1->CursorLocation=adUseClient;
    pRs1->PutActiveConnection(pConn.GetInterfacePtr());strSQL="select * from catalog order by cataid";
    pRs->Open(_bstr_t(strSQL),vtMissing,adOpenDynamic,adLockBatchOptimistic,adCmdText);
      

  8.   

    Oracle 9i    _ConnectionPtr m_pConn;
        CString m_sConn="Provider=MSDAORA.1;Data Source=sode_192.168.3.9"; //使用
    ms连接库,sode为SID,192.168.3.9为机器ip
        m_pConn.CreateInstance("ADODB.Connection");
        try
        {
            HRESULT hr=m_pConn->Open((_bstr_t)m_sConn,"sodeUser","sodePw",adConnectUnspecified);    
            if (FAILED(hr))
            {
                AfxMessageBox("不能连接数据库 source!");
                return FALSE;
            }
        }
        catch(_com_error e)
        {
            AfxMessageBox("不能打开数据库 error!");
            return FALSE;
        }
    ===>Oracle Connect String微软提供的Oracle标准连接是:strConnect = _T("Provider=MSDAORA;Data Source=serverName;User ID=userName; Password=userPassword;");Oracle公司提供的连接方式:使用标准安全级别:strConnect = _T("Provider=OraOLEDB.Oracle;Data Source=MyOracleDB;User Id=myUsername;Password=myPassword;");使用信任连接1.strConnect = _T("Provider=OraOLEDB.Oracle;Data Source=MyOracleDB;User Id=/;Password=;"); UID为'/'2.strConnect = _T("Provider=OraOLEDB.Oracle;Data Source=MyOracleDB;OSAuthent=1;");使用OSAuthent=1对于连接字符串可以参考以下网页: http://msdn.microsoft.com/library/default.asp?url=/library/en-us/ado270/htm/mdreforacleprovspec.asp?frame=truehttp://download-west.oracle.com/otndoc/oracle9i/901_doc/win.901/a90171/using.htm
      

  9.   

    首先感谢众多兄弟姐妹的大力帮助!但是我的前提是数据库已经连上,并且可以读取数据库的数据,但是当添加记录的时候,程序执行到Addnew()的时候,程序出现上述的错误,所以以上的方法还是不能解决问题.
      

  10.   

    m_pRecordset->AddNew();
    是不是这个m_pRecordset是不是已经关闭了?如果没关闭不应该阿。要不就m_pReocrdset.movefirst,然后addnew或者用connectptr对象,直接execute(insert table)首先你吧insert table拿到查询分析器里面看看好永不
      

  11.   

    通过PL/SQL执行SQL语句是可以将记录插进我的数据库的;而且通过ADO提供的execute(“SQL语句”)的访问方式会出现同样的错误,这一点前面我已经提到过,而且添加记录和打开数据库并读取其内容是在同一个函数中实现的,所以m_pRecordset没有关闭;并且m_pRecordset->MoveFirst()是可以执行的,可是当执行到m_pRecordset->AddNew()就是死活过不去,会出现上述的错误;而且同样的代码用于在Access数据库中插入记录可以成功完成,用于操作Oracle数据库就不行,所以我感觉很奇怪;根据错误类型,我怀疑是不是msado15.dll不支持Oracle 9i的某些功能,不知道我的怀疑是对还是错.实在太奇怪了,我都调试了两天了,一直通不过;假若哪位感兴趣的话,留下您的邮箱,我将自己的代码发给您。帮我看看究竟是怎么回事!大家共同学习!
      

  12.   

    查下oracle方面的资料吧,我没连过oracle。
      

  13.   

    我这两天在学习写中间件的时候,好像也发生过这种问题,我好像是将某个recordset去release(),才出现这样的问题,你去试一下,单不执行!:)祝你好运
      

  14.   

    VC链接Oracle基于无DSN的数据库提供了几种驱动,其中有:
    OLE DB Provider for Oracle (from Microsoft)
    The Microsoft OLE DB Provider for Oracle allows ADO to access Oracle databases.
    strConnect = _T("Provider=MSDAORA;Data Source=MyOracleDB;User Id=myUsername;"
         "Password=myPassword;");OLE DB Provider for Oracle (from Oracle).
    For Standard security:
    strConnect = _T("Provider=OraOLEDB.Oracle;Data Source=MyOracleDB;"
            "User Id=myUsername;Password=myPassword;");
    假若采用OLE DB Provider for Oracle (from Microsoft)这一种链接方式,只能读取,而不能进行添加和删除操作;
    假若采用OLE DB Provider for Oracle (from Oracle)这一种链接方式,即可以读取,也可以进行添加和删除等操作。