分享

VC++ ADO连接ACCESS详解

 启蒙彩魂 2011-01-11
VC++ ADO连接ACCESS详解

·幻想~@@~ 发表于 2007-9-2 22:15:00

数据库下载

第一、配置数据源

控制面板 -> 管理工具 ->数据源(ODBC)

 

为什么要设置数据源?

设置数据源的目的是为了我们的程序可以很好的访问数据库资源。

第二、代码及解析:(建议运行一下,这个代码)

 #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;
}

 

·阅读全文(5837) | 回复(9) | 引用通告(0) | 编辑

  Re:VC++ ADO连接ACCESS详解

·访客w06Evi(游客)发表评论于2009-8-21 12:12:28

访客w06Evi(游客)这是ODBC连接吧,ADO是不需要你这样先配置数据源的.

·个人主页 | 引用 | 返回 | 删除 | 回复

  Re:VC++ ADO连接ACCESS详解

·访客0FVh8L(游客)发表评论于2009-5-9 12:41:00

访客0FVh8L(游客)CoInitialize(NULL);
CString sql=_T("select * from Table");
CString strPath=_T("provider =Microsoft.jet.oledb.4.0;data Source=port.mdb");
_ConnectionPtr pCon;
_RecordsetPtr pRes;
try
{
pCon.CreateInstance("ADODB.Connection");
HRESULT hr= pCon->Open((_bstr_t)strPath,"","",adModeUnknown);//运行到这就出错,为什么呢??希望给讲解一下
if (FAILED(hr))
{
MessageBox(_T(" connection error"));
pRes->Close();
pCon->Close();
return;
}
pRes.CreateInstance("ADODB.Recordset");
hr=pRes->Open((_variant_t) sql,pCon.GetInterfacePtr(),adOpenDynamic,adLockOptimistic,adCmdText);
if (FAILED(hr))
{
MessageBox(_T("open recordset error"));
pRes->Close();
pCon->Close();
return;
}
}
catch (_com_error *e)
{
MessageBox(e->ErrorMessage());
pRes->Close();
pCon->Close();
}
pRes->MoveFirst();
while(pRes->adoEOF)
{
_variant_t vDk=pRes->Fields->GetItem("dk")->Value;
vDk.ChangeType(VT_BSTR);
CString strDk=vDk.bstrVal;
int pos=strDk.Find('/');
CString dk=strDk.Left(pos);
CString lx=strDk.Right(pos);
MessageBox(dk);
}

pRes->Close();
pCon->Close();
OnOK();

    本站是提供个人知识管理的网络存储空间,所有内容均由用户发布,不代表本站观点。请注意甄别内容中的联系方式、诱导购买等信息,谨防诈骗。如发现有害或侵权内容,请点击一键举报。
    转藏 分享 献花(0

    0条评论

    发表

    请遵守用户 评论公约

    类似文章 更多