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