当前位置: 主页 > 日志 > C/C++ >

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

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

ADO的三个核心对象

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

在VC中利用ADO访问数据库

    1.新建一个基于对话框的工程,名为ADO。
    2.在对话框中放一ListBox和一个Button控件。
    3.在使用时须导入MSADO15.dll,方法是在StdAfx.h中#import "D:Program FilesCommon FilesSystemadomsado15.dll" no_namespace rename("EOF","rsEOF")
    至少于将EOF改名为rsEOF,是为了避免与文件中的EOF重名。然后编译程序,将产生的debug目录下的两个文件MSADO15.tlh和MSADO15.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();
}


在实际的VC开发数据的项目中,我更常用的是下面的一个ADO类(一个国外牛人开源的)。用起来更加简单,而且安全。
下面是一个例子:

void TestAdo()
{
    CADODatabase* pAdoDb = new CADODatabase();
    CString strConnection = _T("");
    strConnection = _T("Provider=Microsoft.Jet.OLEDB.4.0;Data Source=code.mdb");
    pAdoDb->SetConnectionString(strConnection);
    
    if(pAdoDb->Open())
    {    
        MessageBox(0,"连接数据库成功!",NULL,MB_OK);
        CADORecordset* pAdoRs = new CADORecordset(pAdoDb);
        if(pAdoRs->Open("shellcode", CADORecordset::openTable))
        {
            CString temp,temp2;
            char tempbuf[256]={0};
            pAdoRs->GetFieldValue(1,temp2);
            strncpy(tempbuf,temp2,32);
            temp.Format("%s",tempbuf);
            
            MessageBox(0,temp,NULL,MB_OK);
        }
        delete pAdoRs;
        pAdoDb->Close();
    }
    else
    {
        MessageBox(0,"连接数据库失败!",NULL,MB_OK);
    }
    delete pAdoDb;
}


附上这个ADO类的相关文件(在使用的时候包换ado.h头文件即可),以及测试程序:

ADO_CLASS 

File: Click to Download

ADO_TEST

File: Click to Download

[日志信息]

该日志于 2009-02-26 15:38 由 redice 发表在 redice's Blog ,你除了可以发表评论外,还可以转载 “VC 利用 ADO操作mdb数据库体验” 日志到你的网站或博客,但是请保留源地址及作者信息,谢谢!!    (尊重他人劳动,你我共同努力)
   
验证(必填):   点击我更换验证码

redice's Blog  is powered by DedeCms |  Theme by Monkeii.Lee |  网站地图 |  本服务器由西安鲲之鹏网络信息技术有限公司友情提供

返回顶部