可以查询数据的内容,但是不可以修改数据库的内容, 
数据库中有两列,一列字段为:tempname char类型 
              一列字段为: temp  number类型 
可以在控制台可以显示查询的内容,就是不能修改,到修改时就会显示出错,用access连接没有问题.能读,能修改,换成oracle就只能读,不能修改请各位大哥帮帮忙,谢谢!代码如下: 


#include <iostream.h>  
#import "c:\program files\common files\system\ado\msado15.dll" no_namespace rename ("EOF", "adoEOF")  
//ADO连接数据库所需的dll,编译的时候系统会为我们生成msado15.tlh,ado15.tli两个C++头文件来定义ADO库  
//注意这里的import一定要放在一行  


void main(){  
  
    //该程序使用ADO连接ACCESS(装office的时候里面有)数据库 后缀为.mdb 运行平台vc6.0  
//2003平台在写着  
    //---------------------------------------------------------------------------------  
      
//ADO数据库连接分五步走,  
//第一、获取连接(只到数据库在什么地方)  
//第二、打开连接 open(必要的用户名和密码)  
//第三、获取字符集 ResultSet(类似数组的数据存储对象),  
//第四、显示数据  
//第五、关闭数据集、关闭连接  
    
//创建个连接对象  
_ConnectionPtr m_pConnection;  
  
    //对连接进行初始化  
CoInitialize(NULL);  
  
//---------------------------------------------------------------------------------  
    //第一步、获取连接  
//---------------------------------------------------------------------------------  
//同过连接(Connection)创建并获取一个数据库连接实例,  
//也可以把他看成句柄(电影门票)有里他就有资格使用数据库里的资源了 呵呵  
    m_pConnection.CreateInstance(__uuidof(Connection));  
  
    // 又于在数据库连接的时候有有可能会出现错误,比如数据源设置或用户名 密码错误等  
//所以使用try{....}catch(){...}捕获try{}里的异常(错误)  
//并把这些异常放到_com_error e 这个变量里,我们可以同过他获取错误的信息  
//并且,在出错的时候程序一定回运行catch(){....}里的东西,我们看到如果连接错误的时候  
//会执行cout < <"数据库连接失败,确认数据库mydb.mdb是否在当前路径下!" < <endl;  
    //      return FALSE;  之后推出程序 。如果不加try的话可以在程序出错的时候造成死机  
//所以,try也可以看成一种出错的处理(异常处理)  
    try                  
    {  //---------------------------------------------------------------------------------  
        //第二步、打开连接  参数用 ; 分开  
      //---------------------------------------------------------------------------------  
    
  //第一个是Provider=Microsoft.Jet.OLEDB.4.0; access的厂商  
  //Data Source=mydb.mdb","","",adModeUnknown 数据库名称 , 用户名(空) ,密码(空), 缺省连接模式  
  //对于该参数:~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ (1)  
  /*adModeUnknown:缺省。当前的许可权未设置  
          adModeRead:只读  
          adModeWrite:只写  
          adModeReadWrite:可以读写  
          adModeShareDenyRead:阻止其它Connection对象以读权限打开连接  
          adModeShareDenyWrite:阻止其它Connection对象以写权限打开连接  
          adModeShareExclusive:阻止其它Connection对象打开连接  
          adModeShareDenyNone:允许其它程序或对象以任何权限建立连接  
        */  
  //通过这个语句我们的数据库连接真正得到实现了,m_pConnection有了内容了(被附值了)  
  //m_pConnection->Open("Provider=Microsoft.Jet.OLEDB.4.0;Data Source=test.mdb","","",adModeUnknown);  
//m_pConnection->Open("Provider=MSDAORA;Data Source=lims;","nt2","nt2",adModeUnknown);  
//微软提供连接字符串 
char strConn[] = {"Provider=MSDAORA;Data Source=lims;User ID=nt2; Password=nt2;"}; 

m_pConnection->Open((_bstr_t)strConn,"","",adConnectUnspecified); 

    }  

    catch(_com_error e) //捕捉异常  
    {  
        cout < <"数据库连接失败,确认数据库是否在当前路径下!" < <endl;  
        
    }  
  
    //数据集对象  
_RecordsetPtr m_pRecordset;  
    //实例化数据集  
m_pRecordset.CreateInstance(__uuidof(Recordset));  
  
//---------------------------------------------------------------------------------  
//第三步、获取数据集  
//---------------------------------------------------------------------------------  
    //虽然,前面连接上了,但连接的这个数据库里是不是有数据表(test表)还不能确定  
//所以,这里同样要捕获可能出现的错误  
try  
    {      
        m_pRecordset->Open("SELECT * FROM c0de_tank_temp where tempname='TI103A'",  //是数据查询字符串(即所谓的SQL语句)  
                                                                                          //通常这些语句分为 数据的查询(select),插入(insert)  
                                                                                            //更新(update),删除(delect)  
                                                                                          //是否能执行这个命令是由前面(1)确定的  
          
    m_pConnection.GetInterfacePtr(),        // 获取库接库的IDispatch指针  
          
  adOpenDynamic,                          //动态光标。所有数据库的操作都会立即在各用户记录集上反应出来  
          
  adLockOptimistic,                      //乐观锁定方式。只有在你调用Update方法时才锁定记录。在此之  
                                          //前仍然可以做数据的更新、插入、删除等动作  
          
    adCmdText);                            //查询出来的数据是显示在控制台里的  
    }  
    catch(_com_error *e)  
    {  
        cout < <e->ErrorMessage() < <endl;  
    }      
  
    _variant_t var;  
    char *tempname,*temp ; 
    //temp="12"; 
    try//得到表,但表里不一定有数据  
    {  
        if(!m_pRecordset->BOF) //数据表里是是有数据  
            m_pRecordset->MoveFirst(); //将游标(数据集在数据库的叫法)移动到一第一条记录  
        else {  
            cout < <"表内数据为空" < <endl;  
            
        }  
  
  
        //--------------------------------------------------------------------------------------------------------------------------  
        // 第四步、显示数据  
        //---------------------------------------------------------------------------------------------------------------------------    
  
      while(!m_pRecordset->adoEOF) //和前面的rename ("EOF", "adoEOF") 想对应 这里使用的是  
                          //adoEOF代替EOF (当然这里如果前面没有rename也可以使用EOF)  
        //判断游标是不是到达最后一条数据  
        {  
            var = m_pRecordset->GetCollect("tempname"); //这是获取表中字段的一种方法“ID”为表字段名  
            if(var.vt != VT_NULL)                //判断记录在该有没数据  
                tempname= _com_util::ConvertBSTRToString((_bstr_t)var); //由于得到的数据可能不是字符传 这里要转换  
                                                      //将他们转成字符串,从而可以在屏幕上显示  
              
  var = m_pRecordset->GetCollect("temp");  
            if(var.vt != VT_NULL)  
                temp=_com_util::ConvertBSTRToString((_bstr_t)var);  
  
            cout < <tempname < <" is " < <temp < <endl;  //打印该记录  
//m_pRecordset->PutCollect(_variant_t("temp"),"250");///修改其年龄 
//m_pRecordset->GetFields()->GetItem("temp")->Value = (_bstr_t)25; 
        //m_pRecordset->PutCollect( "temp", "2400" ); 
//char *shuz="250"; 
        // m_pRecordset->PutCollect("temp",atol(shuz)); 
m_pRecordset->PutCollect(_variant_t("temp"),_variant_t((long)45));    
          m_pRecordset->Update();///保存到库中 
          
            m_pRecordset->MoveNext();                //游标向走向下条记录  
        }  
    }  
    catch(_com_error *e) //捕获异常  
    {  
        cout < <e->ErrorMessage() < <endl; //如有错误 ,将错误输出  
    }  
    //--------------------------------------------------------------------------------------  
    //关闭数据集  
//-----------------------------------------------------------------------------------  
    m_pRecordset->Close();  
    m_pRecordset = NULL;      
      
//--------------------------------------------------------------------------------------  
    //关闭数据库连接  
    //--------------------------------------------------------------------------------------  
    if(m_pConnection->State)  


    m_pConnection->Close();  
    m_pConnection= NULL; 

  
//这两步是一定要做的,否则时间长内存可能会被用尽  
::Sleep(9000); // sleep between updates 

}