zoukankan      html  css  js  c++  java
  • VC++ ADO连接Oracle数据库

    AdoConn类:

    头文件

    #pragma once
    //导入ADO动态链接库
    #import "c:\program files\common files\system\ado\msado15.dll"  no_namespace rename("EOF", "adoEOF") rename("BOF", "adoBOF")
    
    class AdoConn
    {
    public:
        _ConnectionPtr m_pConn;//连接对象指针
        _RecordsetPtr m_pRs;//记录集对象指针
    public:
        AdoConn();
        ~AdoConn();
        BOOL InitConnect();
        BOOL ExecuteSql(_bstr_t bstrSql);//执行sql语句
        _RecordsetPtr& GetRecordSet(_bstr_t bstrSql);//执行sql查询语句,并返回记录集指针
        void ExitConnect();//关闭记录集并断开数据库连接
    };
    View Code

    cpp文件

    #include "stdafx.h"
    #include "AdoConn.h"
    
    
    AdoConn::AdoConn()
    {
    }
    
    
    AdoConn::~AdoConn()
    {
        //ExitConnect();
    }
    
    BOOL AdoConn::InitConnect()
    {
        try
        {
            // 初始化COM,创建ADO连接等操作 
            //AfxOleInit();//因为只能初始化一次,故应该放在InitInstance()中用 ::CoInitialize(NULL); 和 ::CoUninitialize();
            m_pConn.CreateInstance("ADODB.Connection");
            _bstr_t strConnect = "Provider=OraOLEDB.Oracle.1;
                    User ID=ljq;Password=123;
                    Data Source=(DESCRIPTION=(ADDRESS=(PROTOCOL=TCP)(HOST=192.168.81.132)(PORT=1521))(CONNECT_DATA=(SERVICE_NAME = orcl)));
                    Persist Security Info=False";
            m_pConn->Open(strConnect, "", "", adModeUnknown);
        }
        catch (_com_error& e)
        {
            AfxMessageBox((TCHAR*)e.Description());
            return FALSE;
        }
        return TRUE;
    }
    
    void AdoConn::ExitConnect()
    {
        if (m_pRs != NULL)
        {
            m_pRs->Close();
            m_pRs = NULL;
        }
        if (m_pConn != NULL)
        {
            m_pConn->Close();
            m_pConn = NULL;
        }
    }
    
    BOOL AdoConn::ExecuteSql(_bstr_t bstrSql)
    {
        try
        {
            if (m_pConn == NULL)
                InitConnect();
            m_pConn->Execute(bstrSql, NULL, adCmdText);
            return TRUE;
        }
        catch (_com_error& e)
        {
            _bstr_t s = e.Description();
            AfxMessageBox((TCHAR*)s);
            return FALSE;
        }
    }
    
    _RecordsetPtr& AdoConn::GetRecordSet(_bstr_t bstrSql)
    {
        try
        {
            if (m_pConn == NULL)
                InitConnect();
            m_pRs.CreateInstance(__uuidof(Recordset));
            m_pRs->Open(bstrSql, m_pConn.GetInterfacePtr(), adOpenDynamic, adLockOptimistic, adCmdText);
        }
        catch (_com_error& e)
        {
            e.Description();
            //return NULL;
        }
        return m_pRs;
    }
    View Code

    使用方法:

    在MFC的App类中InitInstance函数中添加

    BOOL CSupermarketApp::InitInstance()
    {
        // 如果一个运行在 Windows XP 上的应用程序清单指定要
        // 使用 ComCtl32.dll 版本 6 或更高版本来启用可视化方式,
        //则需要 InitCommonControlsEx()。  否则,将无法创建窗口。
        INITCOMMONCONTROLSEX InitCtrls;
        InitCtrls.dwSize = sizeof(InitCtrls);
        // 将它设置为包括所有要在应用程序中使用的
        // 公共控件类。
        InitCtrls.dwICC = ICC_WIN95_CLASSES;
        InitCommonControlsEx(&InitCtrls);
    
        CWinApp::InitInstance();
    
    
        AfxEnableControlContainer();
        ::CoInitialize(NULL);//这添加!!!
    
         .......省略
    
        CSupermarketDlg dlg;
        m_pMainWnd = &dlg;
        INT_PTR nResponse = dlg.DoModal();
        if (nResponse == IDOK)
        {
            // TODO:  在此放置处理何时用
            //  “确定”来关闭对话框的代码
        }
        else if (nResponse == IDCANCEL)
        {
            // TODO:  在此放置处理何时用
            //  “取消”来关闭对话框的代码
        }
        else if (nResponse == -1)
        {
            TRACE(traceAppMsg, 0, "警告: 对话框创建失败,应用程序将意外终止。
    ");
            TRACE(traceAppMsg, 0, "警告: 如果您在对话框上使用 MFC 控件,则无法 #define _AFX_NO_MFC_CONTROLS_IN_DIALOGS。
    ");
        }
    
        // 删除上面创建的 shell 管理器。
        if (pShellManager != NULL)
        {
            delete pShellManager;
        }
    
        ::CoUninitialize();//这添加!!!
    
        // 由于对话框已关闭,所以将返回 FALSE 以便退出应用程序,
        //  而不是启动应用程序的消息泵。
        return FALSE;
    }

    在需要访问数据库的时候:

        CString sql;
        sql.Format(_T("UPDATE tb_shangpin SET spmc='%s' WHERE spbh='%s'"),
            m_strCommodityName, m_strCommodityNumber);
        AdoConn conn;
        conn.InitConnect();
        conn.ExecuteSql((_bstr_t)sql);
        conn.ExitConnect();
    
    -----------------------------------
        AdoConn conn;
        if(!conn.InitConnect())
            return;
        _bstr_t sql = "select * from tb_SHANGPIN";
        _RecordsetPtr pRs = conn.GetRecordSet((_bstr_t)strSql);//或者 conn.m_pRs = conn.GetRecordSet((_bstr_t)strSql);下面的 pRs 都换为 conn.m_pRs
        int i = 0;
        while (!pRs->adoEOF)
        {
            m_list.InsertItem(i, NULL);
            m_list.SetItemText(i, 0, (TCHAR*)(_bstr_t)pRs->GetCollect("SPBH"));
            m_list.SetItemText(i, 1, (TCHAR*)(_bstr_t)pRs->GetCollect("SPMC"));
            m_list.SetItemText(i, 2, (TCHAR*)(_bstr_t)pRs->GetCollect("SPJM"));
            m_list.SetItemText(i, 3, (TCHAR*)(_bstr_t)pRs->GetCollect("SPLB"));
            m_list.SetItemText(i, 4, (TCHAR*)(_bstr_t)pRs->GetCollect("SPDW"));
            m_list.SetItemText(i, 5, (TCHAR*)(_bstr_t)pRs->GetCollect("TXM"));
            double temp = (double)pRs->GetCollect("JHJG");
            CString str; str.Format(_T("%.2f"), temp);
            m_list.SetItemText(i, 6, str);
            temp = pRs->GetCollect("XSJG");
            str.Format(_T("%.2f"), temp);
            m_list.SetItemText(i, 7, str);
            pRs->MoveNext();
            ++i;
        }
        conn.ExitConnect();

      Tips:因为本地客户端使用的是64bit版本的Oracle,所以如果编译的时候选择win32,就会抛出异常。说是检查安装。所以要选择使用生成x64版本!!这一点要特别注意!!!
    ————————————————
    原文链接:https://blog.csdn.net/Robin__Chou/article/details/42885909

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

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

    昨夜雨疏风骤,浓睡不消残酒。试问卷帘人,却道海棠依旧。知否?知否?应是绿肥红瘦。
  • 相关阅读:
    type和object详解
    元类+单例
    单表查询和多表查询
    外键
    存储引擎,MySQL中的数据类型及约束
    壹拾壹




  • 原文地址:https://www.cnblogs.com/htj10/p/12345817.html
Copyright © 2011-2022 走看看