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