主题:[转帖]C++连接ACCESS数据库
这里介绍一下简单的数据库编程,C++利用ADO连接ACCESS数据库,进行简单的插入、删除、读取、修改操作。利用ADO连接ACEESS和连接MS—SQL大同小异,只是连接驱动等细节不同而已。
下面就介绍数据库编程的基本步骤
第一步:加载ADO类
第二步:初始化ole库
第三步:连接打开数据库
第四步:组装sql语句,并利用智能指针执行SQL语句
下面详细介绍所需代码~~~
1、在stdafx.h中添加
#import "c:\program files\common files\system\ado\msado15.dll" no_namespace rename ("EOF", "adoEOF")
如果加载失败的话,去c:\program files\common files\system\ado查看是否有msado15.dll,对于xp以上系统该文件都是存在的,如果做产品时害怕用户电脑可能没有这个文件,可 以将msado15.dll打包到程序中,这是要保证msado15.dll存在于程序当前目录,同时修改上句代码为
#import "msado15.dll" no_namespace rename ("EOF", "adoEOF")
2、初始化ole库,在InitInstance()函数中增加ole初始化函数,
if(!AfxOleInit())//这就是初始化COM库
{
AfxMessageBox("OLE初始化出错!");
return FALSE;
} //www.sctarena.com
3、在引入ado并初始化成功com库后,就可以使用智能指针了。
_ConnectionPtr m_pConnection; //连接,可以调用execute函数执行sql语句
_RecordsetPtr m_pRecordset;//结果集,可以掉用open函数执行sql语句
_CommandPtr m_pCommand; //命令对象,可以调用execute执行sql语句
//连接数据库
HRESULT hr;
try
{
hr = m_pConnection.CreateInstance("ADODB.Connection");///创建Connection对象
if(SUCCEEDED(hr))
{
//连接数据库,其中set.mdb为数据库的名称,这里省略路径,表示在当前目录,可以写绝对路径或相对路径
hr = m_pConnection->Open("Provider=Microsoft.Jet.OLEDB.4.0;Data Source=set.mdb","","",adModeUnknown);
}
}
catch(_com_error e)///捕捉异常
{
CString errormessage;
errormessage.Format("连接数据库失败!\r\n错误信息:%s",e.ErrorMessage());
AfxMessageBox(errormessage);///显示错误信息
}
4进行数据库操作,数据库操作通过ConnectionPtr,RecordsetPtr、CommandPtr都可以实现。
通过ConnectionPtr:
_variant_t RecordsAffected;
CString sSql = _T("insert into stu values (20,20)");
m_pConnection->Execute((_bstr_t)sSql,&RecordsAffected,adCmdText);
通过commandPtr:
_CommandPtr pCommand;
_RecordsetPtr pRs;
pCommand.CreateInstance(__uuidof(Command));
pCommand->ActiveConnection=m_pConnection;
pCommand->CommandText="select * from stu";
pCommand->CommandType=adCmdText;
pCommand->Parameters->Refresh();
pRs=pCommand->Execute(NULL,NULL,adCmdUnknown);
while(!pRs->adoEOF)
{
_variant_t varValue = pRs->GetCollect("0");//获取第0列的数据
CString strValue=(char*)_bstr_t(varValue);
pRs->MoveNext();
}
通过RecordsetPtr:
m_pRecordset.CreateInstance(__uuidof(Recordset));
CString strSql="select * from middle";
m_pRecordset->Open((_bstr_t)strSql,(IDispatch*)m_pConnection,adOpenDynamic,adLockOptimistic,adCmdText);
while(!m_pRecordset->adoEOF)//遍历所有记录
{
_variant_t TheValue; //VARIANT数据类型
TheValue = m_pRecordset->GetCollect("BIG_NAME");//得到字段BIG_NAME的值
m_pRecordset->MoveNext();//转到下一条纪录
}
m_pRecordset->Close();