• 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

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

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

    昨夜雨疏风骤,浓睡不消残酒。试问卷帘人,却道海棠依旧。知否?知否?应是绿肥红瘦。
  • 相关阅读:
    CSS箭头
    rails 路由正则表达式
    centos6.7 配置MongoDB日志
    centos6.7 配置Elasticsearch
    拼音纠错
    Pandas学习笔记
    WebService using Spring throwed org.xml.sax.SAXException: Bad envelope tag: htm
    怎样让Windows任务管理器CPU占用率呈现正玄曲线(解释+C#实现)
    Deepin Linux获得关注,国产GUI值得提倡
    Swing组件的另类嵌套
  • 原文地址:https://www.cnblogs.com/htj10/p/10743109.html
Copyright © 2020-2023  润新知