参考了孙鑫老师的《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
VC 利用 ADO操作mdb数据库体验
[日志分享]
[日志信息]
该日志于 2009-02-26 15:38 由 redice 发表在 redice's Blog ,你除了可以发表评论外,还可以转载 “VC 利用 ADO操作mdb数据库体验” 日志到你的网站或博客,但是请保留源地址及作者信息,谢谢!! (尊重他人劳动,你我共同努力)
呵呵,谢谢
VaTG790i.最好的<a href=http://www.kyfei.com>网站推广软件</a>,
非常好
....................
;ui;普i;uighur;ui;ui;个
在unix网络编程中看到了关于TCP/IP的一些内容,我感觉还是写的不够。正在下载中,一定
下载地址呢