VC++/MFC自己封裝好的一個訪問數據庫的類
這個類是我在做一個小實驗時寫的,由於很少使用VC++,所以做出來的類可能不太好,如何有什麼意義或者建議,請留言!謝謝!
#pragma once // // 頭文件聲明--Ado.h // 提供數據庫訪問操作的類的聲明部分 // 開發者: 黃儀標 // 開發日期:2013年4月13日 // // // 必須添加這個,才能引入這些庫函數 #import "E:\Program Files\common files\system\ado\msado15.dll" \ no_namespace rename("EOF","AdoEOF") rename("BOF","AdoBOF") // // 類的聲明 class CAdo { // 私有成員變量 private: // 執行T-SQL語句的命令對象指針 _CommandPtr m_pCmd; // 連接數據庫的連接對象指針 _ConnectionPtr m_pConn; // 數據結果集對象指針 _RecordsetPtr m_pRecordset; // 數據庫連接字符串 CString m_szConnectionString; // 記錄出錯信息 CString m_szErrorMsg; // 公有成員函數 public: // // 默認構造函數 // 初始化數據庫連接字符串 CAdo(void); // // 虛構造函數 // 釋放內存 virtual ~CAdo(void); /****************************************************************************** *函數名: CreateConnection *功能描述: 創建數據庫連接對象 *前置條件: 數據庫連接對象不存在 *後置條件: 創建完成一個數據庫連接對象 *返回值: TRUE--創建數據庫連接對象成功 * FALSE--創建數據庫連接對象失敗 *******************************************************************************/ bool CreateConnection(); /****************************************************************************** *函數名: CreateCommand *功能描述: 創建數據庫命令對象 *前置條件: 數據庫命令對象不存在 *後置條件: 創建完成一個數據庫命令對象 *返回值: TRUE--創建數據庫命令對象成功 * FALSE--創建數據庫命令對象失敗 *******************************************************************************/ bool CreateCommand(); /****************************************************************************** *函數名: CreateRecordset *功能描述: 創建結果集對象 *前置條件: 結果集對象不存在 *後置條件: 創建完成一個結果集對象 *返回值: TRUE--創建結果集對象成功 * FALSE--創建結果集對象失敗 *******************************************************************************/ bool CreateRecordset(); /****************************************************************************** *函數名: OpenConnection *功能描述: 打開數據庫 *前置條件: 數據庫連接對象不為空 *後置條件: 打開數據庫以提供後續操作 *返回值: TRUE--打開數據庫成功 * FALSE--打開數據庫失敗 *******************************************************************************/ bool OpenConnection(); /****************************************************************************** *函數名: CloseConnection *功能描述: 關閉數據庫 *前置條件: 數據庫連接對象不為空 *後置條件: 關閉數據庫以提供後續操作 *返回值: TRUE--關閉數據庫成功 * FALSE--關閉數據庫失敗 *******************************************************************************/ bool CloseConnection(); /****************************************************************************** *函數名: OpenRecordset *功能描述: 打開結果集對象 *前置條件: 數據庫結果集對象不為空 *後置條件: 打開結果集對象以提供後續操作 *參數: T-SQL語句 *返回值: TRUE--打開結果集對象成功 * FALSE--打開結果集對象失敗 *******************************************************************************/ bool OpenRecordset(CString szSQL); /****************************************************************************** *函數名: CloseRecordset *功能描述: 關閉結果集對象 *前置條件: 結果集對象不為空 *後置條件: 關閉結果集對象以提供後續操作 *返回值: TRUE--關閉結果集對象成功 * FALSE--關閉結果集對象失敗 *******************************************************************************/ bool CloseRecordset(); /****************************************************************************** *函數名: IsConnected *功能描述: 判斷數據庫連接是否已經連接 *前置條件: 數據庫連接對象已經存在 *後置條件: 返回連接對象的連接狀態真假值 *返回值: TRUE--數據庫連接對象已經處於連接狀態 * FALSE--數據庫連接對象已經不處於連接狀態 *******************************************************************************/ bool IsConnected(); /****************************************************************************** *函數名: IsRecordsetOpened *功能描述: 判斷數據庫結果集對象是否已經打開 *前置條件: 數據庫結果集對象已經存在 *後置條件: 返回結果集對象的連接狀態真假值 *返回值: TRUE--數據庫結果集對象已經處於連接狀態 * FALSE--數據庫結果集對象已經不處於連接狀態 *******************************************************************************/ bool IsRecordsetOpened(); /****************************************************************************** *函數名: IsEndRecordset *功能描述: 判斷數據庫結果集對象是否已經到達末尾 *前置條件: 數據庫結果集對象已經存在 *後置條件: 返回結果集對象是否到達末尾真假值 *返回值: TRUE--數據庫結果集對象已經到達末尾 * FALSE--數據庫結果集對象還沒有到達末尾 *******************************************************************************/ bool IsEndRecordset(); /****************************************************************************** *函數名: MoveToNext *功能描述: 移到到下一行 *前置條件: 數據庫結果集有數據 *後置條件: 遊標移到下一行 *******************************************************************************/ void MoveToNext(); /****************************************************************************** *函數名: MoveToPrevious *功能描述: 移到到上一行 *前置條件: 數據庫結果集有數據 *後置條件: 遊標移到上一行 *******************************************************************************/ void MoveToPrevious(); /****************************************************************************** *函數名: MoveToFirst *功能描述: 遊標移到首行 *前置條件: 數據庫結果集有數據 *後置條件: 將遊標移到首行 *******************************************************************************/ void MoveToFirst(); /****************************************************************************** *函數名: MoveToLast *功能描述: 遊標移到最後一行 *前置條件: 數據庫結果集有數據 *後置條件: 將遊標移到結果集最後一行 *******************************************************************************/ void MoveToLast(); /****************************************************************************** *函數名: GetRecordCount *功能描述: 判斷數據庫結果集中記錄的條數 *前置條件: 數據庫結果集對象已經存在 *後置條件: 返回結果集記錄的條數 *返回值: long類型--記錄的條數 *******************************************************************************/ long GetRecordCount(); /****************************************************************************** *函數名: ExecuteByConnection *功能描述: 執行增、刪、改操作 *前置條件: 數據庫已經連接上 *後置條件: 返回受影響的行數 *返回值: TRUE--操作成功 * FALSE-操作失敗 *參數: T-SQL語句:szSQL:CString類型 *******************************************************************************/ bool ExecuteByConnection(CString szSQL); /****************************************************************************** *函數名: GetErrorMsg *功能描述: 獲取出錯的信息 *後置條件: 返回出錯信息 *返回值: 出錯的信息--類型:CString *******************************************************************************/ CString GetErrorMsg(); /****************************************************************************** *函數名: GetFieldValue *功能描述: 獲取字段值 *前置條件: 結果集有數據 *後置條件: 返回指定的字段的值 *返回值: TRUE--獲取到字段的值 * FALSE-獲取不到字段的值 *參數: pFieldName : cahr *類型--標識字段名 * strValue: CString類型--標識指定的字段的值 *******************************************************************************/ bool GetFieldValue(char * pFieldName, CString& strValue); /****************************************************************************** *函數名: IsFieldValueHasExisted *功能描述: 判斷指定的字段值是否已在存在 *返回值: TRUE--指定的字段的值已經存在 * FALSE-指定的字段的值不存在 *參數: pFieldName : cahr *類型--標識字段名 * strValue: CString類型--標識指定的字段的值 *******************************************************************************/ bool IsFieldValueHasExisted(char * pFieldName, CString& strValue); };
#include <stdio.h> #include <stdio.h> #include <malloc.h> #include "StdAfx.h" #include "Ado.h" // // Ado.h頭文件的實現部分 // // // 默認構造函數 // 初始化數據庫連接字符串 // 初始化OLE庫 CAdo::CAdo(void) { m_szErrorMsg = ""; // 默認數據庫連接字符串 m_szConnectionString = "Provider=SQLOLEDB.1;Password=tianshi520;Persist Security Info=True;User ID=sa; \ Initial Catalog=DbSencondExperiment;Data Source=標哥-PC\\SQL2005"; // 初始化OLE庫 CoInitialize(NULL); // 創建命令對象 CreateCommand(); // 創建連接對象 CreateConnection(); // 創建結果集對象 CreateRecordset(); } // // 析構函數 // CAdo::~CAdo(void) { // 執行清理內存工作 CloseConnection(); CloseRecordset(); if (m_pCmd) { m_pCmd.Release(); } if (m_pRecordset) { m_pRecordset.Release(); } if (m_pConn) { m_pConn.Release(); } } /****************************************************************************** *函數名: CreateConnection *功能描述: 創建數據庫連接對象 *前置條件: 數據庫連接對象不存在 *後置條件: 創建完成一個數據庫連接對象 *返回值: TRUE--創建數據庫連接對象成功 * FALSE--創建數據庫連接對象失敗 *******************************************************************************/ bool CAdo::CreateConnection() { // 如果創建失敗,則返回FALSE if (FAILED(m_pConn.CreateInstance(__uuidof(Connection)))) { return FALSE; } return TRUE; } /****************************************************************************** *函數名: CreateCommand *功能描述: 創建數據庫命令對象 *前置條件: 數據庫命令對象不存在 *後置條件: 創建完成一個數據庫命令對象 *返回值: TRUE--創建數據庫命令對象成功 * FALSE--創建數據庫命令對象失敗 *******************************************************************************/ bool CAdo::CreateCommand() { if (FAILED(m_pCmd.CreateInstance(__uuidof(Command)))) { return FALSE; } return TRUE; } /****************************************************************************** *函數名: CreateRecordset *功能描述: 創建結果集對象 *前置條件: 結果集對象不存在 *後置條件: 創建完成一個結果集對象 *返回值: TRUE--創建結果集對象成功 * FALSE--創建結果集對象失敗 *******************************************************************************/ bool CAdo::CreateRecordset() { if (FAILED(m_pRecordset.CreateInstance(__uuidof(Recordset)))) { return FALSE; } return TRUE; } /****************************************************************************** *函數名: OpenConnection *功能描述: 打開數據庫 *前置條件: 數據庫連接對象不為空 *後置條件: 打開數據庫以提供後續操作 *返回值: TRUE--打開數據庫成功 * FALSE--打開數據庫失敗 *******************************************************************************/ bool CAdo::OpenConnection() { try { // 關閉當前連接對象 CloseConnection(); // 用FAILED來測試,不能用!來測試 if (FAILED(m_pConn->Open(_bstr_t(m_szConnectionString), "", "", adModeUnknown))) { return FALSE; } if (FAILED(CreateCommand())) { return FALSE; } m_pConn->CursorLocation = adUseClient; m_pCmd->ActiveConnection = m_pConn; return TRUE; } catch (_com_error &e) { m_szErrorMsg = e.ErrorMessage(); return FALSE; } } /****************************************************************************** *函數名: CloseConnection *功能描述: 關閉數據庫 *前置條件: 數據庫連接對象不為空 *後置條件: 關閉數據庫以提供後續操作 *返回值: TRUE--關閉數據庫成功 * FALSE--關閉數據庫失敗 *******************************************************************************/ bool CAdo::CloseConnection() { try { // 關閉結果集 CloseRecordset(); // 關閉連接對象 if (m_pConn != NULL && m_pConn->GetState() != adStateClosed) { m_pConn->Close(); } return true; } catch(_com_error& e) { m_szErrorMsg = e.ErrorMessage(); return false; } } /****************************************************************************** *函數名: CloseRecordset *功能描述: 關閉結果集對象 *前置條件: 結果集對象不為空 *後置條件: 關閉結果集對象以提供後續操作 *返回值: TRUE--關閉結果集對象成功 * FALSE--關閉結果集對象失敗 *******************************************************************************/ bool CAdo::CloseRecordset() { try { if(IsRecordsetOpened()) m_pRecordset->Close(); return true; } catch(_com_error& e) { m_szErrorMsg = e.ErrorMessage(); return false; } } /****************************************************************************** *函數名: IsConnected *功能描述: 判斷數據庫連接是否已經連接 *前置條件: 數據庫連接對象已經存在 *後置條件: 返回連接對象的連接狀態真假值 *返回值: TRUE--數據庫連接對象已經處於連接狀態 * FALSE--數據庫連接對象已經不處於連接狀態 *******************************************************************************/ bool CAdo::IsConnected() { if (m_pConn == NULL) { return FALSE; } if (m_pConn->GetState() == adStateClosed) { return FALSE; } return TRUE; } /****************************************************************************** *函數名: IsRecordsetOpened *功能描述: 判斷數據庫結果集對象是否已經打開 *前置條件: 數據庫結果集對象已經存在 *後置條件: 返回結果集對象的連接狀態真假值 *返回值: TRUE--數據庫結果集對象已經處於連接狀態 * FALSE--數據庫結果集對象已經不處於連接狀態 *******************************************************************************/ bool CAdo::IsRecordsetOpened() { if (m_pRecordset == NULL) { return FALSE; } if (m_pRecordset->GetState() == adStateClosed) { return FALSE; } return TRUE; } /****************************************************************************** *函數名: IsEndRecordset *功能描述: 判斷數據庫結果集對象是否已經到達末尾 *前置條件: 數據庫結果集對象已經存在 *後置條件: 返回結果集對象是否到達末尾真假值 *返回值: TRUE--數據庫結果集對象已經到達末尾 * FALSE--數據庫結果集對象還沒有到達末尾 *******************************************************************************/ bool CAdo::IsEndRecordset() { try { if (m_pRecordset->AdoEOF == VARIANT_TRUE) { return TRUE; } } catch (_com_error &e) { m_szErrorMsg = e.ErrorMessage(); return FALSE; } return FALSE; } /****************************************************************************** *函數名: MoveToNext *功能描述: 移到到下一行 *前置條件: 數據庫結果集有數據 *後置條件: 遊標移到下一行 *******************************************************************************/ void CAdo::MoveToNext() { try { if (!IsEndRecordset()) { m_pRecordset->MoveNext(); } } catch (_com_error &e) { m_szErrorMsg = e.ErrorMessage(); } } /****************************************************************************** *函數名: MoveToPrevious *功能描述: 移到到上一行 *前置條件: 數據庫結果集有數據 *後置條件: 遊標移到上一行 *******************************************************************************/ void CAdo::MoveToPrevious() { try { // 隻有結果集處於打開狀態,且記錄行數至少要有2行 if (IsRecordsetOpened() && GetRecordCount() >= 2) { m_pRecordset->MovePrevious(); } } catch (_com_error &e) { m_szErrorMsg = e.ErrorMessage(); } } /****************************************************************************** *函數名: MoveToFirst *功能描述: 遊標移到首行 *前置條件: 數據庫結果集有數據 *後置條件: 將遊標移到首行 *******************************************************************************/ void CAdo::MoveToFirst() { try { // 隻有結果集處於打開狀態,且記錄行數至少要有一行 if (IsRecordsetOpened() && GetRecordCount() >= 1) { m_pRecordset->MoveFirst(); } } catch (_com_error &e) { m_szErrorMsg = e.ErrorMessage(); } } /****************************************************************************** *函數名: MoveToLast *功能描述: 遊標移到最後一行 *前置條件: 數據庫結果集有數據 *後置條件: 將遊標移到結果集最後一行 *******************************************************************************/ void CAdo::MoveToLast() { try { // 隻有結果集處於打開狀態,且記錄行數至少要有一行 if (IsRecordsetOpened() && GetRecordCount() >= 1) { m_pRecordset->MoveLast(); } } catch (_com_error &e) { m_szErrorMsg = e.ErrorMessage(); } } /****************************************************************************** *函數名: GetRecordCount() *功能描述: 判斷數據庫結果集中記錄的條數 *前置條件: 數據庫結果集對象已經存在 *後置條件: 返回結果集記錄的條數 *返回值: long類型--記錄的條數 *******************************************************************************/ long CAdo::GetRecordCount() { try { if (m_pRecordset == NULL) return 0; // 返回記錄行數 return m_pRecordset->GetRecordCount(); } catch (_com_error &e) { m_szErrorMsg = e.ErrorMessage(); // 記錄出錯信息 } return FALSE; } /****************************************************************************** *函數名: OpenRecordset *功能描述: 打開結果集對象 *前置條件: 數據庫結果集對象不為空 *後置條件: 打開結果集對象以提供後續操作 *參數: T-SQL語句 *返回值: TRUE--打開結果集對象成功 * FALSE--打開結果集對象失敗 *******************************************************************************/ bool CAdo::OpenRecordset(CString szSQL) { try { // 如果關閉時不出現異常 if (OpenConnection() && CloseRecordset()) { m_pRecordset->Open((_variant_t)szSQL, // T-SQL語句 m_pConn.GetInterfacePtr(), // 連接對象接口 adOpenDynamic, // 動態打開 adLockOptimistic, // 鎖定 adCmdText); // 操作類型為命令文本 } return TRUE; } catch (_com_error &e) { m_szErrorMsg = e.ErrorMessage(); // 記錄出錯信息 return FALSE; } } /****************************************************************************** *函數名: ExecuteByConnection *功能描述: 執行增、刪、改操作 *前置條件: 數據庫已經連接上 *後置條件: 返回受影響的行數 *返回值: TRUE--操作成功 * FALSE-操作失敗 *參數: T-SQL語句:szSQL:CString類型 *******************************************************************************/ bool CAdo::ExecuteByConnection(CString szSQL) { try { // 如果打開失敗,則退出 if (!OpenConnection()) { return FALSE; } // 受影響的行數 _variant_t recordAffected; m_pConn->Execute(_bstr_t(szSQL), &recordAffected, adCmdText); } catch (_com_error &e) { m_szErrorMsg = e.ErrorMessage(); return FALSE; } return TRUE; } /****************************************************************************** *函數名: GetErrorMsg *功能描述: 獲取出錯的信息 *後置條件: 返回出錯信息 *返回值: 出錯的信息--類型:CString *******************************************************************************/ CString CAdo::GetErrorMsg() { return m_szErrorMsg; } /****************************************************************************** *函數名: GetFieldValue *功能描述: 獲取字段值 *前置條件: 結果集有數據 *後置條件: 返回指定的字段的值 *返回值: TRUE--獲取到字段的值 * FALSE-獲取不到字段的值 *參數: pFieldName : cahr *類型--標識字段名 * strValue: CString類型--標識指定的字段的值 *******************************************************************************/ bool CAdo::GetFieldValue(char * pFieldName, CString& strValue) { try { if (!IsRecordsetOpened()) return FALSE; // 獲取字段值 _variant_t vtFieldValue = m_pRecordset->Fields->GetItem(pFieldName)->Value; if (vtFieldValue.vt == VT_BSTR) // 如果是字符串類型 { strValue = (char *)(_bstr_t)vtFieldValue; strValue.Trim(); return true; } } catch (_com_error &e) { m_szErrorMsg = e.ErrorMessage(); } return FALSE; } /****************************************************************************** *函數名: IsFieldValueHasExisted *功能描述: 判斷指定的字段值是否已在存在 *返回值: TRUE--指定的字段的值已經存在 * FALSE-指定的字段的值不存在 *參數: pFieldName : cahr *類型--標識字段名 * strValue: CString類型--標識指定的字段的值 *******************************************************************************/ bool CAdo::IsFieldValueHasExisted(char * pFieldName, CString& strValue) { try { CString strTempValue; // 獲取字段值 if (GetFieldValue(pFieldName, strTempValue)) { if (strTempValue.Trim() == strValue) { return TRUE; } } } catch (_com_error &e) { m_szErrorMsg = e.ErrorMessage(); } return FALSE; }
最後更新:2017-04-03 20:51:32