VC++ 中用ado连接数据库

VC6.0中用ado连接数据库出错

1. 在stdafx.h中添加 #import "c:\program files\common files\system\ado\msado15.dll"  no_namespace rename("EOF", "adoEOF") rename("BOF", "adoBOF")
并且要在电脑注册32位的msado15.dll。我的win7下没有注册成功,我后来用的XP(XP系统已经注册了不用自己注册)

 2. 在CxxxApp.cpp的InitInstance()函数中添加数据库连接代码,如下。

AfxEnableControlContainer();
    ::CoInitialize(NULL);AfxOleInit();
    HRESULT hr;
    try
    {
        //添加成员变量 _ConnectionPtr m_pCon; _RecordsetPtr m_pRs;
        hr = m_pCon.CreateInstance("ADODB.Connection");//创建连接。若电脑没注册成功,则连接就会出错,hr=-2147221164
        if(SUCCEEDED(hr))
        {
            m_pCon->CommandTimeout = 3; //连接延迟设置为3秒
            hr = m_pCon->Open("Provider=Microsoft.Jet.OLEDB.4.0;Data Source=restaurant.mdb","","",adModeUnknown);//连接数据库。此处可能出错,因为mdb文件不兼容(Access2013建的mdb要另存为2000..版本,再在XP上使用)。               
        }
        else
        {
            _com_error e(hr);
            AfxMessageBox(e.ErrorMessage());//hr=-2147221164 没有注册类
        }
    }
    catch(_com_error e)
    {
        CString temp;
        temp.Format("连接数据库错误信息:%s,%s",e.ErrorMessage(),e.Description());
        ::MessageBox(NULL,temp,"提示信息",NULL);
        return FALSE;
    }

 -----------------------以下更新于2020/2/29

VS2013 VC++ ADO连接Access数据库(xxx.mdb)

新建MFC应用程序,名为AdoTest。
首先在 在stdafx.h中添加

#import "c:\program files\common files\system\ado\msado15.dll"  
    no_namespace rename("EOF", "adoEOF") rename("BOF", "adoBOF")
#include "AdoTest.h"
extern CAdoTestApp theApp;

在 AdoTest.h中添加成员变量

public:
    _ConnectionPtr m_pCon;
    _RecordsetPtr m_pRs;

在 AdoTest.cpp 中的 InitInstance()中添加,com库的初始化
CoInitialize(NULL);//表示com库的初始化,或者AfxOleInit();
类向导添加函数ExitInstance(),在其中加入代码
CoUninitialize();//释放com库。
然后,InitInstance()中连接数据库

// 在 AfxEnableControlContainer(); 语句后

    ::CoInitialize(NULL);
    HRESULT hr;
    try
    {
        hr = m_pCon.CreateInstance("ADODB.Connection");//创建连接。若电脑没注册成功,则连接就会出错,hr=-2147221164
        if (SUCCEEDED(hr))
        {
            m_pCon->CommandTimeout = 3; //连接延迟设置为3秒
            _bstr_t connStr = "Provider=Microsoft.Jet.OLEDB.4.0;Data Source=Library.mdb"; // Library.mdb文件与exe文件在同一目录,或当前工程目录
            hr = m_pCon->Open(connStr, "", "", adModeUnknown);//连接数据库。此处可能出错,因为mdb文件不兼容(Access2013建的mdb要另存为2000..版本,再在XP上使用)。               
        }
        else
        {
            _com_error e(hr);
            AfxMessageBox(e.ErrorMessage());//hr=-2147221164 没有注册类
        }
    }
    catch (_com_error e)
    {
        CString temp;
        temp.Format(L"连接数据库错误信息:%s,%s", e.ErrorMessage(), (TCHAR*)e.Description());
        ::MessageBox(NULL, temp, L"提示信息", NULL);
        return FALSE;
    }
    m_pRs.CreateInstance("ADODB.Recordset");
View Code

 简单的使用,部分参考MFC中使用ADO的记录集

    theApp.m_pRs->Open("SELECT * FROM tb_User", _variant_t((IDispatch*)theApp.m_pCon, TRUE), adOpenKeyset, adLockPessimistic, adCmdText);
    // 注意:adLockUnspecified 的时候,使用 m_pRs->AddNew(); 会出错。故用 adLockPessimistic / adLockOptimistic
    //theApp.m_pRs->AddNew();
    while (!theApp.m_pRs->adoEOF)
    {
        _variant_t var = theApp.m_pRs->GetCollect((_bstr_t)"name");
        var = theApp.m_pRs->GetCollect((_bstr_t)"pwd");
        theApp.m_pRs->MoveNext();
    }
    theApp.m_pRs->Close();

/////////////////////////////////////////////
/////// 给数据库 User.mdb 添加一条纪录  /////
m_pRs->Open("SELECT * FROM tb_User", _variant_t((IDispatch*)m_pCon,TRUE),adOpenKeyset,adLockPessimistic,adCmdText);
// 注意:adLockUnspecified 的时候,使用 m_pRs->AddNew(); 会出错。故用 adLockPessimistic / adLockOptimistic
m_pRs->AddNew();
//设置字段的值   注意:设置空字符串会出错
m_pRs->PutCollect((_bstr_t)"ID", dlg.m_ID);
m_pRs->PutCollect((_bstr_t)"Name", (_bstr_t)dlg.m_name);
m_pRs->PutCollect((_bstr_t)"Sex", (long)dlg.m_sex);
m_pRs->PutCollect((_bstr_t)"Salary", (_bstr_t)dlg.m_salary);
m_pRs->Update();//更新保存
m_pRs->Close();
/////// 给数据库 User.mdb 修改一条纪录  /////
CString ID = m_list.GetItemText(nSel,0);
CString sql = "SELECT * FROM tb_User WHERE ID = "+ID;
m_pRs->Open((_bstr_t)sql, _variant_t((IDispatch*)m_pCon,TRUE),adOpenKeyset,adLockPessimistic,adCmdText);
if(m_pRs->GetRecordCount() != 1)
    return;
CEditDlg dlg;
/*  dlg.m_ID = atoi(ID);
dlg.m_name = m_list.GetItemText(nSel, 1);
dlg.m_sex = m_list.GetItemText(nSel, 2) == "男" ? 0:1;
dlg.m_salary = m_list.GetItemText(nSel, 3);*/
// 法2:获取纪录的字段的值  注意:设置空字符串会出错
dlg.m_ID = m_pRs->GetFields()->Item["ID"]->Value;
dlg.m_name = (char*)(_bstr_t)m_pRs->GetFields()->Item["Name"]->Value;
dlg.m_sex = (long)m_pRs->GetFields()->Item["Sex"]->Value;
dlg.m_salary = (char*)(_bstr_t)m_pRs->GetFields()->Item["Salary"]->Value;
 
if(IDOK == dlg.DoModal())
{
    m_pRs->PutCollect((_bstr_t)"ID", dlg.m_ID);
    m_pRs->PutCollect((_bstr_t)"Name", (_bstr_t)dlg.m_name);
    m_pRs->PutCollect((_bstr_t)"Sex", (long)dlg.m_sex);
    m_pRs->PutCollect((_bstr_t)"Salary", (_bstr_t)dlg.m_salary);
    m_pRs->Update();
    UpdateList();
}
m_pRs->Close();
//////////////// 删除一条记录 /////////////////
int nSel = m_list.GetSelectionMark();
if(m_list.GetSelectedCount() < 1)
{
    MessageBox("请选择一行纪录再修改!","提示");
    return;
}
if(m_pRs->GetState() == adStateOpen)//系统定义 adStateOpen = 1
{
    m_pRs->Close();
}
CString ID = m_list.GetItemText(nSel,0);
/*
CString sql = "SELECT * FROM tb_User WHERE ID = "+ID;
m_pRs->Open((_bstr_t)sql, _variant_t((IDispatch*)m_pCon,TRUE),adOpenKeyset,adLockPessimistic,adCmdText);
m_pRs->Delete(adAffectCurrent);//删除当前行
m_pRs->Update();
m_pRs->Close();*/
//以下两句可代替上面的代码块,同样可以实现删除
CString sql = "DELETE FROM tb_User WHERE ID = " + ID;
m_pCon->Execute((_bstr_t)sql, NULL, adCmdText);
 
UpdateList();
//////////////////////////
View Code

***************

常记溪亭日暮,沉醉不知归路。兴尽晚回舟,误入藕花深处。争渡,争渡,惊起一滩鸥鹭。

昨夜雨疏风骤,浓睡不消残酒。试问卷帘人,却道海棠依旧。知否?知否?应是绿肥红瘦。
原文地址:https://www.cnblogs.com/htj10/p/10743109.html