• sdk环境下数据库访问之ADO


    参考:http://www.roboticfan.com/blog/user_2005/9638/archives/2007/20079222151.shtml

    #i nclude <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一定要放在一行

    int 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=mydb.mdb","","",adModeUnknown);
          
        }
        catch(_com_error e) //捕捉异常
        {
            cout<<"数据库连接失败,确认数据库mydb.mdb是否在当前路径下!"<<endl;
            return FALSE;
        }

        //数据集对象
     _RecordsetPtr m_pRecordset;
        //实例化数据集
     m_pRecordset.CreateInstance(__uuidof(Recordset));

     //---------------------------------------------------------------------------------
     //第三步、获取数据集
     //---------------------------------------------------------------------------------

        //虽然,前面连接上了,但连接的这个数据库里是不是有数据表(test表)还不能确定
     //所以,这里同样要捕获可能出现的错误
     try
        {  
            m_pRecordset->Open("SELECT * FROM test",   //是数据查询字符串(即所谓的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 *ID,*name;
      
        try//得到表,但表里不一定有数据
        {
            if(!m_pRecordset->BOF) //数据表里是是有数据
                m_pRecordset->MoveFirst(); //将游标(数据集在数据库的叫法)移动到一第一条记录
            else {
                cout<<"表内数据为空"<<endl;
                return 1;
            }


             //--------------------------------------------------------------------------------------------------------------------------
            // 第四步、显示数据
            //---------------------------------------------------------------------------------------------------------------------------
     

          while(!m_pRecordset->adoEOF) //和前面的rename ("EOF", "adoEOF") 想对应 这里使用的是
                               //adoEOF代替EOF (当然这里如果前面没有rename也可以使用EOF)
             //判断游标是不是到达最后一条数据
            {
                var = m_pRecordset->GetCollect("ID"); //这是获取表中字段的一种方法“ID”为表字段名
                if(var.vt != VT_NULL)                //判断记录在该有没数据
                    ID= _com_util::ConvertBSTRToString((_bstr_t)var); //由于得到的数据可能不是字符传 这里要转换
                                                           //将他们转成字符串,从而可以在屏幕上显示

               
       var = m_pRecordset->GetCollect("name");
                if(var.vt != VT_NULL)
                    name=_com_util::ConvertBSTRToString((_bstr_t)var);

                cout<<ID<<" is "<<name<<endl;             //打印该记录
          
                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;

     //这两步是一定要做的,否则时间长内存可能会被用尽
        return 0;
    }

  • 相关阅读:
    经典解析23 种设计模式
    如何用手机赚钱——admob
    解决solaris zfs文件系统内存占用过高
    在运行suncluster的数据库服务器上遇到oracle故障的解决办法
    对oracle用户进行资源限制
    Linux下TortoiseGit 配置管理环境搭建
    Linux系统非root帐号执行ssh发生Segmentation fault错误
    Solaris的panic故障分析
    转: Linux下单网卡多vlan多虚拟机
    oracle故障快速定位
  • 原文地址:https://www.cnblogs.com/huking/p/1487806.html
Copyright © 2020-2023  润新知