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();//关闭记录集并断开数据库连接 };
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; }
使用方法:
在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
*******************