我先大概描述下我的情况
我用vc++连接oracle数据库并操作,基于ado的,将连接部分函数写到了单独的类里,具体代码:
_ConnectionPtr CConnectDB::OnConnectDB()
{
::CoInitialize(NULL); // 初始化com库 m_pConn.CreateInstance(__uuidof(Connection)); // 创建对象实例 try 
{
m_pConn->ConnectionString="Provider=OraOLEDB.Oracle;UserID=scott;Password=tiger;Data Source=shenjian";// 连接字符串(oracle9i)
m_pConn->ConnectionTimeout = 10;// 设置连接超时时间
m_pConn->Open("","scott","tiger",adConnectUnspecified);
}
catch(_com_error e)// 捕捉连接异常,未出现异常表示连接成功
{
CString err;
err.Format("连接数据库失败!\r\n错误信息:%s",e.ErrorMessage());
AfxMessageBox(err);
}

return m_pConn; // 返回连接对象
}我写的是一个有页面的通讯录,在修改函数里总是出错,先把修改函数代码贴上:
void CTelboxDlg::OnBtnAlt() 
{
// 声明com指针
_RecordsetPtr m_pRst;
_CommandPtr m_pCom; // 创建对象实例
m_pRst.CreateInstance(__uuidof(Recordset));
m_pCom.CreateInstance(__uuidof(Command)); CConnectDB p;
m_pCom->ActiveConnection = p.OnConnectDB(); // 将连接赋给_CommandPtr对象

m_pCom->CommandText = "select * from list where Tag = '1'";
m_pRst = m_pCom->Execute(NULL,NULL,adCmdUnknown); // 获取当前选中项的ID
int nSelected = -1;
nSelected = m_listctrl.GetNextItem(nSelected,LVNI_SELECTED); if (nSelected == -1) // 没有选择记录
{
AfxMessageBox("Please select a record!");
}
else
{
try
{
m_pRst->Move(nSelected,_variant_t((long)adBookFirst)); // 使记录集指针指向选中项
}
catch (_com_error e)
{
CString err;
err.Format("\r\n错误信息:%s",e.ErrorMessage());
AfxMessageBox(err);
} // 分别读取选中项的每一个子项
                  ....此处省略 UpdateData(false); CString sql; // 组合sql语句
  sql.Format(....);
m_pCom->CommandText = (_bstr_t)sql;
m_pRst = m_pCom->Execute(NULL,NULL,adCmdText);
} // 释放相关对象
m_pRst->Close();
m_pRst.Release();
m_pCom.Release();
}设断点,在m_pRst->Move(nSelected,_variant_t((long)adBookFirst)); // 使记录集指针指向选中项  这一句处报出Unknown error 0X800A0CB3  的错误,不知道怎么回事,网上查了有的说是权限问题,但我的查询、添加、删除函数都没问题,我使用的也是管理员账户进行连接的,我以为是返回的记录集有问题,于是作了如下修改:
      .......      m_pCom->CommandText = "select * from list where Tag = '1'";  //A
      m_pRst = m_pCom->Execute(NULL,NULL,adCmdUnknown);            //B      HRESULT hr = m_pRst->GetRecordCount();      .......
想跟踪看看返回记录集的个数,结果得到hr = -1,也就是说返回的记录集是不确定的(msdn上说的),但上面AB两行在我的查询、删除等函数里操作的没问题的,我始终不知道这地方改怎么解决,非常着急~~~~恳请高手指点指点,小弟万分感谢了啊~!~!

解决方案 »

  1.   

    这个问题,我同样遇到了,也是在这一句出问题。
    m_pRecordset->Move(i-minRow,_variant_t((long)adBookFirst));
    我是想在指定的纪录上,修改数据。
    结果返回值是错误的。原因不明。
      

  2.   

    我的问题已经解决了,再看楼主的问题。建议楼主不要用CommandPtr来打开数据库m_pCom->Execute(NULL,NULL,adCmdUnknown);            
    上面句话问题很大,没有指出打开记录集的一些参数。我是用这句:
    m_pRecordset->Open(_variant_t(bstrQuery),vNull,adOpenStatic,adLockOptimistic,adCmdText);
    就可以了。
    原来我是用
    m_pRecordset->Open(_variant_t(bstrQuery),vNull,adOpenDynamic,adLockOptimistic,adCmdText);
    就是错的。当然具体原因,我还没想明白。
      

  3.   

    我后来把连接部分重写了,写成了单独的函数,每次open后都关闭并释放m_Rst,就好了,据我猜测是记录集的不确定造成的。
      

  4.   

    之前要加一句
    m_pRecordset->CursorLocation = adUseClient;