VC 利用 ADO操作mdb数据库体验

作者在 2008-05-15 10:31:57 发布以下内容

参考了孙鑫老师的《VC++从入门到精通》,向孙老师致敬!

ADO的三个核心对象

Connection
对象
   Connection
对象表示了到数据库的连接,它管理应用程序和数据库之间的通信。 RecordsetCommand对象都有一个ActiveConnection属性,该属性用来引用Connection对象。
Command
对象
   Command
对象被用来处理重复执行的查询,或处理需要检查在存储过程调用中的输出或返回参数的值的查询。
Recordset
对象
   Recordset
对象被用来获取数据。 Recordset对象存放查询的结果,这些结果由数据的行(称为记录)和列(称为字段)组成。每一列都存放在RecordsetFields集合中的一个Field对象中。

VC中利用ADO访问数据库

    1.
新建一个基于对话框的工程,名为ADO
    2.
在对话框中放一ListBox和一个Button控件。
    3.
在使用时须导入MSADO15.dll,方法是在StdAfx.h#import "D:\Program Files\Common Files\System\ado\msado15.dll" no_namespace rename("EOF","rsEOF")
    
至少于将EOF改名为rsEOF,是为了避免与文件中的EOF重名。然后编译程序,将产生的debug目录下的两个文件MSADO15.tlhMSADO15.tli加到工程中,其目的只是方便我们查看而已。并不是编译需要它。
    ADO
也是COM组件,须初始化COM库方法是CoInitialize(NULL);使用完后须CoUninitialize();
    
代码如下:

 void CAdoDlg::OnBtnQuery() 
{ 
 int i,j;
 char  mdbPath[256]; //mdb文件路径
 char connstr[512];  //连接字符串
 char connstr2[512]; //连接字符串2

 memset(mdbPath,0,256);
 memset(connstr,0,512);
 memset(connstr2,0,512);
 strcpy(connstr,"driver={Microsoft Access Driver (*.mdb)};dbq=");
 if(!::GetCurrentDirectory(256,mdbPath))
 {
  AfxMessageBox("获取数据库路径失败!");
  return;
 }
 if(mdbPath[strlen(mdbPath)-1]!='\\')
  mdbPath[strlen(mdbPath)]='\\';
 strcat(mdbPath,"data.mdb");
 strcat(connstr,mdbPath);
 for(i=0,j=0;i<strlen(connstr);i++,j++)
 {
  if(connstr[i]!='\\')
   connstr2[j]=connstr[i];
  else
  {
   connstr2[j]='\\';
   connstr2[++j]='\\';
  }
 }

 CoInitialize(NULL);
 _ConnectionPtr pConn(__uuidof(Connection));//产生connection智能指针
 _RecordsetPtr pRst(__uuidof(Recordset)); //产生recordset智能指针

 pConn->Open(connstr2, "","",adModeUnknown); //打开数据库
 pRst->Open("select * from user",_variant_t((IDispatch*)pConn),adOpenStatic,adLockOptimistic,adCmdText);
 while(!pRst->rsEOF)//将查询到的数据加到列表框
 {
  ((CListBox*)GetDlgItem(IDC_LIST1))->AddString(
   (_bstr_t)pRst->GetCollect("name"));
  pRst->MoveNext();
 }
 //插入一条记录
 pRst->AddNew();
 pRst->PutCollect("name",_variant_t("sun"));
 pRst->PutCollect("age",_variant_t((long)21));
 pRst->Update();

 pRst->Close();
 pConn->Close();
 pRst.Release();
 pConn.Release();
 CoUninitialize();
}


本博客于即日起(2009.2.26)停止更新,


新博客地址:http://www.redicecn.cn ,

本博客的大部分文章已经转移到新博客中...


默认分类 | 阅读 4468 次
文章评论,共0条
游客请输入验证码
浏览585025次