我在vc++ 6下用ado连oracle 9i,我用_ConnectionPtr, _RecordsetPtr, _CommandPtr智能指针连Oracle。能正确显示表里的数据,但添加数据时用_R
ecordsetPtr的指针pRs添加空记录时,pRs->AddNew(); 
程序报错,删除记录时遇到同样的原因。请问是怎么回事?会有权限的原因吗?(数据库用户有管理员权限)
连接oracle代码我不能确定正确,如下:
HRESULT hr;
try
{
hr = m_pConnection.CreateInstance(_uuidof(Connection));
m_pConnection->Mode=adModeReadWrite;
if (SUCCEEDED(hr))
{
m_pConnection->ConnectionString = "Provider=MSDAORA;Data Source=GD;User ID=user; Password=user";
try

hr = m_pConnection->Open(m_pConnection->ConnectionString,"","",-1); 
}
catch(_com_error &e)

MessageBox(e.ErrorMessage()); 
m_pConnection=NULL; 
} }
if (SUCCEEDED(hr))
hr = m_pRecordset.CreateInstance(_uuidof(Recordset));
if (SUCCEEDED(hr))
m_bConnected = TRUE;
else
m_bConnected = FALSE;
}
catch (_com_error &e)
{
MessageBox(e.ErrorMessage());
m_bConnected = FALSE;
}

解决方案 »

  1.   

    忘了说,执行Delete函数时有同样的问题。
      

  2.   

    _bstr_t bstr("Provider=OraOLEDB.Oracle.1;Password=VIRTUOSO;Persist Security Info=True;User ID=VIRTUOSO;Data Source=VIRTUOSO.VIRTUOSO");
    m_pConnection.CreateInstance(_uuidof(Connection));
    m_pConnection->Open(bstr,"","",NULL);
    m_pRecordset.CreateInstance(_uuidof(Recordset));
    m_pRecordset->Open(szSQL,_variant_t((IDispatch *) m_pCnn, true),adOpenStatic,adLockOptimistic,adCmdText)
    在Oracle8i下可以,不知Oracle9i下行不行。
      

  3.   

    我来说说吧,你找一点关于ADO的资料来看看,有一个问题就是关于记录集退化的情况,如果你是再服务器端执行程序,无论用什么方式打开,返回的都是退化到无法更新的静态只读记录集。因为是Smart指针,所以有些书上说是非常有趣的变化。因为这样的情况,所以建议你如果是Oracle,最好用它提供的OO4O来编程,绝对比ADO好用,只是太专了,你要换成其他的数据库就没办法用了。OO4O安装时就默认带了有的,在程序菜单里面可以找到帮助文件
    OO4O:Oracle Objects for OLE
      

  4.   

    上面的Open里的参数可以解释一下吗?谢了。
    Oracle和我写的代码都在同一台计算机上,不知是不是记录集退化。但我用Execute命令修改数据库时,若sql语句中修改两个及以上字段时,报错,改不了。若只修改一个字段时,能写入数据库。但下一条update语句报错,改不了。说是IDispatch error #3092。这是记录集退化的现象吗?
    另外,我用 ->Mode=adModeReadWrite时不报错,若改成 ->Mode=adModeReadWrite|adModeShareDenyNone就编译不了。请问是怎么回时,我都快疯了。
      

  5.   

    我觉得肯定是记录集退化导致的问题,你不妨试试看OO4O,很容易学的,两天时间就搞定了(当然是最基本的操作了)
      

  6.   

    我觉得尽量不要用通过ado对象去做数据库的 insert ,delete 操作,只用 ado对象去执行 inset ,delete的 sql语句就行了。