回 帖 发 新 帖 刷新版面

主题:[转帖]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();

成都java培训


回复列表 (共1个回复)

沙发

贴广告,没鸡鸡

我来回复

您尚未登录,请登录后再回复。点此登录或注册