Visual C++中的ADO数据库编程
VC中使用ADO的方法

VC中使⽤ADO的⽅法ADO中打开⼀个连接:pConnection->ConnectionString = "这⾥的字符串有下⾯四种写法"; //对连接字符串赋值pConnection->Open(ConnectionString,"","",adModeUnknown); //连接数据库第⼆三个参数分别为⽤户的ID与密码,因为在连接字符串ConnectionCstring中已经设置好了,这⾥可以为空。
第四个参数可以取下⾯两个参数:adAsyncConnect,异步打开数据库,在ASP中直接⽤16。
adConnectUnspecified,同步打开数据库,在ASP中直接⽤-1。
ConnectionString根据不同的数据源,分别对应不同的写法(要记下来很困难,可以在VB中利⽤ADO控件先连接好,再将其拷贝在VC中,这样不容易出错) 1)访问Access 2000 "Provider=Microsoft.Jet.OLEDB.4.0;Data Source=databaseName;User ID=userName;Password=userPassWord" 2)访问ODBC数据 "Provider=MADASQL;DSN=dsnName;UID=userName;PWD=userPassword;" 3)访问Oracle数据库 “Provider=MSDAORA;Data Sourse=serverName;User ID=userName;Password=userPassword;" 4)访问MS SQL数据库 "Provider=SQLOLEDB,Data Source=serverName;Initial Catalog=databaseName;User ID=userName;Password=userPassword;" 使⽤ADO开发应⽤程序有两种⽅法,⼀种是直接在应⽤程序中使⽤ADO数据控件,该⽅法最简单,⽆需编写⼀⾏代码即可实现对数据库的访问,另⼀种⽅法是直接使⽤ADO对象实现对数据库的操作,该⽅法较复杂,但可以让程序员更深⼊的控制数据库。
VC数据库编程之ADO和ODBC比较

如果对数据库的底层访问很看重,则用ODBC,如果只是需要一个数据库的接口,而具体细节不是很重要的话,则用ADO。
大多数情况下,使用ADO。
ODBC:直接使用ODBC API编写应用程序需要编制大量代码,Visual C++提供了MFC ODBC类,其中封装了ODBC API,因此,使用MFC来创建ODBC的应用程序非常简便。
主要的MFC ODBC 类如下所示。
CDatabase类:一个CDatabase对象表示一个到数据源的连接,通过它可以操作数据源。
应用程序可使用多个CDatabase对象,构造一个对象并调用OpenEx()成员函数打开一个连接。
接着构造CRecordSet对象以操作连接的数据源,并向CDatabase对象传递记录集构造程序指针。
完成后用Close()成员函数销毁CDatabase对象。
一般情况下并不需要直接使用CDatabase对象,因为CRecordSet对象可以实现大多数的功能。
但是在进行事务处理时,CDatabase就起到关键作用。
事务(Transaction)指的是将一系列对数据源的更新放在一起,同时提交或一个也不提交,为的是确保多用户对数据源同时操作时的数据正确性。
CRecordSet类:一个CRecordSet对象代表一个从数据源选择的一组记录的集合——记录集。
记录集有两种形式,snapshot和dynaset,前者表示数据的静态试图,后者表示记录集和其他用户对数据库的更新保持同步。
通过CRecordSet对象,用户可以对数据库中的记录进行各种操作。
CRecordView类:CRecordView对象是在空间中显示数据库记录的视图。
这种视图是一种直接连到CRecordSet对象的格式视图,它从一个对话框模板资源创建,并将CRecordSet 对象的字段显示在对话框模板的控件中。
对象利用DDX和RFX机制,使格式上的控件和记录集的字段之间数据移动自动化,也就是说,用户不用编写一行代码就可以实现简单的数据库记录查看操作。
在VC中使用ADO开发数据库应用程序

_RecordsetPtr接口的使用方法和CDaoDatabase类似, 通过以下代码的比较,你会发现使用_RecordsetPtr接口非常 简单(以下代码使用上面已经创建的数据连接):
代码7:使用CDaoDatabase执行SQL语句 CDaoRecordset MySet = new CDaoRecordset(MyD b); MySet->Open(AFX_DAO_USE_DEFAULT_TYPE," SELECT * FROM t_samp");
3、ADO接口简介
ADO库包含三个基本接口:_ConnectionPtr接口、 _CommandPtr接口和_RecordsetPtr接口。
_ConnectionPtr接口返回一个记录集或一个空指针。通 常使用它来创建一个数据连接或执行一条不返回任何结果的 SQL语句,如一个存储过程。使用_ConnectionPtr接口返回一 个记录集不是一个好的使用方法。通常同CDatabase一样,使 用它创建一个数据连接,然后使用其它对象执行数据输入输 出操作。 _CommandPtr接口返回一个记录集。它提供了一种简 单的方法来执行返回记录集的存储过程和SQL语句。在使用 _CommandPtr接口时,你可以利用全局_ConnectionPtr接口, 也可以在_CommandPtr接口里直接使用连接串。如果你只执 行一次或几次数据访问操作,后者是比较好的选择。但如果 你要频繁访问数据库,并要返回很多记录集,那么,你应该 使用全局_ConnectionPtr接口创建一个数据连接,然后使用 _CommandPtr接口执行存储过程和SQL语句。
但是,OLE DB 应用程序编程接口的目的是为各种应用程 序提供最佳的功能,它并不符合简单化的要求。您需要的 API 应该是一座连接应用程序和 OLE DB 的桥梁,这就是 ActiveX Data Objects (ADO)。
Visual-C__-ADO数据库编程入门

2、定义_ConnectionPtr型变量,并建立数据库连接
建立了与数据库服务器的连接后,才能进行其他有关数据库的访问和操作。ADO使用Connection对象来建立与数据库服务器的连接,所以它相当于MFC中的CDatabase类。和CDatabase类一样,调用Connection对象的Open方法即可建立与服务器的连接。
数据类型 _ConnectionPtr实际上就是由类模板_com_ptr_t而得到的一个具体的实例类,其定义可以到msado15.tlh、comdef.h 和comip.h这三个文件中找到。在msado15.tlh中有:
_COM_SMARTPTR_TYPEDEF(_Collection, __uuidof(_Collection));
Recordset对象的Open方法非常重要,它的第一个参数可以是一个SQL语句、一个表的名字或一个命令对象等等;第二个参数就是前面建立的连接对象的指针。此外,用Connection和Command对象的Execute方法也能得到记录集,但是只读的。4、读取当前记录的数据
我认为读取数据的最方便的方法如下:
(1)、连接到MS SQL Server
注意连接字符串的格式,提供正确的连接字符串是成功连接到数据库服务器的第一步,有关连接字符串的详细信息参见微软MSDN Library光盘。
本例连接字符串中的server_name,database_name,user_name和password在编程时都应该替换成实际的内容。
ADO编程的关键,就是熟练地运用ADO提供的各种对象(object)、方法(method)、属性(property)和容器(collection)。另外,如果是在MS SQL或Oracle等大型数据库上编程,还要能熟练使用SQL语言。二、使用#import方法的编程步骤
VC++中使用ADO方式操作

VC++中使用ADO方式操作ACCESS数据库2005-12-12 09:59作者:刘涛出处:天极开发责任编辑:方舟ADO(ActiveX Data Object)是Microsoft数据库应用程序开发的新接口,是建立在OLE DB之上的高层数据库访问技术,即使你对OLE DB,COM不了解也能轻松对付ADO,因为它非常简单易用,甚至比你以往所接触的ODBC API、DAO、RDO都要容易使用,并不失灵活性。
本文详细地介绍在Visual C++开发环境下如何使用ADO来进行数据库应用程序开发,并给出示例代码。
为了使读者朋友都能测试本例提供的代码,我们采用Access数据库,您可以直接在我们提供的示例代码中找到这个test.mdb。
程序编译运行后的效果如图一所示:图一、ADO操作ACESS数据库的界面效果图一、实现方法万事开头难,任何一种新技术对于初学者来说最重要的还是"入门",掌握其要点。
让我们来看看ADO 数据库开发的基本流程吧!它的基本步骤如下:(1)初始化COM库,引入ADO库定义文件(2)用Connection对象连接数据库(3)利用建立好的连接,通过Connection、Command对象执行SQL命令,或利用Recordset对象取得结果记录集进行查询、处理。
(4)使用完毕后关闭连接释放对象。
下面我们将详细介绍上述步骤并给出相关代码。
1、COM库的初始化我们可以使用AfxOleInit()来初始化COM库,这项工作通常在CWinApp::InitInstance()的重载函数中完成,请看如下代码:2、用#import指令引入ADO类型库为了引入ADO类型库,需要在项目的stdafx.h文件中加入如下语句:这一语句有何作用呢?其最终作用同我们已经十分熟悉的#include类似,编译的时候系统会为我们生成msado15.tlh,ado15.tli两个C++头文件来定义ADO库。
VC下的ADO编程入门

Recordset方法
HRESULT Open ( const _variant_t & Source, const _variant_t & ActiveConnection, enum CursorTypeEnum CursorType, enum LockTypeEnum LockType, long Options )
struct InitOle
{
InitOle(){::CoInitialize(NULL);}
~InitOle(){::CoUninitialize();}
}_init_InitOle_;
void main(int argc, char* argv[])
if(SUCCEEDED(hr))
{
Rs1->put_CursorLocation(adUseClient);
hr = Rs1->Open(Source, Connect, adOpenForwardOnly, adLockReadOnly,-1);
_RecordsetPtr Execute ( _bstr_t CommandText, VARIANT * RecordsAffected, long Options )
参数
1. CommandText是命令字符串,通常是SQL命令,也可以是表名、存储过程等
2. RecordsAffected 可选,是操作完成后所影响的行数
long n;
新建一个基于对话的应用程序zjy,在对话框上添加一个按钮和列表控件,并把列表控件的样式设置为报表视图,还有用classwizard给列表控件添加一个控件变量m_list
在StdAfx.h头文件中添加一条如下语句
VC中使用ADO控件的基本功能

VC中使用ADO控件的基本功能ADO(ActiveX Data Objects)是一组可以访问数据库的组件,它提供了一种统一的接口,允许开发者使用不同的编程语言对各种类型的数据存储进行访问和操作。
在VC中使用ADO控件可以方便地进行数据库操作,本文将介绍ADO的基本功能及相关用法。
1.引入ADO库在VC项目中使用ADO之前,首先需要引入ADO库。
可以通过以下步骤引入ADO库:a)打开VC中的项目;b)选择“项目”->“属性”;c)在属性对话框中选择“配置属性”->“常规”->“使用MFC”;d)在“使用MFC”中选择“使用共享DLL”,并点击“应用”;e)在属性对话框中选择“配置属性”->“链接器”->“输入”;f) 在“附加依赖项”中加入“odbc32.lib”和“odbccp32.lib”;g)点击“应用”和“确定”。
2.连接数据库使用ADO控件前,需要建立与数据库的连接。
连接数据库常用的一种方法是使用连接字符串。
连接字符串是一串字符,包含了数据库的相关信息,如数据库类型、地址、用户名、密码等。
可以使用以下代码建立与数据库的连接:```cpp#include <windows.h>void ConnectToDatabase_ConnectionPtr pConn;HRESULT hr = pConn.CreateInstance(__uuidof(Connection));if (SUCCEEDED(hr))_bstr_t connStr = "Provider=SQLOLEDB;DataSource=YourServerName;Initial Catalog=YourDatabaseName;UserId=YourUserId;Password=YourPassword;";hr = pConn->Open(connStr, "", "", adConnectUnspecified);if (SUCCEEDED(hr))//连接成功,可以进行数据库操作}}```在代码中,使用_ConnectionPtr表示连接对象,CreateInstance函数创建连接对象的实例,并使用Open函数打开数据库连接。
VC 使用ADO连接数据库

一、ADO概述ADO是Microsoft为最新和最强大的数据访问范例 OLE DB 而设计的,是一个便于使用的应用程序层接口。
ADO 使您能够编写应用程序以通过 OLE. DB 提供者访问和操作数据库服务器中的数据。
ADO 最主要的优点是易于使用、速度快、内存支出少和磁盘遗迹小。
ADO 在关键的应用方案中使用最少的网络流量,并且在前端和数据源之间使用最少的层数,所有这些都是为了提供轻量、高性能的接口。
之所以称为 ADO,是用了一个比较熟悉的暗喻,OLE 自动化接口。
OLE DB是一组”组件对象模型”(COM) 接口,是新的数据库低层接口,它封装了ODBC的功能,并以统一的方式访问存储在不同信息源中的数据。
OLE DB是Microsoft UDA(Universal Data Access)策略的技术基础。
OLE DB 为任何数据源提供了高性能的访问,这些数据源包括关系和非关系数据库、电子邮件和文件系统、文本和图形、自定义业务对象等等。
也就是说,OLE DB 并不局限于 ISAM、Jet 甚至关系数据源,它能够处理任何类型的数据,而不考虑它们的格式和存储方法。
在实际应用中,这种多样性意味着可以访问驻留在 Excel 电子数据表、文本文件、电子邮件/目录服务甚至邮件服务器,诸如 Microsoft Exchange 中的数据。
但是,OLE DB 应用程序编程接口的目的是为各种应用程序提供最佳的功能,它并不符合简单化的要求。
您需要的API 应该是一座连接应用程序和OLE DB 的桥梁,这就是 ActiveX Data Objects (ADO)。
二、在VC中使用ADO(开发步骤如下:)1、引入ADO库文件使用ADO前必须在工程的stdafx.h头文件里用直接引入符号#import引入ADO库文件,以使编译器能正确编译。
代码如下所示://用#import引入ADO库文件#import "c:\program files\common files\system\ado\msado15.dll" \no_namespaces \rename("EOF" adoEOF")这行语句声明在工程中使用ADO,但不使用ADO的名字空间,并且为了避免常数冲突,将常数EOF改名为adoEOF。
基于VisualC++的ADO数据库开发技术

文 章 编 号 :0 2— 6 4 2 0 ) 4— 0 8— 4 10 5 3 ( 0 8 0 0 6 0
基 于 V sa C + i l u +的 A DO 数 据 库 开 发 技 术
齐永 奇 ,乔 文 生
( . 北水 利 水 电 学 院 , 南 郑 州 4 0 1 ; . 京 京 航 公 司 , 京 10 7 ) 1华 河 50 1 2 北 北 0 0 6
维普资讯
第2 9卷 第 4期
20 0 8年 8月
华
北
水
利
水
电
学
院
学
报
J u n l fNo h C i a I s t t o ae o s r a c n d o l cr o r o r a A h n n t u e fW trC n e v n y a d Hy r ee t c P we o i i
摘
要 :D A O为 高 层 数 据 库 访 问接 口, 装 了 O E D 因 具 有 简 化 开 发 程 序 的 特 点 而 得 到 推 广 应 用 . 绍 了 封 L B, 介
A O对 象 模 型 , 述 了 V D 阐 C环 境 下 用 A O 开 发 数 据 库 步 骤 , 用 实 例 说 明 了 该 开 发 技 术 的 具 体 方 法 及 关 键 D 并
而获 得查 询到 的结 果 , 结 果 由数 据 的行 ( 录 ) 该 记 和 列 ( 段) 成. 字 组
图 1 ADO 对 象 模 型
4 Fed 集合 和 Fe .i s l i d对 象 . eode 对 象包 含 l R crst 1 用 于处 理 行集 的各 个 列 的 Fed 对 象 集 合. 个 ils 行
VC学习笔记之六:ADO编程学习

6ADO编程学习6.1 基础知识1. 在StdAfx.h头文件里导入smado.dll文件,从而声明ADO类型库#import "c:\program files\common files\system\ado\msado15.dll" \no_namespace \rename ("EOF", "adoEOF")2. 初始化OLE/COM库环境ADO库是一组COM动态库,因此,在应用程序调用前,需要初始化OLE/COM库环境。
在MFC应用程序里,一个比较好的方法就是在应用程序主类的InitInstance成员函数中初始化OLE/COM库环境。
::CoInitialize(NULL);//一般放在InitInstance成员函数的第一行。
在程序最后要调用以下代码释放程序占用的COM资源。
::CoUninitialize();//这句代码一般放在ExitInstance函数中。
另外,还可以使用AfxOleInit()初始化OLE/COM库环境,它可以自动实现初始化COM 和技术时关闭COM的操作,比较方便。
3. 用通用数据连接文件进行数据库的连接使用通用数据连接文件(*.UDL,以下简称文件)来创建ADO连接,可以和ODBC一样可视化地定义要连接的数据源,从而实现数据访问的透明性。
UDL文件的建立方法:新建一个文本文件,另存为*.UDL格式,然后双击打开,就可以可视化配置数据库连接选项了。
_ConnectionPtr m_pConnection;m_pConnection.CreateInstance(“ADODB.Connection”);m_pConnection->ConnectionString=”File Name=c:\mydata.udl”;m_pConnection->Open(“”,””,””,NULL);这样一来,无论数据源如何变化,在软件中都可以使用统一的方法进行编程。
VC与ADO数据库操作1

VC与ADO数据库操作学研部的同志们,大家好! 想开一次学习会,实习时间冲突了,只好把文档发给大家看了。
重点推荐李振龙的BMP读图教程! 尤其是大三GIS班的同志,注意了,可能实习用得上的!一、ADO简介ADO(ActiveX Data Object)是Microsoft数据库应用程序开发的新接口,是建立在OLE DB之上的高层数据库访问技术,请不必为此担心,即使你对OLE DB,COM不了解也能轻松对付ADO,因为它非常简单易用,甚至比你以往所接触的ODBC API、DAO都要容易使用,【1】为工程做准备建一个基于对话框的工程,名字叫PlaceName。
加入一个ListControl控件,ID改成IDC_RESULT,顺便点一下Styles选项卡,把View改成Report,你可以看到对话框里的ListControl控件的样子已经变成带字段名的报表格式了。
右击它,用ClassWizard添加成员变量,名字为m_LisCtrlResult。
按照上面的程序界面,加入一个编辑框(输入SQL语句用的),同上面添加m_LisCtrlResult 成员变量一样,加入一个CString变量,名字为m_SqlText,还有一个“查询”按钮,把它叫为Query,双击它一下,VC会自动为它加入消息和函数的,名字也叫OnQuery(),等一下我们就用着那个函数的。
看到我们SpaceSoft的标志不?把你的照片换成BMP格式的,放上去吧!定义一下要用着的变量:class CPlaceNameDlg : public CDialog{// Constructionpublic:_RecordsetPtr m_pRecordset; //定义一个RecordsetPtr对象,用来储存读出来的表HRESULT hr; //查出后的表Fields* fields; //储存查出后的字段BSTR bstrColName; //储存一下字段名long nRstCol; //SQL语句一共查出了几个字段?nRstCol个!CString strColName[100]; //把查出的字段名转换成常见常用的CString类型,放在这个数组里边……}//储存从数据库读出的数据,variant 变量能够存储所有系统定义类型的数据。
Visual C++大学教程第12章 ADO数据库编程

表12.1 Connection对象属性表
属 性 描 述 属性为读/写,并且其值可以为AdXactCommitRetaining和AdXactAbortRetaining中的任意一个或 多个 该属性允许由于网络拥塞或服务器负载过重产生的延迟而取消 Execute 方法调用。指示在终止 尝试和产生错误之前执行命令期间需等待的时间 该属性包含用来建立到数据源的连接的信息。通过传递包含一系列由分号分隔的 argument = value 语句的详细连接字符串可指定数据源 如果由于网络拥塞或服务器负载过重导致的延迟使得必须放弃连接尝试时,使用该属性,指示在 终止尝试和产生错误前建立连接期间所等待的时间 该属性允许在提供者可用的各种游标库中进行选择。通常,可以选择使用客户端游标库或位于服 务器上的某个游标库。设置或返回游标引擎的位置 设置或返回指定Connection对象上默认数据库的名称 表示Connection对象的隔离级别。IsolationLevel 的属性为读/写。直到下次调用BeginTrans方 法时,该设置才可以生效 可设置或返回当前连接上提供者正在使用的访问权限。Mode属性只能在关闭Connection对象时方 可设置 设置或返回连接提供者的名称 确定指定对象的当前状态。该属性是只读的 表示ADO版本号
PageSize
RecordCount Sort Source State Status
Recordset对象属性表
描 述
根据其在Recordset中的序号位置移动到记录,或确定当前记录的序号位置 确定在其上将执行指定Command对象或打开指定Recordset的Connection对象 表示当前记录位置位于Recordset对象的第1个记录之前 表示当前记录位置位于Recordset对象的最后一个记录之后 保存当前记录的位置并随时返回到该记录 控制提供者在缓存中所保存的记录的数目,并可控制一次恢复到本地内存的记录数 允许在可用于提供者的各种游标库中进行选择 指定打开Recordset对象时应该使用的游标类型
ADO技术及其在VisualC_环境下数据库编程中的应用

第25卷第4期通化师范学院学报V ol.25№4 2004年4月JOURNA L OF T ONG H UA TE ACHERSπC O LLEGE Apr.2004ADO技术及其在Visual C++Ξ环境下数据库编程中的应用赵法信(通化师范学院教务处,吉林通化134002)摘 要:介绍了ADO对象模型的原理,对其在Visual C++环境下数据库编程中的应用作了较为系统的研究,并给出了相应的程序代码.关键词:ADO;Visual C++;应用;数据库编程中图分类号:TP313 文献标识码:A 文章编号:1008-7974(2004)04-0029-041 概述ADO,即ActiveX Data Object,是Micros oft最新的对象层次上的数据操作技术.它建立在O LE DB之上,并封装了O LE DB程序中大量使用的C OM接口,为操作O LE DB数据源提供了一套高层次的自动化接口,从而大大简化了O LE DB的操作.尽管在Visual C++中已经提供了多种多样的数据库访问技术(如ODBC、MFC ODBC、DAO),但由于ADO 中使用了C OM接口技术,能够直接对数据的驱动程序进行访问,从而具有比其它数据库访问技术更高的数据访问效率.同时,与其它访问技术不同,ADO技术对对象之间的层次和顺序关系要求不是太严格.如在程序开发过程中,不必先建立连接,然后才产生记录对象,而可以在使用记录的地方直接使用记录对象.这种模型有力的简化了程序设计,增强了程序的灵活性.2 ADO原理Micros oft新近推出的UDA(Universal Data Access,一致数据访问)技术的两层标准接口之一.其中O LE DB 是系统级的编程接口,ADO是应用层的编程接口,它对O LE DB进行了封装.从图1中我们可以看出,应用程序既可以通过ADO访问数据也可以直接通过O LE DB访问数据,而ADO则通过O LE DB访问底层数据.从图1我们也看到了ADO实际上是O LE DB的应用层接口,这种结构也为一致的数据访问接口提供了很好的扩展性,而不再局限于特定的数据源,因此,ADO可以处理各种O LE DB支持的数据源.图1 UDA的层次结构图如图2所示,在ADO的对象模型中,主体对象只有3个:C onnection、C ommand和Recordset,其他4个集合对象Errors、Properties、Parameters和Fields分别对应Error、Property、Parameter和Field对象,整个ADO对象模型就由这些对象组成.一个典型的ADO应用使用C onnection对象建立与数据源的连接,然后用一个C ommand对象给出对数据库操作的命令,比如查询或者更新数据等,而Recordset用于对结果集数据进行维护或者浏览等操作.需注意的是C ommand命令所使用的命令语言与底层所对应的O LE DB数据源有关,不同的数据源可Ξ收稿日期:2003-03-20作者简介:赵法信(1974-),男,通化师范学院工程师,东北大学信息学院在读硕士.以使用不同的命令语言.图2 ADO对象模型3 ADO技术在Visual C++环境下数据库编程中的应用在Visual C++环境下开发基于ADO的数据库应用程序一般使用如下过程操作数据源中的数据(1)引入ADO库文件,初始化C OM库环境1)引入ADO库文件使用ADO前必须在工程的stdafx.h文件里用#im port引入ADO库文件,以使编译器能正确编译.代码如下所示:#im port”c\program files\comm on files\system\ado\msado15.dll”no-namespaces rename(”E OF”adoE OF”)这行语句声明在工程中使用ADO,但不使用ADO的命名空间,并且为了避免常数冲突,将常数E OF改名为adoE OF.现在不需添加另外的头文件,就可以使用ADO接口了.这一语句的最终作用同我们熟悉的#include类似,编译的时候系统会为我们生成msado15.tlh和ado15. tli两个C++头文件来定义ADO库.需注意的是,msado15.dll的引入路径应根据实际情况而定.2)初始化C OM库环境因为ADO库是一组C OM动态库,这就意味应用程序在调用ADO前,必须初始化C OM库环境.在MFC 应用程序里,这项工作通常应在CWinApp::InitInstance()的重载函数中完成,代码如下: BOO L CADOApp::InitInstance(){if(!A fxOleInit()){A fxM essageBox(”O LE初始化出错!”);return FA LSE;}……}(2)创建C onnection对象并连接数据库首先我们需要添加一个指向C onnection对象的指针-C onnectionPtr m-pC onnection;下面的代码演示了如何创建C onnection对象实例及如何连接数据库并进行异常捕捉.v oid CAdoDlg::OnC onnect(){HRES U LT hr;-bstr-t s ource(”Provider=S Q LO LE DB;server=SY STE M;uid=sa;pwd=sa;database=northwind”);-bstr-t user(””);-bstr-t pwd(””);try{hr=m-pC onnection.CreateInstance(-uuidof(C onnection));//创建C onnection对象if(S UCCEE DE D(hr)){hr=m-pC onnection->Open(s ource,user,pwd,adM odeUnknown);//连接数据库}}catch(-com-error e)//捕捉异常A fxM essageBox(e.ErrorM essage());//显示错误信息}}在这段代码中我们是通过C onnection对象的Open方法来进行连接数据库的,下面是该方法的原型:HRE2 S U LT C onnection15::Open(-bstr-t C onnectionS tring,-bstr-t UserID,-bstr-t Passw ord,long Options)其中C onnectionString为连接字符串,UserI D是用户名,Passw ord是登陆密码,Options是连接选项,用于指定C onnection对象对数据的更新许可权.(该原型的详细解释请查阅[5])下面是一些我们常用的数据库连接方式1)通过J ET数据库引擎对ACCESS2000数据库的连接m-pC onnection->Open(”Provider=M icros oft.Jet.O LE DB.4.0;Data S ource=C:\fact.mdb”,””,””,adM odeUnknown);2)通过DS N数据源对任何支持ODBC的数据库进行连接m-pC onnection->Open(”DS N=N orthW ind;UID=sa;PW D=;”,””,””,adM odeUnknown);3)不通过DS N对S Q L SERVER数据库进行连接m-pC onnection->Open(”Provider=S Q LO LE DB;server=SY STE M;uid=sa;pwd=sa;database=northwind”,””,””,adM odeUnknown);(3)利用建立好的连接,通过C onnection、C ommand对象执行S Q L命令,或利用Recordset对象取得结果记录集进行查询、处理.为了取得结果记录集,我们首先需要定义一个指向Recordset对象的指针,定义如下:-RecordsetPtr m-pRecordset;接着为其创建Recordset对象的实例:m-pRecordset.CreateInstance(-uuidof(Recordset));S Q L命令的执行可以通过C onnection、C ommand或Recordset对象来进行,由于篇幅原因,在这里我们主要阐述如何利用Recordset对象的Open方法来实现对记录集的各种操作.Open方法的原型如下:HRES U LT Recordset15::Open(const-variant-t&S ource,const-variant-t&ActiveC onnection,enum Curs orT ypeEnum Curs orT ype,enum LockT ypeEnum LockT ype,long Options)其中S ource是数据查询字符串;ActiveC onnection是已经建立好的连接(在这里需要用C onnection对象指针来构造一个-variant-t对象);Curs orT ype为光标类型,LockT ype为锁定类型,Options表示S ource中内容的类型,其类型既可以是一个文本命令,也可以是一个表名,还可以是一个存储过程.(该原型的详细解释请查阅[5])下面给出一个实例来具体说明如何在Visual C++环境下用Recordset对象实现记录集的遍历、更新.假定在S Q L Server中已经存在fact表,它包含四个字段:I D,name,age,birthday.以下的代码将实现:打开记录集,遍历所有记录,删除第一条记录,移动光标到最后一条记录,更改其姓名,保存到数据库.v oid CAdoDlg::OnOperation(){CS tring output;-variant-t vname,vBirthday,vID,vage;-RecordsetPtr m-pRecordset;m-pRecordset.CreateInstance(-uuidof(Recordset));m-pRecordset->Open(”SE LECT3FROM fact”,-variant-t((IDispatch3)m-pC onnection,true),adOpenS tatic,ad LockOptim istic,adCmdT ext);//打开记录集//遍历所有记录while(!m-pRecordset->adoE OF){vID=m-pRecordset->G etC ollect(-variant-t((long)0));//取得第1列的值,从0开始计数vname=m-pRecordset->G etC ollect(”name”);//取得name字段的值vage=m-pRecordset->G etC ollect(”age”);vBirthday=m-pRecordset->G etC ollect(”birthday”);if(vID.vt!=VT-NU LL&&vname.vt!=VT-NU LL&&vage.vt!=VT-NU LL&&vBirthday.vt!=VT-NU LL){output.F ormat(”id:%d,name:%s,age:%d,birthday:%s”,vID.lVal,(LPCTSTR)(-bstr-t)vname,vage.lVal,(LPCTSTR)(-bstr-t)vBirthday);A fxM essageBox(output);//输出记录集中的记录}m-pRecordset->M oveNext();//移到下一条记录m-pRecordset->M oveFirst();//移到首条记录m-pRecordset->Delete(adA ffectCurrent);//删除当前记录m-pRecordset->M oveLast();//移到记录尾m-pRecordset->PutC ollect(-variant-t(”name”),-variant-t(”T om”));//修改其姓名m-pRecordset->Update();//保存到库中}(4)使用完毕后关闭记录集与连接记录集或连接都可以用Close方法来关闭,代码如下:m-pRecordset->Close();//关闭记录集m-pC onnection->Close();//关闭连接4 小结数据访问发展的趋势是O LE DB,使用O LE DB最简单的方法是ADO.ADO的对象层次模型封装了数据库访问细节,为Visual C++程序员提供了一种非常好的数据访问策略.作为访问数据库的新技术,ADO所具有易于使用、访问灵活、应用广泛的特点是ODBC等数据库访问技术所无法比拟的.参考文献:[1]李博轩.Visual C++6.0数据库开发指南[M].清华大学出版社,2000.[2]希望图书创作室译.Visual C++6.0技术内幕[M].北京希望电子出版社,1999.[3]李闽溟,吴继刚.Visual C++6.0数据库开发实例导航[M].人民邮电出版社,2002.[4]夏云庆.Visual C++6.0数据库高级编程[M].北京希望电子出版社,2002.(责任编辑:王前) ADO and Its Application in Database Programming under the Condition of Visual C++ZH AO Fa-xin(Math Department,Tonghua Teacher s College,Tonghua,Jilin,134002)Abstract:The paper introduces the theorem of target m odel of ADO and makes a systematic research on its applica2 tion under the condition of Visual C++,the correpounding program codes are als o given.K ey w ords:ADO;Visual C++;application;database programming。
VC中使用ADO进行数据库开发的一些资料的整理

VC中使用ADO进行数据库开发的一些资料的整理1.导入ado库在StdAfx.h中,加入如下代码#import "c:\program files\common files\system\ado\msado15.dll" \no_namespace rename("EOF","adoEOF") renam e("BOF","adoBOF") 初试化在app的InitInstance中,加入AfxOleInit();(MFC)或者CoInitialize(NULL)如果用了CoInitialize退出时,要调用CoUninitialize()注意,如果在线程中也使用了com,那么在线程中也要用CoInitialize初始3.连接数据库_ConnectionPtr m_pAppConn;hResult = m_pAppConn.CreateInstance(_T("ADODB.Connection"));///创建Connection对象然后连接之m_pAppConn->Open("Provider=Microsoft.Jet.OLEDB.4.0 ; \Data Source = .\\DataBase\\aa.mdb","","",adModeUnknown);BOOL OpenConnect(){HRESULT hResult;CloseConnect();try{hResult = m_pAppConn.CreateInstance(_T("ADODB.Connection"));///创建Connection对象 if(SUCCEEDED(hResult)){m_pAppConn->Open("Provider=Microsoft.Jet.OLEDB.4.0 ; \Data Source = .\\DataBase\\aa.mdb","","",adModeUnknown);}}catch(_com_error e)///捕捉异常{CString errormessage;errormessage.Format(_T("连接数据库失败!\r\n错误信息:%s"),e.ErrorMessage()); AfxMessageBox(errormessage);hResult = -1L;}return (SUCCEEDED(hResult) ? TRUE : FALSE);}这里连接的数据库是access数据库,在工程目录下的DataBase\aa.mdb关键连接的字符窜,如果是accessProvider=Microsoft.Jet.OLEDB.4.0;Data Source=\\192.168.1.1\DataBase\aa.mdb; 这是局域网上的文件Provider=Microsoft.Jet.OLEDB.4.0;Data Source=.\\DataBase\\aa.mdb;本机上的如果是sql 2000Provider=SQLOLEDB.1;Persist Security Info=True;User ID=sa;Password=sa;Initial Catalog=aa;Data Source=192.168.1.1;数据库在192.168.1.1上,数据库名字是aa4.关闭连接BOOL CloseConnect(){HRESULT hResult=0;try{if(m_pAppConn!=NULL){if(m_pAppConn->State!=adStateClosed){hResult=m_pAppConn->Close();}m_pAppConn.Release();}}catch(_com_error e){_bstr_t bstrSource(e.Source());_bstr_t bstrDescription(e.Description());TRACE(_T("\n Source : %s \n Description : %s\n"),(LPCSTR)bstrSource,(LPCSTR)bstrDescription);hResult=-1L;}return (SUCCEEDED(hResult) ? TRUE : FALSE);}5.使用recodeset打开记录_variant_t RecordsAffected;_RecordsetPtr pRecordset = NULL;strSql = _T("SELECT field FROM table");pRecordset.CreateInstance(_uuidof(Recordset));pRecordset = pConn->Execute (_bstr_t(strSql) , &RecordsAffected , adCmdUnknown); 其中&RecordsAffected 可以获得有多少记录返回,这是记录的影像数目6.关闭记录集if(pRecordset != NULL && pRecordset->State){pRecordset->Close();pRecordset = NULL;}7.判断是否为空if (pRecordset->adoBOF && pRecordset->adoEOF) {//MessageBox("没有符合条件的记录存在!","提示");if(pRecordset != NULL && pRecordset->State){pRecordset->Close();pRecordset = NULL;}return;}8,从记录集取数据_variant_t var;pRecordset->MoveFirst();for(;!pRecordset->adoEOF;pRecordset->MoveNext()) {var = pRecordset->GetCollect(_T("field"));}9.几种常见数据的转换如果是字符窜的字段var = pRecordset->GetCollect(_T("field"));if(var.vt!=VT_NULL){str= (LPCTSTR)_bstr_t(var);}if(var.vt!=VT_NULL)判断是必须的,如果是空,转换会出错如果是int形int aa = atoi(str)_variant_t是个可变类型,支持很多种类型,10.使用command利用Command对象来执行SQL命令_CommandPtr m_pCommand;m_pCommand.CreateInstance("mand");_variant_t vNULL;vNULL.vt = VT_ERROR;vNULL.scode = DISP_E_PARAMNOTFOUND;///定义为无参数m_pCommand->ActiveConnection = m_pConnection;///非常关键的一句,将建立的连接赋值给它m_pCommand->CommandText = "SELECT * FROM users";///命令字串m_pRecordset = m_pCommand->Execute(&vNULL,&vNULL,adCmdText);///执行命令,取得记录集如果使用记录集的open来打开command对象.如果在Source 参数中传送 Command 对象并且同时传递ActiveConnection 参数,那么将产生错误。
在Visual?C++中使用ADO

在Visual C++中使用ADO在Visual C++中,要使用ADO对象,必须先在类的头文件中导入ADO的库文件,并包含头文件icrsint.h。
ADO数据绑定对话框向导可自动导入ADO对象库,并包含icrsint.h。
在对象Visual C++中,CADORecordBinding类实现了如何在Visual C++中使用ADO对象。
ADO数据绑定对话框向导建立了一个CADORecordBinding类的派生类CCustomRs。
CCustomRs类定义了与制定数据库表字段对应的数据成员,并将数据成员绑定到字段。
在CCustomRs类头文件RsCgDlg.h的头部,导入了ADO库:#import "C:/Program Files/Common Files/system/ado/msado15.dll" rename_namespace("ADOCG") rename("EOF", "EndOfFile")using namespace ADOCG;#include "icrsint.h"然后,向导定义了一个CRsCgDlg类,该类继承了CDialog(对话框类)和CCustomRs。
CRsCgDlg类定义了一个记录集对象指针m_pRs,如下:_RecordsetPtr m_pRs;_RecordsetPtr在CADORecordBinding类中被定义为ADO的Recordset对象指针。
通过m_pRs即可在对话框中使用ADO的Recordset对象访问数据库。
1.打开记录集首先要创建一个Connection对象实例,然后执行Open方法打开记录集。
例如:m_strConnection = _T("Provider=Microsoft.Jet.OLEDB.4.0;DataSource=C://Documents and Settings//Administrator//桌面 //File.mdb;Persist SecurityInfo=False"); //定义连接字符串m_strCmdText = _T("F1");//定义命令文本内容m_pRs.CreateInstance(__uuidof(Recordset)); //创建Connection对象实例m_pRs->CursorLocation = adUseClient; //设置游标位置m_pRs->Open((LPCTSTR)m_strCmdT ext, //命令文本内容(LPCTSTR)m_strConnection, //连接字符串adOpenKeyset, //设置游标类型adLockReadOnly, //设置锁定类型adCmdTableDirect); //设置命令类型2.游标位置Connection对象的CursorLocation属性用于设置或返回游标位置,常数adUseClient表示使用本地游标库提供的客户端游标。
基于Visual C++的ADO数据库开发技术

基于Visual C++的ADO数据库开发技术摘要:ADO技术是一种高层数据库的访问接口,由于具有着鲜明的优势被广泛推广使用。
基于此,本文首先分析了基于Visual C++的数据库开发的常用技术,然后研究了ADO技术开发数据库的基本流程,以期能够推动ADO技术的应用,简化程序开发的流程。
关键词:Visual C++;ADO;数据库;开发技术引言:Visual C++的应用,得到了多种数据库的开发技术,如ADO、ODBC、DAO等等。
在这些技术中,ODBC是一种标准技术,具有着广泛的应用范围,但是只能对关系数据库展开访问,也因此被ADO技术所取代。
ADO技术具备其他技术的优点,让数据库开发得到充分的简化。
因此,还需要加强对ADO技术的研究,让其得到充分的应用。
一、基于Visual C++的数据库开发的常用技术(一)ODBC API开发技术ODBC是一种经常被使用进行深入访问的编程接口,用来进行交互性设计,也就是一个应用程序利用同样的源代码能够访问各种各样的数据库管理系统,也就是DBMS。
在数据库中的应用程序是在ODBC之中调用函数,在驱动程序的接口主要是利用数据库模块来实现的。
使用驱动程序让程序被数据库中得到隔离。
在ODBC中,体系结构主要是由应用程序、驱动程序、管理器以及数据源等这些部件构成。
具体的结构是由应用程序控制驱动程序的管理器,管理器又控制三个驱动程序,驱动程序之下是数据源,数据源之下是数据库。
ODBC作为一种低层的访问技术,ODBC API让客户端的应用程序被从底层开始设置,达到控制数据库的能力,从而完成高层数据库在技术上无法实现的功能。
(二)MFC ODBC开发技术ODBC提供了一种可以访问数据库的接口,还能够直接使用创建程序需要使用的代码。
基于Visual C++提供MFC ODBC,其中又封装了ODBC API,向对象提供了数据库类,让创建应用程序被大大简化[1]。
MFC ODBC相比于ODBC API更加简单易用,使用MFC ODBC技术并不能提供数据库低层的控制,也就是无法进行数据库的底层操作。
Visual C++ 中使用 ADO、RDO数据绑定

Visual C++ 中使用ADO、RDO数据绑定Visual C++ 中使用ADO、RDO数据绑定 (1)在Visual C++ 中使用ADO 数据绑定需要下列步骤: (1)在Visual C++ 中使用ADO 数据绑定 (1)创建使用ADO 数据控件修改数据的应用程序 (2)在Visual C++ 中使用RDO 数据绑定需要下列步骤: (3)在Visual C++ 中使用RDO 数据绑定 (3)创建使用RDO RemoteData 控件修改数据的应用程序 (4)Visual C++ 中使用ADO、RDO数据绑定在Visual C++ 中使用ADO 数据绑定需要下列步骤:添加ADO 数据控件。
指向数据源。
指定记录源(SQL 查询或数据检索语言)。
添加ADO 数据绑定控件。
将数据绑定控件连接到ADO 数据控件。
选择要绑定到ADO 数据控件记录源的字段。
在 Visual C++ 中使用 ADO 数据绑定使用“MFC 应用程序向导”创建MFC 对话框应用程序或MFC Formview 应用程序。
将Microsoft ADO 数据控件添加到对话框;请参见将控件插入Visual C++ 应用程序。
将ADO 数据控件指向OLE DB 数据源。
右击ADO 数据控件,再单击“属性”。
在“控件”选项卡上,单击“使用连接字符串”。
可以使用提供的提供程序也可以删除它。
单击“生成”。
如果从“使用连接字符串”中删除了提供程序,现在可以定义一个。
定义提供程序后,再次访问ADO 数据控件的属性,然后再次选择“生成”继续。
如果在选择“生成”之前在“使用连接字符串”中定义了提供程序,现在可以定义数据链接属性。
这将显示“DataLink 向导”。
如有必要更改“提供程序”,并为提供程序定义适当的“位置”和“数据源”值。
例如,如果使用的是SQL Server 提供程序,则“位置”指定数据库服务器,而“数据源”指定数据库。
如果使用的是ODBC 提供程序,则“数据源”对应于ODBC DSN。
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
Visual C++中的ADO数据库编程2008-07-25 17:07:51| 分类: Database|举报|字号订阅ADO 是目前在Windows环境中比较流行的客户端数据库编程技术,是建立在OLE DB底层技术之上的高级编程接口,因而它兼具有强大的数据处理功能(处理各种不同类型的数据源、分布式的数据处理等等)和极其简单、易用的编程接口,因而得到了广泛的应用。
而且按微软公司的意图,OLE DB和ADO将逐步取代ODBC和DAO。
ADO编程的关键,就是熟练地运用ADO提供的各种对象(object)、方法(method)、属性(property)和容器(collection)。
另外,如果是在MS SQL或Oracle等大型数据库上编程,还要能熟练使用SQL语言。
ADO中最重要的对象有三个:Connection、Recordset和Command,它们分别表示连接对象、记录集对象和命令对象。
使用方法如下:1、在StdAfx.h中使用预处理指令#import引入ADO类库#i nclude <icrsint.h>#import "c:\\program files\\common files\\system\\ado\\msado15.dll"#import "c:\\program files\\common files\\system\\ado\\msadox.dll" \no_namespace \rename("EOF", "adoEOF")2、在MyApp的初始化函数BOOL CMyApp::InitInstance()中,进行环境初始化if(!AfxOleInit()){AfxMessageBox("初始化OLE/COM库环境失败!");return FALSE;}经过以上两步后,便可以使用ADO的三个智能指针:_ConnectionPtr、_RecordsetPtr、_CommandPtr。
其中icrsint.h文件包含了VC++扩展的一些预处理指令、宏等的定义,用于COM编程时使用。
在编译的时候会出现如下的警告信息:msado15.tlh(405) : warning C4146:unary minus operator applied to unsigned type, result still unsigned。
MSDN建议我们不要理会。
如果你实在不想看到的话可以在stdafx.h中加入一行下面的代码:#pragma warning(disable:4146),这样这个警告信息就不会再出现了。
还要注意#import预处理指令不能放在stdAfx.h文件的开头,而应该放在所有include指令的后面。
否则在编译时会出错。
程序在编译过程中,VC++会读出msado15.dll中的类型库信息,自动产生两个该类型库的头文件和实现文件msado15.tlh和msado15.tli(在您的Debug或Release目录下)。
在这两个文件里定义了ADO的所有对象和方法,以及一些枚举型的常量等。
我们的程序只要直接调用这些方法就行了,与使用MFC中的COleDispatchDriver类调用Automation对象十分类似。
Recordset对象的Open方法非常重要,它的第一个参数可以是一个SQL语句、一个表的名字或一个命令对象等等;第二个参数就是前面建立的连接对象的指针。
此外,用Connection和Command对象的Execute方法也能得到记录集,但是只读的。
Fields是Recordset对象的容器,GetItem方法返回的是Field对象,而Value 则是Field对象的一个属性(即该字段的值)。
判断是否到达记录集的末尾,使用记录集的adoEOF属性,其值若为真即到了结尾,反之则未到。
判断是否到达记录集开头,则可用BOF属性。
创建对象实例时,最好用HRESULT跟踪结果,并用try...catch...捕捉异常:_ConnectionPtr pMyConnect=NULL;HRESULT hr=pMyConnect.CreateInstance(__uuidof(Connection)));if(FAILED(hr))return;try{}catch(_com_error e)//捕捉异常{e.Description();e.ErrorMessage();e.Source();}判断一个记录集是否可以增加新记录的方法if(!m_pRecordset->Supports(adAddNew)) return;打开数据库:_ConnectionPtr m_pConnection = NULL;m_pConnection.CreateInstance(__uuidof(Connection));CString strConn;strConn.Format("Provider=Microsoft.Jet.OLEDB.4.0;Data Source=%s", strPathName);try{m_pConnection->Open(_bstr_t(strConn),"","", adModeUnknown);}catch(_com_error e)///捕捉异常{CString errormessage;errormessage.Format("打开数据库失败!\r\n错误信息:%s", e.ErrorMessage()); AfxMessageBox(errormessage);///显示错误信息return FALSE;}遍历数据库中的所有表HRESULT hr;_RecordsetPtr pSet;hr = pSet = pConnection->OpenSchema(adSchemaTables);if(FAILED(hr)){AfxMessageBox("获得表集合失败!");return NULL;}int iMark = 0;while(!(pSet->adoEOF)){//获取表格名称CString strTableName;_bstr_t table_name = pSet->Fields->GetItem("TABLE_NAME")->Value; //判断数据库中是否有名称为pipeline的表strTableName = (LPCSTR)_bstr_t(table_name);if(strcmp(strTableName, "pipeline") == 0){iMark = 1;break;}pSet->MoveNext();}pSet->Close();打开数据库中的一个表_RecordsetPtr pRecordset = NULL;pRecordset.CreateInstance(__uuidof(Recordset));try //打开名称为link的表{pRecordset->Open("SELECT * FROM link",_variant_t((IDispatch*) m_pConnection,true),adOpenDynamic,adLockOptimistic,adCmdText); }catch(_com_error e){CString errormessage;errormessage.Format("打开表失败!\r\n错误信息:%s",e.ErrorMessage()); AfxMessageBox(errormessage);///显示错误信息return;}遍历表中所有的记录,得到指定字段的值_variant_t var;CString strPathName;while(VARIANT_FALSE == pRecordset->adoEOF){var = pRecordset->GetFields()->GetItem("FilePath")->GetValue();strPathName = (LPCSTR)_bstr_t(var);…………pRecordset->MoveNext();}遍历表中所有的字段HRESULT hr;FieldsPtr fields = NULL;long ColCount;BSTR bstrColName;CString strColName;hr = pRecordset ->get_Fields(&fields); //得到记录集的字段集if(SUCCEEDED(hr))fields->get_Count(&ColCount);//得到记录集的字段集合中的字段的总个数for(long i=0; i<ColCount; i++){fields->Item[i]->get_Name(&bstrColName); //得到记录集中的字段名strColName = bstrColName;}fields->Release();附1:用SQL语句来创建表格时,字段类型与关键字的对照表:文本型 TEXT备注型 MEMO数字型(整型、长整型、浮点型、双精度型) INTEGER、LONG、FLOAT、DOUBLE日期/时间型 DATETIME自动编号型 AUTOINCREMENTOLE对象型(二进制型、长二进制型) BINARY、LONGBINARY---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------1. 生成应用程序框架并初始化OLE/COM库环境创建一个标准的MFC AppWizard(exe)应用程序,然后在使用ADO数据库的InitInstance函数中初始化OLE/COM库(因为ADO库是一个COM DLL库)。