Home  >  Article  >  Database  >  配置数据源,VC++ ADO连接ACCESS详解

配置数据源,VC++ ADO连接ACCESS详解

WBOY
WBOYOriginal
2016-06-07 15:36:321088browse

#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一定要放

 #i nclude
#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     //       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         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)
    {
        coutErrorMessage()     }  

    _variant_t var;
    char *ID,*name;
  
    try//得到表,但表里不一定有数据
    {
        if(!m_pRecordset->BOF) //数据表里是是有数据
            m_pRecordset->MoveFirst(); //将游标(数据集在数据库的叫法)移动到一第一条记录
        else {
            cout             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 //打印该记录
      
            m_pRecordset->MoveNext();                 //游标向走向下条记录
        }
    }
    catch(_com_error *e) //捕获异常
    {
        coutErrorMessage()//如有错误 ,将错误输出
    }
    //--------------------------------------------------------------------------------------
    //关闭数据集
 //-----------------------------------------------------------------------------------

    m_pRecordset->Close();
    m_pRecordset = NULL;  
  
 //--------------------------------------------------------------------------------------
    //关闭数据库连接
    //--------------------------------------------------------------------------------------
    if(m_pConnection->State)
    m_pConnection->Close();
    m_pConnection= NULL;

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

Statement:
The content of this article is voluntarily contributed by netizens, and the copyright belongs to the original author. This site does not assume corresponding legal responsibility. If you find any content suspected of plagiarism or infringement, please contact admin@php.cn