这个类是我在做一个小实验时写的,由于很少使用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; }