600 likes | 812 Views
ADO 访问数据库. Version1.0. 2010 年 5 月. 2014/10/24. 课程介绍 软件项目计划 制作项目计划 几点建议 参考资料. Overview. 课程目标 预备知识 目标听众 日程表 词汇表. 课程介绍. 理解 ADO 的结构 全面理解 Connection 、 Command 、 Recordset 对象及其成员变量 掌握用 ADO 进行数据库应用程序设计. 课程目标. VC++ 的基本知识 数据库 SqlServer 的基本知识. 预备知识. 项目经理 软件开发人员 其他人员. 目标听众.
E N D
ADO访问数据库 Version1.0 2010年5月 2014/10/24
课程介绍 软件项目计划 制作项目计划 几点建议 参考资料 Overview
课程目标 预备知识 目标听众 日程表 词汇表 课程介绍
理解ADO的结构 全面理解Connection、Command、Recordset对象及其成员变量 掌握用ADO进行数据库应用程序设计 课程目标
VC++的基本知识 数据库SqlServer的基本知识 预备知识
项目经理 软件开发人员 其他人员 目标听众
共计:0.5天 详细安排 日程表
ODBC(Open Database Connectivity) 开放数据库互连。ODBC是上个世纪八十年代末九十年代初出现的技术,它为编写关系数据库的客户软件提供了一种统一的接口。ODBC提供一个单一的API,可用于处理不同数据库的客户应用程序。使用ODBC API的应用程序可以与任何具有ODBC驱动程序的关系数据库进行通信。 DAO(Data Access Object) 数据访问对象。DAO就是一组Microsoft Access/Jet数据库引擎的COM自动化接口。 DAO不像ODBC那样是面向C/C++程序员的,它是微软提供给Visual Basic开发人员的一种简单的数据访问方法,用于操纵Access数据库。 数据库访问技术
RDO(Remote Data Object),远程数据对象。 由于RDO直接调用ODBC API(而不是像DAO那样通过Jet引擎),所以,可以为使用关系数据库的应用程序提供更好的性能。 OLE DB,对象链接与嵌入数据库。 OLE DB在两个方面对ODBC进行了扩展。首先, OLE DB提供了一个数据库编程的COM接口;第二, OLE DB提供了一个可用于关系型和非关系型数据源的接口。 OLE DB的两个基本结构是OLE DB提供程序(Provider)和OLE DB用户程序(Consumer),它只支持C/c++ 数据库访问技术
ADO(ActiveX Data Object) ActiveX数据对象,它建立在OLE DB之上。ADO是一个OLE DB用户程序。使用ADO的应用程序都要间接地使用OLE DB。ADO简化了OLE DB,提供了对自动化的支持,使得像VBScript这样的脚本语言也能够使用ADO访问数据库。 数据库访问技术
OLE DB体系架构 使用ADO的 客户程序 OLE DB用户程序 使用OLE DB访问数据库的程序 ADO OLE DB提供程序 ODBC ODBC 数据库 ODBC 数据库 电子表格 电子邮件 其它非关 系型存储
ADO特点 1.易于使用。ADO是高层数据库访问技术,相对于ODBC来说,具有面向对象的特点,在ADO的对象结构中,对象与对象的层次关系不是非常明显。这样会给编写数据库程序带来很多便利。例如:在应用程序中我们要使用记录集对象,我们不一定要先建立连接,会话对象,如果需要就可以直接构造记录集对象。 总之,不用关心对象的构造顺序和构造层次。 ADO技术
2.可以访问多种数据源。与OLEDB一样,ADO也几乎可以访问所有关系数据源和非关系数据源,这样的应用程序具有很好的通用性和灵活性。2.可以访问多种数据源。与OLEDB一样,ADO也几乎可以访问所有关系数据源和非关系数据源,这样的应用程序具有很好的通用性和灵活性。 3.访问数据源效率高。因为ADO是以OLEDB技术为基础的,所以它继承了OLEDB访问数据源的高效性。 4.方便的WEB应用。ADO可以ActiveX控件的形式出现,这可以大大方便WEB应用程序的编制。 5.技术编程接口丰富。如包括VC++,VB,VJ++以及VBScript和javaScript等脚本语言。 ADO技术
ADO应用结构 • ADO应用结构 OLE DB OLE DB 使用程序 MDB files MSDASQL.DLL 使用ADO的应用 ADO SQLOLEDB.DLL MDB files 使用ADO的应用 MSJTCA35.DLL OLE的接口分别被OLEDB数据提供程序,服务提供程序和数据使用程序使用,而ADO所提供的对象则只能被数据应用程序使用,并且ADO对象使用了OLEDB服务提供程序和OLEDB数据提供程序所提供的接口和服务。总之,ADO提供的对象用于实现OLEDB的数据应用程序。 SQL DB
ADO对象 • ADO对象 • ADO模型包括了下列对象:连接对象,命令对象,记录集对象,字段对象,参数对象和错误对象以及对象集合和属性等。 • 1. 连接对象(Connection):用于表示于数据源的连接,以及处理一些命令和事务,通过连接可以从应用程序访问数据源,连接是交换数据所必须的环境。 • 2.命令(Command)通过已建立的连接发出的“命令”可以某种方式来操作数据源。命令可以在数据源中添加,删除或更新数据或检索数据。 • 3.记录集(Recordset)用于处理数据源的表格集,如获取或修改数据等。
ADO对象 4.字段(Field)用于表示记录集中的列信息,包括列值等信息。每一个字段列都包含有名称,数据类型和值的属性,正是在该值中包含了来自数据源的真实数据。在需要修改数据源中的数据,可以在记录集中修改Field对象的值,对记录集的更改最终被传输给数据源。 5.参数(Parameter)用于对传递给数据源的命令赋参数值等。 通常,命令需要的变量部分即“参数”可以在命令发布之前进行更改,例如,可重复发出相同的命令,但每一次均可更改指定的检索信息。 6.错误对象(Error)用于获取所产生错误的详细信息。错误可以在应用程序中发送,通常是由于无法建立连接,执行命令或对某些状态的对象进行操作。
ADO对象 7.属性(Property):每个ADO对象都有一组唯一的“属性”来描述或控制对象的行为。属性有内置和动态两种类型,内置属性是ADO对象的一部分并且随时可用,动态属性则由特别的数据提供者添加到ADO对象的属性集合中,仅在提供者被使用时才能存在。 8.集合:ADO提供“集合”,这是一种可方便地包含其他特殊类型对象的对象类型,使用集合方法可按名称或序号对集合中的对象进行检索。 ADO提供四种类型的集合:Connection对象具有Errors集合。 Command对象具有Praameters集合,包含应用玉Command对象的所有Parameter对象。Recordset对象具有Field集合。 此外Connection,Command,Recordset和Field对象都具有属性集合
ADO对象 Command(optional) Parameters Collection Connection Execute Execute Parameter(optional) Source Recordset Error Collection (optional) Active Connection Fields Collection Field Error(optional)
ADO库包含三个基本接口: _ConnectionPtr接口 _CommandPtr接口 _RecordsetPtr接口 ADO接口简介
返回一个记录集或一个空指针。 通常使用它来创建一个数据连接或执行一条不返回任何结果的SQL语句,如一个存储过程。 一般不使用_ConnectionPtr接口返回一个记录集。 使用它创建一个数据连接,然后使用其它对象执行数据输入输出操作。 _ConnectionPtr接口
_CommandPtr接口返回一个记录集。 它提供了一种简单的方法来执行返回记录集的存储过程和SQL语句。 在使用时,连接数据库时有两种方法 在使用时可以利用全局全局_connectionPtr接口,也可以在_CommandPtr接口里直接使用连接串。如果频繁执行数据库操作最好使用_ConnectionPtr接口连接数据库。 _CommandPtr接口
_RecordsetPtr是一个记录集对象。与以上两种对象相比,它对记录集提供了更多的控制功能,如记录锁定,游标控制等 。 同_CommandPtr接口一样,它不一定要使用一个已经创建的数据连接,可以用一个连接串代替连接指针赋给_RecordsetPtr的connection成员变量,让它自己创建数据连接。如果频繁使用时最好还是用已经创建了数据连接的全局_ConnectionPtr接口 _RecordsetPtr接口
初始化COM库,引入ADO库定义文件 用Connection对象连接数据库 利用建立好的连接,通过Connection、Command对象执行SQL命令,或利用Recordset对象取得结果记录集进行查询、处理。 使用完毕后关闭连接释放对象。 使用ADO的基本流程
我们可以使用AfxOleInit()来初始化COM库这项工作通常在CWinApp::InitInstance()的重载函数中完成,请看如下代码: BOOL CADOTest1App::InitInstance() { //初始化OLE/COM AfxOleInit(); ...... } COM库的初始化
用#import指令引入ADO类型库 我们在预编译文件stdafx.h中加入如下语句: #import "c:\program files\common files\system\ado\msado15.dll" no_namespace rename("EOF","adoEOF") 其最终作用同我们熟悉的#include类似,编译的时候系统会为我们生成msado15.tlh,ado15.tli两个C++头文件来定义ADO库。 引入ADO类型库
创建Connection对象并连接数据库 在CWinApp中添加一个指向Connection对象的指针: _ConnectionPtr m_pConnection=null; 初始化定义的指针并连接数据库: HRESULT hr; try{ hr=m_pConnection.CreateInstance(__uuidof(Connection)); TESTHR(hr); } 创建Connection对象
创建了连接对象后,需要打开和数据源的连接 HRESULT Open (_bstr_t ConnectionString, _bstr_t UserID, _bstr_t Password, long Options ) ConnectionString:可选参数,为连接字串, UserID :可选参数,访问数据源的用户名Password :可选参数,用户访问数据源的口令Options :可选参数,次参数是ConnectionOptionalEnum类型的值,用来指明连接是同步还是异步连接。 Connectionstring连接字符串是由一系列关键字和值组成: DataSource:指定所使用的数据源名。 Provider:用于指定所使用的数据提供程序。 User:用户名 PassWord:用户口令 FileName:给出保存连接信息的提供程序说明文件名称。 打开连接
设置连接超时属性: 缺省情况下ADO在应用程序和数据源之间建立连接的等待时间为15秒。如果我们要求在建立连接时修改超时连接值,则需要在Open()函数调用前设置Connection对象的ConnectionTimeout属性,单位秒。 注意: ConnectionTimeout属性和CommandTimeout属性的不同,前者为建立连接的超时值,后者为连接建立后对数据库操作的超时值。 打开连接
连接访问模式: 通常我们需要通过应用程序限制用户对数据源的访问权限,这些可以通过调用OPEN函数之前设置连接的MODE属性来解决。 Mode值可以是下列值的组合:adModeUnknown: 没有确定模式 adModeRead: 只读权限 adModeWrite: 只写权限adModeReadWrite: 读写权限 adModeShareDenyRead: 阻止其它用户以读权限打开连接 adModeShareDenyWrite: 阻止其它用户以写权限打开连接 adModeShareExclusive: 阻止其它用户打开连接 adModeShareDenyNone: 阻止其他用户使用任何权限打开连接 连接访问模式
例子: HRESULT hr; _ConnectinPrt p_conn; hr=p_conn.CreateInstance(“ADODB.Connection”); p_conn->ConnectinoTimeout=90; p_conn->Mode=adModeReadWrite|adModeShareDenyNone; hr=p_conn->Open(“MytestDs”,”admin”,”1234”); 上面的程序中我们设定连接超时值为90秒,该数据源访问权限为只有用户admin可读写,对其他用户的任何连接请求都拒绝。 连接访问模式
关闭 当使用使用完数据库后,应该关闭连接,即调用Connection对象的Clouse方法,ADO在关闭连接的同时,也关闭所有使用这个连接的ADO对象,例如记录集对象(RecordSet)和命令对象(Command)以释放资源。 if(p_conn->State){ p_conn->Close(); p_conn=null;} pRst->Close(); pConn->Close(); pCmd.Release(); pRst.Release(); pConn.Release(); 关闭连接
通过JET数据库引擎对ACCESS2000数据库的连接 m_pConnection->Open("Provider= Microsoft.Jet.OLEDB.4.0;Data Source=C:\\test.mdb", "","",adModeUnknown); 通过DSN数据源对任何支持ODBC的数据库进行连接: m_pConnection->Open("Data Source=adotest; UID=sa;PWD=;","","",adModeUnknown); //m_pConnection->Open("DSN=test;","","",0); //连接叫作test的ODBC数据源 常用的数据库连接方法
不通过DSN对SQL SERVER数据库进行连接:m_pConnection->Open(不通过DSN对SQL SERVER数据库进行连接:m_pConnection->Open( “driver={SQL Server};Server=.; DATABASE=vckbase;UID=sa;PWD=139","","",adModeUnknown); 其中Server是SQL服务器的名称,DATABASE是库的名称 常用的数据库连接方法
用Connection对象的Execute方法执行SQL命令 : pRst=pConn->Execute("select * from authors",NULL,adCmdText); 执行SQL命令
利用 Command对象,执行SQL命令_CommandPtr pCmd(__uuidof(Command)); pCmd->ActiveConnection( _variant_t((IDispatch*)pConn)); pCmd->CommandText="select * from authors"; pRst=pCmd->Execute(NULL,NULL,adCmdText); 调用存储过程 pcom->ActiveConnection=pconn; pcom->commandtext=“demo”; pcom->Execute(Null,null,adCmdStoreProc); 执行SQL命令
直接用Recordset对象进行查询取得记录集 pRst->Open("select * from authors",_variant_t((IDispatch*)pConn), adOpenDynamic,adLockOptimistic,adCmdText); 执行SQL命令
操作结果集 用pRt->adoEOF来判断数据库指针是否已经移到结果集的末尾了。 用pRt->BOF判断是否在第一条记录前面 例子: while(!pRt->adoEOF){ var=pRt->GetCollect(“Name”); if(var.vt!=VT_NULL) strName=(LPCSTR)_bstr_t(var); var=pRt->GetCollect(“Age”); if(var.vt!=VT_NULL)strAge=(LPCSTR)_bstr_t(var); 操作结果集
pRt->MoveNext();} 取得一个字段的值的两种方法: 1. pRt->GetCollect(“Name”);或者pRt->GetCollect(_variant_t(Long(0)); 2. pRt->GetCollect(“Column_name”);或者pRt->GetCollect(long(index)); 利用结果集进行操作数据 1.添加 pRt->addNew(); pRt->PutCollect();给每个字段赋值 pRt->update(); 操作结果集
2.修改,删除 把记录指针移动到要删除的记录上,然后调用Delete(adAffectCurrent) try{//假设删除第二天记录 pRt->MoveFirst(); pRt->Move(1);//从0开始 pRt->Delete(adAffectCurrent); pRt->Update(); 操作结果集
用_CommandPtr和_RecordSetPtr配合 pcmd.createInstance(_uuidof(command)); pcmd->ActiveConnection=pconn; pcmd->CommandText=“select * from demot”; pRt=pcmd->Execute(Null,Null,adCmdText); 其中CommandText是命令字符串,通常是SQL命令 adCmdText:表明CommandText是文本命令 adCmdTable:表明CommandText是一个表名 adCodProc:表明CommandText是一个存储过程 adCmdUnKnow:未知 操作结果集
_variant_t 1.一般传递个ADO的对象的值都不是MFC直接支持的数据类型,而要用_variant_t转换一下。 2._variant_t var; _variant_t->long: (longt)var; _variant_t->Cstring: Cstring strval=(LPCSTR)_bstr_t(var); Cstring->_varint_t: _variant_t(strSql); 3.BSTR宽字符串与Cstring转换 BSTR bstr; Cstring strsql; _variant_t数据类型转换
Cstring->BSTR: bstr=strsql.AllocSysString(); BSTR->Cstring: strSql=(LPCSTR)bstr; 4 _bstr_t与Cstring相互转换 -bstr_t bstr; CString -> _bstr_t: bstr=(_bstr_t)strSql; _bstr_t->Cstring: strSql=(LPCSTR)bstr; _variant_t数据类型转换
事务 在数据库中,事务可以把多个操作作为一个单一的,最基本的活动来进行。 例如:同时更新几个表,除非在更新过程中所有操作都顺利完成,否则,如果其中一个更新失败,将会使数据库产生异常或者产生脏数据。通过事务处理就会避免这样的操作可能带来的不利影响。 开始事务处理,需要通过连接对象Connection的BeginTrans()方法,之后就额可以对事务中的数据源进行任何改变,如果在更改的过程中一起顺利,并想保存对数据库所作的所有更改,那么调用连接对象的CommitTrans()方法提交事务,否则调用RollbackTrans()回滚事务,系统将恢复从BeginTrans()开始后的任何改变 事务处理
例子 try{ //开始事务 pConn->BeginTrans(); //更新数据 prs->updateBatch(); //提交事务 pConn->CommitTrans(); }catch(_com_error &e) { dump_com_error(e);} catch(ADODB.Error &e) { pConn->Rollback(); } 事务处理
SQL(Structured Query Language)是关系型数据库的标准语言,是由国际标准组织提出的,各种关系型数据库都支持SQL指令,SQL Server在基本的SQL基础上进行了扩充,SQL语句有如下的两大特点: (1)SQL是一种类似于英语的语言,很容易理解和书写。 (2)SQL语言是非过程化的语言(第四代语言)。SQL语言包括DDL(Data Definition Language:数据定义语言),DML(Data Manipulation Language:数据操作语言)和DCL(Data Control Language:数据控制语言)等等。 SQL语言概述
基本的SQL语句包括DQL和DML。也就是对数据库最常用的四大基本操作:查询(Select)、插入(Insert)、更新(Update)和删除(Delete)。基本的SQL语句包括DQL和DML。也就是对数据库最常用的四大基本操作:查询(Select)、插入(Insert)、更新(Update)和删除(Delete)。 1. 基本句型一:(最简单的SELECT语句) SELECT 字段名 FROM 数据表 例1. SELECT * FROM grade 功能说明:将grade表中的所有字段取出来。 例2. SELECT 学号,姓名 FROM grade 功能说明:将grade表中学号和姓名字段取出来。 例3. SELECT学号,姓名,语文+数学+英语 as 总成绩 FROM grade 功能说明:将grade表中的学号和姓名取出来,并将语文、数学和英语成绩相加产生虚拟的总成绩。 基本SQL语句
2. 基本句型二:(使用条件查询) SELECT字段名 FROM数据表 WHERE 筛选条件 测试句型如下。 例1. SELECT * FROM grade WHERE数学>50 功能说明:把所有数学成绩大于50分的记录选出来。 例2. SELECT * FROM grade WHERE数学=300 or 语文=300 功能说明:把数学成绩等于300分或者语文成绩等于300分的人选出来。 例3. Like子句基本格式一:“_”匹配。 功能说明:每个下划线匹配一个任意字符,注意只匹配一个字符。比如:姓名 like '_敏',匹配姓名以“敏”字结尾且字数等于二的所有数据记录,如:“张敏”。 基本句型二
3. 基本句型三:(进行排序) SELECT字段名 FROM 数据表 ORDER BY 字段名 测试句型如下。 (1)SELECT * FROM grade ORDER BY数学 注:从低到高排序 功能说明:从grade表中取出所有字段,并按数学成绩排序。 (2)SELECT * FROM grade ORDER BY数学,语文 功能说明:从grade表中取出所有字段,并按数学成绩排序,如果数学成绩相同则按照语文成绩排序。 (3)SELECT * FROM grade ORDER BY数学 desc 注:从高到低排序 功能说明:从grade表中取出所有字段,并按数学成绩倒序。 (4)SELECT top 5 * FROM grade 功能说明:从grade表中取出前五条记录的所有字段。 基本句型三