以文本方式查看主題 - 曙海教育集團(tuán)論壇 (http://www.bgl88.cn/bbs/index.asp) -- Oracle數(shù)據(jù)庫 (http://www.bgl88.cn/bbs/list.asp?boardid=65) ---- Oracle 數(shù)據(jù)庫常用方法封裝類 (http://www.bgl88.cn/bbs/dispbbs.asp?boardid=65&id=2497) |
-- 作者:wangxinxin -- 發(fā)布時(shí)間:2010-12-11 10:53:01 -- Oracle 數(shù)據(jù)庫常用方法封裝類 #include <TChar.h> #include <stdio.h> #include <stdlib.h> #pragma warning (disable:4251) #pragma warning (disable:4313) // 配置數(shù)據(jù)源必須頭文件 #include <odbcinst.h> /*---------------------------------------------------------------------------*/ /*-------------------------- OracleDataBaseCtrl.h ---------------------------*/ /*---------------------------------------------------------------------------*/ /* 模塊名稱:OracleDataBaseCtrl.dll 版 本:0.1 Alpha 版 權(quán): 模塊功能:Oracle 數(shù)據(jù)庫操作類 作 者:wlzqi 作者郵箱:mailto:wlzqin@sina.com 建立時(shí)間:2006年7月3日 最后修改:by wlzqi 2006年7月4日 修改歷程: 注意事項(xiàng):1.支持 UNICODE、ANSI 編碼 2.當(dāng)使用 get_collect_value 方法時(shí),如果返回值是 NULL 則會(huì)發(fā)生異常,請(qǐng)注意處理。 備 注: 測試環(huán)境 WinXp + Vc 2003 使用舉例: ★// 定義對(duì)象 COracleDataBaseCtrl m_OracleDataBase; ★// 1.打開數(shù)據(jù)庫 m_OracleDataBase.open_database(數(shù)據(jù)庫MDB文件路徑, 用戶名, 密碼); // 如沒有用戶名和密碼可以不寫 ★// 2.關(guān)閉數(shù)據(jù)庫 m_OracleDataBase.close_database(); ★// 3.打開數(shù)據(jù)庫表 // m_OracleDataBase.open_table(表名); ★// 4.刪除表 m_OracleDataBase.del_table(表名); ★// 5.關(guān)閉數(shù)據(jù)庫表 m_OracleDataBase.close_table(); ★// 6.遍歷數(shù)據(jù)庫表 PTSTR ptTableName; for (bool bfOk = m_OracleDataBase.first_table_name(ptTableName); bfOk; bfOk = m_OracleDataBase.next_table_name(ptTableName)) { if (lstrcmp(ptTableName, _TEXT(\\\\\\"\\\\\\")) == 0) continue; // 得到表名 MessageBox(ptTableName); } ★// 7.添加字段 m_OracleDataBase.add_field(表名, 字段); // 字段形式 _TEXT(\\\\\\"Field1 INTEGER, Field2 INTEGER, ...\\\\\\") ★// 8.刪除字段 m_OracleDataBase.del_field(表名, 字段名); ★// 9.獲取字段數(shù)量 int nFieldCount = m_OracleDataBase.get_field_count(表名); ★// 10.遍歷字段 for (int i = 0; i < nFieldCount; i++) { PCTSTR pctFieldName = m_OracleDataBase.get_field_name(i, 表名); MessageBox(pctFieldName); } ★// 11.獲取字段類型 DataTypeEnum FieldType; m_OracleDataBase.get_field_type(字段號(hào), FieldType); // 字段號(hào):字段的序號(hào)(從 0 開始) ★// 12.執(zhí)行 SQL 語句 m_OracleDataBase.execute_sql(SQL 語句); ★// 13.獲取數(shù)據(jù)庫內(nèi)容 m_OracleDataBase.execute_sql(_TEXT(\\\\\\"SELECT * FROM 表名\\\\\\")); // 查詢所有數(shù)據(jù) m_OracleDataBase.execute_sql(_TEXT(\\\\\\"SELECT COUNT(*) FROM 表名\\\\\\")); // 得到數(shù)據(jù)庫記錄條數(shù) _variant_t vtItemCount = m_OracleDataBase.get_collect_value(long(0)); _bstr_t bsValue = vtItemCount; // 將結(jié)果格式化為字符串 ★// 14.遍歷數(shù)據(jù)庫所有內(nèi)容 TCHAR szSQL[MAX_PATH]; _stprintf(szSQL, _TEXT(\\\\\\"SELECT * FROM %s\\\\\\"), ptTableName); // 格式化 SQL 語句 m_OracleDataBase.execute_sql(szSQL); // 執(zhí)行 SQL 語句 m_OracleDataBase.first(); // 將游標(biāo)移動(dòng)到第一條數(shù)據(jù) _bstr_t bsValue; for (int i = 0; i < vtItemCount.intVal; i++) { // 循環(huán)所用行 if (m_OracleDataBase.Is_BOF() == 1) break; // 如到了表最后則退出循環(huán) for (int j = 0; j < nFieldCount; j++) { // 循環(huán)所有列 variant_t vtValue = m_OracleDataBase.get_collect_value(long(j)); // 格式化得到的每列數(shù)據(jù)為字符串 bsValue = _bstr_t(vtValue.vt == VT_NULL ? _TEXT(\\\\\\"\\\\\\") : vtValue.vt); } bfOk = m_AccessDataBaseCtrl.next(); // 移動(dòng)到下一列 } ★// 15.刪除當(dāng)前行 m_OracleDataBase.del_collect_value(); ★// 16.注冊(cè)數(shù)據(jù)庫 COracleDataBaseCtrl::Configuration_DataBaseSource(DNS, 數(shù)據(jù)庫DB文件路徑, 描述); ★// 17.其它還有一些請(qǐng)參:OracleDataBaseCtrl.h 文件 ★// 18.反注冊(cè) COM CoUninitialize(); */ #pragma once #pragma warning(disable:4146) #import \\\\\\"c:\\\\\\\\Program Files\\\\\\\\Common Files\\\\\\\\System\\\\\\\\ado\\\\\\\\Msado15.dll\\\\\\" \\\\\\\\ no_namespace \\\\\\\\ rename (_TEXT(\\\\\\"EOF\\\\\\"), _TEXT(\\\\\\"adoEOF\\\\\\")) #pragma warning(default:4146 ) #ifdef ORACLEDATABASECTRL_EXPORTS #define ORACLEDATABASECTRL_API __declspec(dllexport) #else #define ORACLEDATABASECTRL_API __declspec(dllimport) #endif // 此類是從 OracleDataBaseCtrl.dll 導(dǎo)出的 class ORACLEDATABASECTRL_API COracleDataBaseCtrl { public: COracleDataBaseCtrl(void); // TODO: 在此添加您的方法。 ~COracleDataBaseCtrl(); //**************************************************************************** private: _ConnectionPtr m_pConnection; _RecordsetPtr m_pRecordset; HRESULT hr; //**************************************************************************** public: // 打開數(shù)據(jù)庫 // 用 SUCCEEDED 或 FAILED 判斷返回值 HRESULT open_database(PCTSTR pctsUser, PCTSTR pctsPass, PCTSTR pctsServer, long Options = adModeUnknown); // 斷開數(shù)據(jù)庫 // 用 SUCCEEDED 或 FAILED 判斷返回值 HRESULT close_database(); //**************************************************************************** // 打開表 // 用 SUCCEEDED 或 FAILED 判斷返回值 HRESULT open_table(PCTSTR pctsTableName, long Options = adCmdText); // 關(guān)閉表 // 用 SUCCEEDED 或 FAILED 判斷返回值 HRESULT close_table(); // 創(chuàng)建表創(chuàng)建表和字段 // 用 SUCCEEDED 或 FAILED 判斷返回值 HRESULT create_table(PCTSTR pctsTableName, PCTSTR pctsField, long Options = adCmdText); // 刪除表 // 用 SUCCEEDED 或 FAILED 判斷返回值 HRESULT del_table(PCTSTR pctsTableName, long Options = adCmdText); // 添加字段 // 用 SUCCEEDED 或 FAILED 判斷返回值 HRESULT add_field(PCTSTR pctsTableName, PCTSTR pctsField, long Options = adCmdText); // 刪除字段 // 用 SUCCEEDED 或 FAILED 判斷返回值 HRESULT del_field(PCTSTR pctsTableName, PCTSTR pctsFieldName, long Options = adCmdText); // 得到表的字段數(shù)量 unsigned long get_field_count(PCTSTR pctsTableName); // 得到表的字段名 PCTSTR get_field_name(unsigned long unFieldIndex, PCTSTR pctsTableName); // 得到字段的類型 // 參數(shù):pFieldType [OUT] 字段類型 // 用 SUCCEEDED 或 FAILED 判斷返回值 HRESULT get_field_type(unsigned long unFieldIndex, DataTypeEnum &FieldType); // 遍歷所有表名(第一個(gè)) // 參數(shù):ptTableName [OUT] 遍歷到的表名 // 注意:if (lstrcmp(ptTableName, _TEXT(\\\\\\"\\\\\\")) != 0 ) 表名才有效 // 返回:false 出錯(cuò)或遍歷完畢 bool first_table_name(PTSTR &ptsTableName); // 遍歷所有表名(下一個(gè)) // 參數(shù):ptTableName [OUT] 遍歷到的表名 // 注意:if (lstrcmp(ptTableName, _TEXT(\\\\\\"\\\\\\")) != 0 ) 表名才有效 // 返回:false 出錯(cuò)或遍歷完畢 bool next_table_name(PTSTR &ptsTableName); //**************************************************************************** // 執(zhí)行 SQL 語句 // 用 SUCCEEDED 或 FAILED 判斷返回值 HRESULT execute_sql(PCTSTR pctsSQL, long Options = adCmdText); // 是否到記錄集末端(0--沒有,1--是 -1--錯(cuò)誤) int Is_BOF(void); // 跳向前一個(gè)記錄 // 用 SUCCEEDED 或 FAILED 判斷返回值 HRESULT prev(void); // 遍歷到第一個(gè)記錄 // 用 SUCCEEDED 或 FAILED 判斷返回值 HRESULT first(void); // 遍歷到下個(gè)記錄 // 用 SUCCEEDED 或 FAILED 判斷返回值 HRESULT next(void); // 遍歷到最后一個(gè)記錄 // 用 SUCCEEDED 或 FAILED 判斷返回值 HRESULT last(void); // 更新(確認(rèn))記錄 // 用 SUCCEEDED 或 FAILED 判斷返回值 HRESULT update(void); // 重新查詢 // 用 SUCCEEDED 或 FAILED 判斷返回值 HRESULT reQuery(long Options = 0); // 記錄集是否為空(0--沒有,1--是 -1--錯(cuò)誤) int Is_Empty(void); // 獲取數(shù)據(jù) _variant_t get_collect_value(PCTSTR pctsCollectName); // 獲取數(shù)據(jù) _variant_t get_collect_value(long lCollectIndex); // 設(shè)置數(shù)據(jù) bool put_collect_value(PCTSTR pctsCollectName, _variant_t vtValue); // 設(shè)置數(shù)據(jù) bool put_collect_value(long lCollectIndex, _variant_t vtValue); // 刪除一行數(shù)據(jù)(當(dāng)前) bool del_collect_value(); //**************************************************************************** // 配置數(shù)據(jù)源 static bool Configuration_DataBaseSource(PCTSTR pctDNS, PCTSTR pctDBPath, PCTSTR pctDescription); }; /*---------------------------------------------------------------------------*/ /*-----------------------End OracleDataBaseCtrl.h ---------------------------*/ /*---------------------------------------------------------------------------*/ /*---------------------------------------------------------------------------*/ /*------------------------ OracleDataBaseCtrl.cpp ---------------------------*/ /*---------------------------------------------------------------------------*/ // OracleDataBaseCtrl.cpp : 定義 DLL 應(yīng)用程序的入口點(diǎn)。 // #include \\\\\\"stdafx.h\\\\\\" #include \\\\\\"OracleDataBaseCtrl.h\\\\\\" //**************************************************************************** // 數(shù)據(jù)庫表名 TCHAR * pszTableName; // 數(shù)據(jù)庫字段名 TCHAR * pszFieldName; //**************************************************************************** COracleDataBaseCtrl::COracleDataBaseCtrl() : m_pConnection(NULL) , m_pRecordset(NULL) , hr(NULL) { // 初始化COM if(FAILED(::CoInitialize(NULL))) return; pszTableName = (TCHAR *)malloc(MAX_PATH); if (pszTableName == NULL) return; pszFieldName = (TCHAR *)malloc(MAX_PATH); if (pszFieldName == NULL) return; } COracleDataBaseCtrl::~COracleDataBaseCtrl() { // 反注冊(cè)COM CoUninitialize(); if (pszTableName != NULL) free(pszTableName); if (pszFieldName != NULL) free(pszFieldName); } |