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, "警告: 对话框创建失败,应用程序将意外终止。\n");
        TRACE(traceAppMsg, 0, "警告: 如果您在对话框上使用 MFC 控件,则无法 #define _AFX_NO_MFC_CONTROLS_IN_DIALOGS。\n");
    }

    // 删除上面创建的 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

 

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

posted @ 2020-02-22 16:14  htj10  阅读(331)  评论(0编辑  收藏  举报
TOP