一个简单而又灵活的数据库操作类

基于PDO的PHP数据库操作类 这个类提供了一种方便的方式来执行数据库操作,并且通过PDO的抽象层,我们可以轻松地与不同类型的数据库进行交互。你可以根据自己的需要扩展这个类,添加更多的方法来满足不同的数据库操作需求。PDO(PHP Data Objects)是PHP的一个强大的数据库抽象层,它提供了一种统一的接口来与不同类型的数据库进行交互。总结起来,通过基于PDO的数据库操作类,我们可以简化PHP与数据库的交互过程,提高代码的可读性和可维护性。首先,我们需要创建一个名为Database的类,用于封装与数据库的交互操作。 阅读详情

一个简单而又灵活的数据库操作类

作者: 紫瑗

******************************************************************************************************

本文关于 ADO 简介的文字取自 VB 编程乐园 ,特此声明。

适用范围:数据库

适用对象: C++ ,初级

******************************************************************************************************

一、 ADO 简介

ActiveX Data Objects (ADO) 是微软最新的数据访问技术。它被设计用来同新的数据访问层 OLE DB Provider 一起协同工作,以提供通用数据访问( Universal Data Access )。 OLE DB 是一个低层的数据访问接口,用它可以访问各种数据源,包括传统的关系型数据库,以及电子邮件系统及自定义的商业对象。

ADO 向我们提供了一个熟悉的,高层的对 OLE DB 的 Automation 封装接口。对那些熟悉 RDO 的程序员来说,你可以把 OLE DB 比作是 ODBC 驱动程序。如同 RDO 对象是 ODBC 驱动程序接口一样, ADO 对象是 OLE DB 的接口;如同不同的数据库系统需要它们自己的 ODBC 驱动程序一样,不同的数据源要求它们自己的 OLE DB 提供者( OLE DB provider )。目前,虽然 OLE DB 提供者比较少,但微软正积极推广该技术,并打算用 OLE DB 取代 ODBC 。

二、在哪里能得到 ADO?

目前最新版本的已经可以从微软网站免费下载。到目前为止,微软网站仍是你获取有关 ADO 最新信息的最佳场所。 ADO 是作为 OLE DB SDK 的一部分提供的。你可以从下面这个网址下载:

http://www.microsoft.com/data/oledb/download.htm

三、如何使用 ADO

使用 ADO 有许多种方式,最常用的方法是直接使用 Activate 控件中的 Microsoft ADO Data Control ,这样用起来很方便。但是大家可能觉得它也有不少的缺点,比如说用起来不够方便啦,函数的接口都较晦涩难懂等等,总之,就是感觉到不灵活。

今天我为大家介绍一个类,它实质上是对 ADO 的一个包装,使用起来相当灵活。详细代码在附带的压缩包 ado.zip 内。

这个类的作者是 Carlos Antollini ,当前版本为 2.04 ,支持 ado1.5 ,有两个文件,分别为 ado.h 和 ado.cpp 。我仅作了少量改动。

库简介:

这个库主要由 6 个部分组成,分别是 CADOCommand (命令处理), CADODatabase (数据库主体), CADOException (意外处理), CADOFieldInfo (字段值), CADOParameter (参数), CADORecordset (记录集)。其中最主要的就是 CAdoCommand 类, CAdoDatabase 类和 CAdoRecordset 。

要使用这个库,你可能需要安装以下软件(我没有严格测试,所以实际上的情况可能略有出入):

1 , MDAC2.8

2 , Microsoft Visual Studio 6.0

使用方法和范例

下面我会以一个连接 sql server 数据库的例子做示范,逐步展示如何去使用这个库。

第一步,创建一个对话框工程,为主对话框添加如图所示的几个控件

第二步,加入 ado.h 和 ado.cpp ,并且把 MSADO15.DLL 拷到工程 .dsp 所在的目录

第三步,用 access 创建一个数据库,添加一张 account 表,添加几个记录

第四步,修改代码如下:

// 主对话框的头文件

#include "ado.h"

class CAdoDemoDlg : public CDialog

{

// Construction

public:

CAdoDemoDlg(CWnd* pParent = NULL); // standard constructor

// 省略系统代码

private:

// 取当前的值

void GetCurrentVal(void);

// 设置当前窗口的控件的数据

void SetControlData(CString strAccount, CString strNick, int nArticle, int nFlower, int nKnife);

// 初始化数据库

BOOL InitDatabase(void);

CADORecordset m_pRs; // 数据表

CADODatabase m_pDb; // 数据库

int nRecordIndex_; // 当前记录的索引

};

// 主对话框的实现文件

// AdoDemoDlg.cpp : implementation file

CAdoDemoDlg::CAdoDemoDlg(CWnd* pParent /*=NULL*/)

: CDialog(CAdoDemoDlg::IDD, pParent) // 构造函数

{

//… 省略系统代码

nRecordIndex_ =0;

}

BOOL CAdoDemoDlg::OnInitDialog() // 初始化对话框

{

CDialog::OnInitDialog();

//… 省略系统代码

InitDatabase(); // 初始化数据库

GetCurrentVal(); // 取当前的记录值

return TRUE; // return TRUE unless you set the focus to a control

}

void CAdoDemoDlg::OnDestroy() // 关闭窗口的时候,关闭数据库

{

CDialog::OnDestroy();

if(m_pRs.IsOpen())

{

m_pRs.Close();

}

if(m_pDb.IsOpen())

{

m_pDb.Close();

}

}

BOOL CAdoDemoDlg::InitDatabase()

{ // 初始化数据库

//strConnection, 数据库连接串, ado 支持各种连接串

CString strConnection ="Provider=Microsoft.Jet.OLEDB.4.0;Data Source=E:// Workspace//

AdoDemo//db.mdb;Persist Security Info=False";

if(!m_pDb.Open(strConnection)) // 打开数据库

{

AfxMessageBox(m_pDb.GetLastErrorString());

return FALSE;

}

m_pRs = CADORecordset(&m_pDb); // 初始化记录集

CString strSQL ="";

strSQL.Format("SELECT * from account");

CADOCommand cmd(&m_pDb, _T(""));

cmd.SetText(strSQL);

cmd.SetType(adCmdText);

if(!m_pRs.Execute(&cmd)) // 使用 SQL 语句生成记录源

{

AfxMessageBox(m_pDb.GetLastErrorString());

return FALSE;

}

return TRUE;

}

void CAdoDemoDlg::SetControlData(CString strAccount, CString strNick, int nArticle, int nFlower, int nKnife)

{ // 设置控件上显示的内容

// 账号

m_Account .SetWindowText(strAccount);

// 昵称

m_Nick .SetWindowText(strNick);

CString strNumText;

// 贴子数

strNumText .Format("%d", nArticle);

m_ArticleCount .SetWindowText(strNumText);

// 鲜花

strNumText .Format("%d", nFlower);

m_Flower .SetWindowText(strNumText);

// 飞刀

strNumText .Format("%d", nKnife);

m_Knife .SetWindowText(strNumText);

}

void CAdoDemoDlg::OnPrev()

{ // 上一步按钮的处理

if(!m_pRs.IsOpen()) // 数据库没打开

return ;

if(m_pRs.IsBOF()) // 到顶了

return ;

if(0 == nRecordIndex_)

return ;

nRecordIndex_ --;

m_pRs.MovePrevious();

GetCurrentVal();

}

void CAdoDemoDlg::OnNext()

{ // 下一步按钮的处理函数

if(!m_pRs.IsOpen()) // 数据库没打开

return ;

if(m_pRs.IsEof() ||

m_pRs.IsBof()) // 到底了

return ;

if(((int)m_pRs.GetRecordCount() - 1) == nRecordIndex_)

return ;

nRecordIndex_ ++;

m_pRs.MoveNext();

GetCurrentVal();

}

void CAdoDemoDlg::GetCurrentVal()

{// 取当前记录的数据

if(!m_pRs.IsOpen()) // 数据库没打开

return ;

CString strAccount;

m_pRs .GetFieldValue(" 账号 ", strAccount, "");

CString strNick;

m_pRs .GetFieldValue(" 昵称 ", strNick, "");

CString strArticleCount;

m_pRs .GetFieldValue(" 发贴数量 ", strArticleCount, "");

CString strFlower;

m_pRs .GetFieldValue(" 鲜花数 ", strFlower, "");

CString strKnife;

m_pRs .GetFieldValue(" 飞刀数 ", strKnife, "");

SetControlData(strAccount, strNick, atoi(strArticleCount), atoi(strFlower), atoi(strKnife));

}

程序说明

这个演示程序很简单,只演示了如何查询一个数据库,其实数据库程序确实没什么很特别,主要是使用 sql 语句作操作就可以了。

程序的重点在三个函数:

1 , BOOL InitDatabase(void)

这个函数初始化了数据库

CString strConnection ="Provider=Microsoft.Jet.OLEDB.4.0;Data Source=E:// Workspace//

AdoDemo//db.mdb;Persist Security Info=False";

上面一个语句就生成了一个连接字符串

if(!m_pDb.Open(strConnection))

使用上面产生的语句打开数据库

m_pRs = CADORecordset(&m_pDb);

如果数据库成功打开,则打开这个数据库的表

CString strSQL ="";

strSQL.Format("SELECT * from account");

先生成一个 SQL 语句

CADOCommand cmd(&m_pDb, _T(""));

cmd.SetText(strSQL);

cmd.SetType(adCmdText);

利用 SQL 语句生成操作命令

if(!m_pRs.Execute(&cmd)) // 使用 SQL 语句生成记录源

执行这个操作后,数据表就是有效的了。

2,OnPrev和OnNext是相似的,拿OnPrev来解释就行了

if(!m_pRs.IsOpen()) //数据库没打开

return ;

if(m_pRs.IsBOF()) //到顶了

return ;

上面代码先检查数据库是否有效,已经表指针是否已经到顶了

if(0 == nRecordIndex_)

return ;

nRecordIndex有点特别,其实是一个辅助变量,主要是表头(BOF)和表尾(EOF)跟真实记录间会有一个记

录的间隔,所以使用 nRecordIndex作辅助判断。

nRecordIndex_ --;

向前一个记录, nRecordIndex减1

m_pRs.MovePrevious();

表指针向前移一个记录

GetCurrentVal();

设置当前记录的数据

进阶 关于ado库的原理 :

这个库其实是对于 Microsoft ADO Data Control 一个封装,它的本质还是 Microsoft ADO Data Control 。只是它把这个组件中一些晦涩的功能函数变成一个简单易懂的函数,而且使用起来更灵活。基本上 Microsoft ADO Data Control 能做到的东西,它都能做到, Microsoft ADO Data Control 不方便做的东西,它做起来要更方便一些。以 CADODatabase 类为例,它里面的核心就是: _ConnectionPtr m_pConnection !

 

C#数据库操作类:方法与实践 ADO.NET 中的DataSet是一个非常重要的组件,它代表了一个完整的数据集合,包括多个表(DataTable),关系(),以及约束(Constraint它可以用作数据的内存驻留表示形式,使得从多个数据源如数据库或XML文件中检索到的数据能够进行操作。DataSet可以用来传递数据、存储数据的副本以及在应用程序的不同层次间共享数据。一个典型的应用场景是,DataSet可以用于需要在应用程序和数据源之间断开连接的场景。 阅读详情

相关推荐

一个ADO编程封装类

一个ADO封装类,封装得很好,其中包括CAdoCommand,CAdoConnection, CAdoRecordSet和CAdoParameter三个类,对vc++数据库编程很有

database.c

#include <stdio.h> #include <stdlib.h> #include <sqlite3.h> #include “…/address/address.h” #include <string.h> #include <sys/types.h> #include <sys/socket.h> /* 创建数...

quanSIR123的博客 218

很好用的一个数据库访问类,带各种事务处理

很好用的一个数据库访问类,带各种事务处理,公司内部使用的

bigchaindb源码分析(三)——后端存储

bigchaindb源码分析(一)分析了bigchaindb如何解析命令行参数与配置文件,并据此启动了日志publisher与subscriber。对于bigchaindb start命令,将调用_run_init来初始化后端存储,随之利用pipeline来启动block\vote等进程(bigchaindb源码分析(二))。本节介绍bigchaindb的后端存储。_run_init由run_sta

lwyeluo的专栏 1407

RLC电阻电容电感基础知识——电感篇

电感 等效电路 电感线圈由铜导线绕制,等效电路如图所示。 寄生电阻RS,包括了绕线电阻、引脚串联电阻以及磁芯损耗电阻三部分组成,其中绕线电阻与线径、长度、铜线电阻率有关;引脚电阻与引线长短、粗细有关;磁芯损耗电阻与磁芯材料特性有关,显然磁芯损耗电阻还与工作频率有关.寄生电容C主要是绕线圈与圈之间的杂散电容(为PF级),与绕线工艺有关。 等效导纳 显然: (1)当角频率ω(频率f)较小时,呈电感性. (2)当角频率ω等于ω0时,导纳Y虚部为0,呈现电阻性,即发生共振。令导纳Y虚部为0,即可求出共振角频率ω

azj2019的博客 1万+

Cyclone MAX独立编程实战:从硬件接口到SAP镜像的嵌入式烧录指南

在嵌入式系统开发与量产中,固件烧录是连接软件与硬件的关键环节。其核心原理是通过特定的调试接口(如JTAG、BDM)和编程算法,将编译后的机器码写入目标处理器的非易失性存储器。这项技术的价值在于确保软件在硬件上的可靠部署,是产品功能实现和质量保证的基础,广泛应用于汽车电子、工业控制等对一致性与可靠性要求极高的领域。独立编程器(Stand-Alone Programmer)在此基础上,通过集成存储、交互界面和任务逻辑,实现了脱离PC的自动化操作,极大提升了产线效率和现场维护的便捷性。本文以Cyclone MAX

weixin_34038293的博客 469

数据库(MySQL库表操作)

数据库表操作(E-R图绘制、三大范式)

qq_64227183的博客 2043

Xilinx Vitis HLS教程1--Vitis HLS概述[01/12]

Xilinx Vitis HLS教程[01/10]前言1. Vitis HLS简介1.1 软件工程师的设计原则1.1.1 简介1.1.2 吞吐量和性能1.2.3 架构问题1.2.4 FPGA编程的3大范式1.2.4.1 生产者-消费者范式1.2.4.2 流式数据范式1.2.4.3 流水线范式1.2.5 3种范式结合 前言 项目中使用到Xilinx Zynq UltraScale+ MPSoC ZCU102 开发板,领导指示研究"xilinx软件自带的c语言综合器"。对于一个硬件一窍不通的我来说,甚至不知道

B10030607的博客 5241

调用带参数的存储过程,并返回结果集--oracle

调用插入数据的存储过程: // 调用存储过程来插入一条记录 BOOL CDBTestAppDlg::InsertRecord() { CAdoParameter param1, param2, param3; CAdoCommand comm; if(ConnTODB()) { comm.SetConnection(m_pConnection); para...

weixin_34232744的博客 762

批处理脚本手动双击可以执行,但计划任务中执行失败

问题现象: 使用批处理脚本从linux端(samba server) 备份一些数据,设置计划任务每天凌晨两点定时备份。 1)、windows系统中映射共享文件夹为S:盘,需要输入共享用户名和密码 2)、脚本中使用xcopy命令复制共享目录中的文件到windows本地目录中。 脚本如下: set Name=%date:~0,4%%date:~5,2%%date:~8,2% chcp 65001 REM chcp防止中文乱码 mkdir "E:\脚本备份\bakscripts%Name%" xco

独孤清扬玩DB 4314

Axure RP9汉化+授权全攻略:从下载到激活一步到位(附最新授权码)

本文提供Axure RP9从下载安装到界面汉化的完整指南,帮助设计师和产品经理快速上手这款原型设计工具。详细讲解了如何安全获取软件、执行汉化操作、理解核心界面布局,并介绍了创建交互原型和生成HTML文件的基础步骤,助力用户高效开展设计工作。

cuda7parallel的博客 1148

Spring Boot实现第一次启动时自动初始化数据库

本文以Spring Boot + Mybatis为例,运用MySQL数据库,完结了SSM应用程序第一次发动时主动检测并完结数据库初始化的功用,理论上上述方式适用于一切的联系型数据库,咱们稍作修正即可。

Lxl1418的博客 3398

别再只画GO图了!用R语言+Perl脚本搞定单细胞KEGG富集分析与圈图(附完整代码)

本文详细介绍了如何利用R语言和Perl脚本实现单细胞KEGG富集分析全流程,从基因ID转换到专业圈图可视化。通过对比KEGG与GO分析的互补价值,提供完整的代码实现和优化技巧,帮助研究者高效完成单细胞测序数据的通路分析,并生成高质量的圈图展示结果。

weixin_28694169的博客 406

封装简单的数据库操作类

需要封装数据库操作类,先看看我们需要哪些准备。 1.我们要了解sql语句的结构 2.要知道什么是连贯操作 3.关于占位符的使用,目的是为了让连贯操作打乱顺续不影响sql语句的生成 下面是步骤,先封装需要用到的属性 Class Model { protected $host;//主机名 protected $user;//用户名 protected $...

也无风雨也无情 7746

[ATF]-smc指令详解

1、在ree/tee调用smc之前 2、调用smc之后,cpu触发同步异常,进入ATF的sync_exception_aarch64—>handle_sync_exception—>smc_handler64处理函数 在smc_handler64中又调用了smc_handler func smc_handler64 /* ---------------------------------------------- * Detect if this is a RUN_IMAGE or ot

baron-周贺贺-代码改变世界ctw 1万+

基于逆向工程的中国裁判文书网爬虫技术深度解析:从反爬破解到合规抓取

最近承接了一个法律大数据分析的项目,需要获取某类合同纠纷的裁判文书数据,用于分析不同地区的判决规律、法官的裁判倾向以及法条适用情况。原本以为用常规的Python爬虫就能搞定,结果刚对着中国裁判文书网发了几个请求,就遭遇了“滑铁卢”:要么请求直接返回403 Forbidden,要么触发滑块验证码,甚至连IP都被临时封禁了。普通的requests+BeautifulSoup组合在裁判文书网面前完全失效,这也让我意识到,想要获取这里的数据,必须先通过逆向工程拆解网站的请求逻辑和反爬机制。经过一周的摸索,从抓包分析

专注于Python爬虫开发,分享爬虫技巧、项目实战与反爬经验,使用Scrapy、BeautifulSoup等工具,解决数据抓取难题。 3173

PHP实现的一个简单的数据库操作类(修改版)

PHP实现的一个简单的数据库操作类实现的功能:- 在实例化的时候能设置连接字符集- 在实例化的时候能连接数据库- 在实例化的时候能选择默认数据库- 销毁对象时关闭数据库代码如下:<?php// 数据库操作类MySQLDB class MySQLDB { // 声明属性 private $server; private $port; private $username;

浅笑的人生 1242

win10 跳过U8环境检测的IE WebControls.rar

win10 安装u8的时候 提示IE WebControls 不通过,这个工具可以欺骗u8的检查。 跳过U8环境检测的IE WebControls。提示导入失败后,重新检测通过。

.Net简单工厂模式

 最近这几天,老大让我开发一个网站,当然用的是工厂模式了,呵呵,以前都没有接触过设计模式,所以现在也只有赶紧找些资料看看了! 简单工厂又称静态工厂,具体使用如下:首先定义一个接口,具体名为Idatabase,在这个接口中,定义好数据库操作的方法名和参数,以及返回值,本案例中我定义如下方法:public interface IDatabase { bool Connect(str

郑长风 849

ET2012新版免狗免安装绿色软件

ET2012新版免狗免安祖昂绿色软件。,新界面,新视觉,

LinePhone3.2.7(android端最新版本) sip客户端

SIP客户端For android:LinePhone3.2.7(最新版本),官网地址:http://www.linphone.org/

设计模式的 C++ 实现---抽象工厂模式(二)

前文回顾 单例模式(一) 单例模式(二) 观察者模式 简单工厂模式 工厂方法模式(一) 工厂方法模式(二) 抽象工厂模式(一) 前言 在抽象工厂模式中,需要增加一个产品类时,需要同时增加好几个类,并且系列工厂类和客户端都得修改。 可以使用简单工厂模式对抽象工厂进行改进。 实现举例 场景描述 假设一个简单的数据管理系统:有两个 Student (学生表)和 Grades(分数)两个对象表,一般对于一个对象表需要提供了对数据库操作(增、删、改、查)的类,然而在使用过程中数据库是可能进行更换的,比如 Acces

编程猿来如此 302

C# WinForm 基于DirectShow.dll编写的程序,可边预览边保存视频,音频和图片

基于微软的DirectShow.dll的二次开发1.自动识别连接的摄像头跟麦克风且可以对其进行选择(默认选中第一个)2.可录制wmv和avi两种格式的视频并且都带有音频,avi可以录制的分辨率和帧数进行选择,wmv默认进行了淸晰度优化如不喜欢可去除代码中有相关提示3.可在预览点开之后进行拍照,也可边录制视频边拍照4.添加了视频和音频的压缩功能(酌情使用)这次二次开发发现C#对DirectShow的相关信息太少,这次做完也不敢藏私共享出来,还望大家指正

php设计模式篇-简单工厂

class Mysql{ } class Oracle { } class SqlLite { } $_config['dbType'] = 'mysql'; class Db { public static function getDb() { if ($_config['dbType'] == 'mysql') { retur...

Lars的博客 137

mvc模型的php,正确理解PHP开发MVC模型

PHP开发MVC模型对于初学者来说还是不太了解其中的含义。我们在文章中详细讲述了PHP开发MVC模型的具体方法,希望对大家有所帮助。使用MVC让程序多了很多数据库操作,使得性能下降,这着实让我吃了一惊。MVC只是一种框架,与数据库操作没有任何关系。MVC只是提供一种清晰的编程开发模式,只要你处理的好,是不可能多处很多无谓的数据库操作的。如果一个MVC让一个程序员在不知情的情况下多出了很多数据库操作...

weixin_33584986的博客 184

PHP封装数据库操作类

封装数据库操作类: 因为目前所使用的mysqli扩展实现数据库的操作还比较零散,如果想要高效的使用,就必须要进行二次加工 在面向对象编程中,所有操作都应该是由类来实现完成 封装的完整程度是根据业务的需求来定 步骤 1、确定要封装的业务:基于mysqli的数据库底层实现,完成数据库操作的基本诉求 简化初始化操作 实现错误处理 实现增删改查 2、明确封装的类的作用,确定内部实现机制 ...

仗剑天涯,从摘要开始 733

由一个关于数据库操作类的写法而想到的。。。。

最近项目中数据库操作非常频繁复杂,同事讨论是不是更改一下数据库操作类的写法,原来数据库操作类是每个方法对应一个存储过程,把复杂的逻辑判断都放到数据库中了。但是同事提出异议:存储过程非常不灵活,不能做到各种数据库通用,不利于以后项目的变化;存储过程不能做到更新操作的灵活设置更新字段的选择。在我的思想里虽然觉得他说的有些道理,但是一直不能认同,存储过程执行的高效和管理上的方便相信大家都有...

weixin_30491641的博客 132

mysql中如何进行对象的封装_面向对象基础----封装数据库操作类

思考:现在掌握了很多面向对象相关的内容,但是什么时候封装类?怎么封装?如果使用类成员?引入:其实类的封装没有多么复杂,但是需要一个熟练的过程来确定哪些东西可以放到类里,该用什么样的形式等。我们通过封装一个数据库的操作来综合练习下封装数据库类 掌握定义:封装数据库操作类,即根据数据库的操作需求,来确认数据库操作类该有什么样的功能,以及这些功能该如何实现。1.一个类通常就是一个文件,所以要先确定文件的...

weixin_32973973的博客 723

利用反射+特性实现简单的实体映射数据库操作类

写了一个数据库操作类,达到通过实体自动映射数据库进行查询,添加,删除,修改操作,啥也不说了,直接上代码: 反回一个实体,通过枚举参数确定使用属性/特性进行字段映射(转款做表和主键映射) Code/// <summary> /// 获取单个实体 /// </summary> /// <typeparam nam...

bao500600的博客 184
上一篇: C++设计模式之Adapter
下一篇: 如何有效的使用对话框之二
普通网友
博客等级 码龄22年 1万+粉丝 3156原创
评论 2
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值