Microsoft ActiveX Data Objects (ADO) 支持用于建立基于客户端/服务器和 Web 的应用程序的主要功能。其主要优点是易于使用、高速度、低内存支出和占用磁盘空间较少。本次封装的CadoInterface类仅针对MFC的使用,目的是优化对ADO的操作,避免频繁写try catch
Microsoft ActiveX Data Objects (ADO) 支持用于建立基于客户端/服务器和 Web 的应用程序的主要功能。其主要优点是易于使用、高速度、低内存支出和占用磁盘空间较少。 本次封装的CadoInterface类仅针对MFC的使用,目的是优化对ADO的操作,避免频繁写try catch(…)以及在连库、开表、写数据、读数据等过程中一些重复性的工作。该类仅对一些常用的操作进行封装,用户可以根据需要进行修改和扩展。
封装类主要包括:基本操作、增值操作、支持算法与支持结构。基本操作、增值操作、支持算法在CDataBase.h与CDataBase.cpp中声明定义。
1.用#import指令引入ADO类型库
为了引入ADO类型库,需要在项目的stdafx.h文件中加入如下语句: #import "C:\Program Files\Common Files\System\ado\msado15.dll" no_namespace rename("EOF", "adoEOF")注意添加的位置在#endif //_AFX_NO_AFXCMN_SUPPORT之后
2.将封装类加到工程中
CDataBase.h代码如下:
class CDataSource { public: //当前记录指针是否到了所有记录之后 BOOL IsEOF(); //当前记录指针是否到了所有记录之前 BOOL IsBOF(); //删除当前记录 void Delete(); //设置FieldName字段的值为Value(int型) void SetAsInteger(CString FieldName, int Value); //设置FieldName字段的值为Value(CString型) void SetAsString(CString FieldName, CString Value); //将记录的修改更新到<strong>数据库</strong>中 void Update(); //新增一条记录 void New(); //得到FieldName字段的值(int型) int GetAsInteger(CString FieldName); //得到FieldName字段的值(CString型) CString GetAsString(CString FieldName); //当前记录指针是否到了最后一条记录 BOOL IsLast(); //当前记录指针是否到了第一条记录 BOOL IsFirst(); //移动当前记录指针到下一条记录 void MoveNext(); //移动当前记录指针到上一条记录 void MovePrev(); //移动当前记录指针到最后一条记录 void MoveLast(); //移动当前记录指针到第一条记录 void MoveFirst(); //初始化数据 void InitData(); CDataSource(); virtual ~CDataSource(); private: int m_MaxID; _RecordsetPtr m_pRecordset; _ConnectionPtr m_pConn; //释放数据 void FreeData(); };3.CDataBase.cpp如下:
<span></span><pre name="code" class="cpp">#include "DataSource.h" CDataSource::CDataSource() { } CDataSource::~CDataSource() { FreeData(); } void CDataSource::InitData() { //初始化Com对象,为使用ADO做准备 CoInitialize(NULL); //初始化<strong>连接</strong>对象 m_pConn.CreateInstance("ADODB.Connection"); //初始化记录集对象 m_pRecordset.CreateInstance("ADODB.Recordset"); try { //打开<strong>数据库</strong><strong>连接</strong> m_pConn->Open("Provider=Microsoft.Jet.OLEDB.4.0;Data Source=..\\Data\\Demo.mdb;Persist Security Info=False", "", "", adConnectUnspecified); //初始化m_MaxID m_pRecordset->Open("Select Max(ID) as MAXID From Profile", _variant_t(m_pConn, true), adOpenStatic, adLockOptimistic, adCmdText); m_MaxID = GetAsInteger("MAXID"); m_pRecordset->Close(); //打开指定记录集 m_pRecordset->Open("Select * From Profile", _variant_t(m_pConn, true), adOpenStatic, adLockOptimistic, adCmdText); } catch(_com_error &e) { ::AfxMessageBox(e.ErrorMessage()); } } void CDataSource::FreeData() { if (m_pConn) { m_pConn->Close(); m_pRecordset.Release(); m_pConn.Release(); CoUninitialize(); } } void CDataSource::MoveFirst() { m_pRecordset->MoveFirst(); } void CDataSource::MoveLast() { m_pRecordset->MoveLast(); } void CDataSource::MovePrev() { m_pRecordset->MovePrevious(); } void CDataSource::MoveNext() { m_pRecordset->MoveNext(); } BOOL CDataSource::IsFirst() { if (m_pRecordset->BOF) { return TRUE; } else { m_pRecordset->MovePrevious(); BOOL Result = m_pRecordset->BOF; m_pRecordset->MoveNext(); return Result; } } BOOL CDataSource::IsLast() { if (m_pRecordset->EndOfFile) { return TRUE; } else { m_pRecordset->MoveNext(); BOOL Result = m_pRecordset->EndOfFile; m_pRecordset->MovePrevious(); return Result; } } CString CDataSource::GetAsString(CString FieldName) { //如果在第一条记录之前或者最后一条记录之后,返回空 if (IsBOF() || IsEOF()) return ""; LPTSTR lpFieldName = FieldName.GetBuffer(FieldName.GetLength()); //得到当前记录指定列的值 _variant_t vValue = m_pRecordset->Fields->Item[lpFieldName]->Value; //如果为空值则返回空 if ((V_VT(&vValue) == VT_NULL) || (V_VT(&vValue) == VT_EMPTY)) { return ""; } //否则以字符串形式返回vValue的值 else { CString strResult; LPTSTR lpResult = strResult.GetBuffer(strlen(_bstr_t(vValue))); strcpy(lpResult, _bstr_t(vValue)); strResult.ReleaseBuffer(); return strResult; } } int CDataSource::GetAsInteger(CString FieldName) { //如果在第一条记录之前或者最后一条记录之后,返回0 if (IsBOF() || IsEOF()) return 0; LPTSTR lpFieldName = FieldName.GetBuffer(FieldName.GetLength()); //得到当前记录指定列的值 _variant_t vValue = m_pRecordset->Fields->Item[lpFieldName]->Value; //如果为空值则返回空 if (V_VT(&vValue) == VT_NULL) { return 0; } //否则以int形式返回vValue的值 else { return atoi(_bstr_t(vValue)); } } void CDataSource::New() { //添加一条新的记录 m_pRecordset->AddNew(); //设置初始值 m_MaxID++; SetAsInteger("ID", m_MaxID); SetAsString("NAME", "无名氏"); SetAsInteger("GENDER", 0); SetAsInteger("AGE", 24); SetAsString("NATIONALITY", "汉"); SetAsString("ADDRESS", ""); SetAsString("POSTCODE", ""); SetAsString("NOTE", ""); //更新 m_pRecordset->Update(); } void CDataSource::Update() { m_pRecordset->Update(); } void CDataSource::SetAsString(CString FieldName, CString Value) { //将列名(FieldName)由CString转为LPTSTR型 LPTSTR lpFieldName = FieldName.GetBuffer(FieldName.GetLength()); //将Value由CString转为LPTSTR型 LPTSTR lpValue = Value.GetBuffer(Value.GetLength()); //将Value值更新到Recordset中 m_pRecordset->Fields->Item[lpFieldName]->Value = lpValue; //释放缓冲区 FieldName.ReleaseBuffer(); Value.ReleaseBuffer(); } void CDataSource::SetAsInteger(CString FieldName, int Value) { CString cs; //将Value由int型转为CString型 cs.Format("%d", Value); //使用SetAsString设置指定列的值 SetAsString(FieldName, cs); } void CDataSource::Delete() { //删除当前记录 m_pRecordset->Delete(adAffectCurrent); } BOOL CDataSource::IsBOF() { return m_pRecordset->BOF; } BOOL CDataSource::IsEOF() { return m_pRecordset->EndOfFile; }
代码链接:点击打开链接
添加操作:new()->m_ds.SetAsString("NAME");->m_ds.Update();
删除操作:m_ds.delete()->m_ds.Update();(删除m_ds指向的记录集)

win11无法连接局域网打印机怎么办?有不少用户的win11系统在使用局域网打印机功能的时候,无法正常连接到共享打印机,出现这个问题,可能是连接步骤或者是某项功能服务没打开。今天小编就给大家带来了多种解决方法,很多小伙伴不知道怎么详细操作,小编下面整理了win11电脑不能连共享打印机解决技巧,如果你感兴趣的话,跟着小编一起往下看看吧!win11电脑不能连共享打印机解决技巧1、首先,按键盘上的Win+X组合键,或右键点击任务栏上的Windows开始图标,在打开的隐藏菜单项中,选择运行;2、运行窗口

MariaDB是一种开源的关系型数据库管理系统,它是MySQL的一个分支。PHP作为一种开源的服务器端脚本语言,被广泛应用于Web开发中。在很多Web开发项目中,需要使用PHP连接到MariaDB数据库,以便在Web应用程序中存储和检索数据。这篇文章将介绍如何使用PHP编写代码来连接MariaDB数据库。一、安装MariaDB服务器在使用PHP连接Maria

随着现代程序开发的不断发展,软件项目往往需要同时使用多个任务库来处理不同的任务。PHP语言一直是Web开发的重要工具,其在7.0版本中引入了新的并发处理特性,使得PHP在处理任务库时更加高效、灵活。在8.0版本中,PHP又新增了对连接多个任务库的支持,这为我们在处理大量数据和并发请求时提供了极大的便利。在本文中,我们将探讨PHP8.0中连接多个任务库的方法和

MySQL连接错误1203,如何解决?MySQL是一种广泛使用的关系型数据库管理系统,但是在使用MySQL时,一些连接错误可能会出现。其中一个常见的错误是错误代码1203,它表示数据库连接已中断。在遇到这个错误时,可以采取一些措施来解决问题。首先,我们需要确定错误1203的确切原因。这个错误通常是由于连接超时或连接过多引起的。连接超时可能是由于数据库服务器负

Python连接阿里云接口,实现邮件发送功能阿里云提供了一系列的服务接口,其中包括了邮件发送服务。通过Python脚本连接阿里云接口,我们可以实现邮件的快速发送。本篇文章将向您展示如何使用Python脚本连接阿里云接口,并实现邮件发送功能。首先,我们需要在阿里云上申请邮件发送服务,获取相应的接口信息。在阿里云管理控制台中,选择邮件推送服务,然后创建一个新的邮

如何在Java程序中优化MySQL连接的写入性能和并发性能?在开发Java程序时,我们经常需要使用到数据库,而MySQL作为一种常见的数据库管理系统,其连接的写入性能和并发性能是我们需要关注的重点。本文将介绍如何在Java程序中优化MySQL连接的写入性能和并发性能,以提升程序的效率。使用连接池管理连接:连接池可以管理数据库连接的创建、销毁和复用,避免频繁地

Java连接数据库的SQLException异常常见原因是什么?在Java开发中,Database操作是非常关键的一环。其中,对于常用的CRUD操作,特别是SELECT和INSERT操作,都需要使用到JDBC来实现。但是,在JDBC应用开发中,与数据库的连接操作、SQL语言的执行过程、以及结果集的处理等阶段,可能会发生SQLException异常。本文将分析

MySQL连接错误1062,如何解决?MySQL是一种常用的关系型数据库管理系统,广泛应用于各种软件开发和数据存储场景中。在使用MySQL的过程中,我们有时会遇到各种错误,其中一个常见的错误是连接错误1062。本文将介绍这个错误的原因以及解决方法。首先,我们需要了解连接错误1062的含义。连接错误1062通常意味着在执行插入操作时,违反了表的唯一约束条件。在


핫 AI 도구

Undresser.AI Undress
사실적인 누드 사진을 만들기 위한 AI 기반 앱

AI Clothes Remover
사진에서 옷을 제거하는 온라인 AI 도구입니다.

Undress AI Tool
무료로 이미지를 벗다

Clothoff.io
AI 옷 제거제

AI Hentai Generator
AI Hentai를 무료로 생성하십시오.

인기 기사

뜨거운 도구

SublimeText3 중국어 버전
중국어 버전, 사용하기 매우 쉽습니다.

WebStorm Mac 버전
유용한 JavaScript 개발 도구

스튜디오 13.0.1 보내기
강력한 PHP 통합 개발 환경

SublimeText3 Linux 새 버전
SublimeText3 Linux 최신 버전

안전한 시험 브라우저
안전한 시험 브라우저는 온라인 시험을 안전하게 치르기 위한 보안 브라우저 환경입니다. 이 소프트웨어는 모든 컴퓨터를 안전한 워크스테이션으로 바꿔줍니다. 이는 모든 유틸리티에 대한 액세스를 제어하고 학생들이 승인되지 않은 리소스를 사용하는 것을 방지합니다.
