为了访问数据库方便,我将ADO访问数据库的一些基本操作进行了封装。调用rs->AddNew();插入一条新的记录,然后对字段分别赋值,最后rs->Update();提交。
char*
CAdo::insertDB()
{
char *ret = "error";
try
{
if(!apsRef_rs->Supports(adAddNew))
{
cout << "The Recordset doesn't support the AddNew() method!" << endl;
return ret;
}
rs->AddNew();

rs->PutCollect("Name",   _variant_t( name() ) );
rs->PutCollect("StuNo",  _variant_t( stuno() ) ); rs->Update();
}
// ORACLE Error 
//
catch(_com_error &e)
{
return (char*)(e.ErrorMessage());
}
return ( NULL );
}
int main()
{
   ......// 已经完成了登录数据库等初始化!
/************************* Call the method readDB ****************************/
char *dbMessage;
CAdo myAdo;
dbMessage = myAdo.readDB();// 读取记录正确! if ( dbMessage )
{
cout << dbMessage << " ReadDB ERROR!" << endl;
}
else
{
cout << "Student Name: " << myAdo.name()<< "   Student No.: " << myAdo.stuno() << endl;
}

/************************* Call the method insertDB *************************/
if(!(myAdo.insertDB()))// 插入记录成功!
{
cout << "insertDB OK!" << endl;
}

myAdo.getrs()->MoveFirst(); // 不管有没有这句,下面读取新插入的记录都发生错误!!!
dbMessage = myAdo.readDB(); if ( dbMessage )
{
cout << dbMessage << " ReadDB ERROR!" << endl;
}
else
{
cout << "Student Name: " << myAdo.name()<< "   Student No.: " << myAdo.stuno() << endl;
} return 0;
}
我经过多次测试,问题大概出在:对于新插入的记录,不能成功读取。插入记录后是不是需要刷新等操作,才能对新记录进行操作?
在线等......

解决方案 »

  1.   

     myAdo.getrs()->MoveFirst(); // 不管有没有这句,下面读取新插入的记录都发生错误!!!你这句话的意思,是插入后所有的记录都读取出错,还是只能读已有的,读到新插入的就出错??另外,用如下代码把你的代码包起来
    try 

        //你的代码 

    catch(_com_error &e) 

        AfxMessageBox(e.Description()); 

    看看能否捕获异常??
      

  2.   

    只是读取新插入的记录有错!读取其他记录正确!
    没问题,我的代码都放在了try catch块中了,这里为了说明问题,只把有问题的部分贴了出来!
      

  3.   

    只是读取新插入的记录有错!读取其他记录正确! 
    没问题,我的代码都放在了try catch块中了,这里为了说明问题,只把有问题的部分贴了出来!
      

  4.   

    请问Requery()的参数怎样设置?
      

  5.   

    我的是控制台程序。编译没有问题,运行时跳出一个信息框:Unhandled exception at 0x7c812a5b in ADO.exe: Microsoft C++ exception: _com_error at memory location 0x0012f9cc..
    光标指向了msado15.tli文件的1571行,如下所示:
    inline HRESULT Recordset15::MoveFirst ( ) {
        HRESULT _hr = raw_MoveFirst();
        if (FAILED(_hr)) _com_issue_errorex(_hr, this, __uuidof(this));
        return _hr;// 光标指向这里!
    }
      

  6.   

    是不是你的记录集游标不支持movefirst??如果不添加记录,能movefirst成功吗?
    另外,把你异常信息提示中的e.ErrorMessage改成e.Description再看看