zoukankan      html  css  js  c++  java
  • 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

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

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

    昨夜雨疏风骤,浓睡不消残酒。试问卷帘人,却道海棠依旧。知否?知否?应是绿肥红瘦。
  • 相关阅读:
    《玩转.NET Micro Framework 移植基于STM32F10x处理器》内容介绍
    《玩转.NET Micro Framework 移植基于STM32F10x处理器》前言
    《玩转.NET Micro Framework 移植基于STM32F10x处理器》内容介绍
    《玩转.NET Micro Framework 移植基于STM32F10x处理器》微软中国.NET Micro Framework项目组工程师所作之序
    《玩转.NET Micro Framework 移植基于STM32F10x处理器》资源汇总
    《玩转.NET Micro Framework 移植基于STM32F10x处理器》微软中国.NET Micro Framework项目组工程师所作之序
    《玩转.NET Micro Framework 移植基于STM32F10x处理器》前言
    Windows、Linux、ARM、Android、iOS全平台支持的RTMP推流组件libEasyRTMP库接口调用说明
    简单高效易用Windows/Linux/ARM/Android/iOS平台实现RTMP推送组件EasyRTMPAndroid MediaCodec硬编码流程介绍
    RTSP网络监控摄像头如何实现Windows、Linux、ARM、Android、iOS全平台支持的拉RTSP流推出RTMP直播流?
  • 原文地址:https://www.cnblogs.com/htj10/p/10743109.html
Copyright © 2011-2022 走看看