1、-1-本章目标 理解关系数据库的概念 掌握常用的SQL语句的使用 掌握利用ADO对象进行数据库应用程序编程的方法数据库基础知识数据库基本概念 数据库是数据的集合,常见的关系型数据库由一个或多个表组成,每一个表中都存储了一组(或一类对象的)数据描述。可以在表中定义主键,主键的作用如下:p 保证实体的完整性;p 加快数据库的操作速度;p 在表中添加新记录时,数据库系统自动检查新纪录的主键值,不允许该值与其他记录的主键值重复。的主键值重复。-2-数据库基础知识数据库管理系统 数据库管理系统(简称DBMS)是指数据库系统中对数据进行管理的软件系统,它是数据库系统的核心组成部分。例如Access、Sys
2、base、Oracle和SQL Server等都是DBMS。DBMS的主要目标是使数据作为一种可管理的资源来处理,使数据易于为各种不同的用户所共享,并增进数据的安全性、完整性,同时提供高度的数据独立性。在DBMS中,游标是一个十分重要的概念。从用户的角度看,游标总是与一条SQL语句相关联,游标由结果集和结果集中指向特定记录的位置组成。-3-数据库基础知识结构化查询语言 依据SQL的执行功能,可以将SQL分为以下几部分:p 数据定义语言(DDL):用于创建、修改或删除数据库对象,如表、视图、模式、触发器和存储过程等。相关的主要SQL关键字包括CREATE、ALTER和DROP。p 数据查询语言(
3、DQL):用于数据检索查询。相关的主要SQL关键字如SELECT。p 数据操纵语言(DML):用于添加、修改或删除存储在数据库中的数据。相关的SQL关键字包括INSERT、UPDATE和DELECT。p 数据控制语言(DCL):控制访问数据库中特定对象的用户,还可以控制用户的数据库的访问类型。相关的SQL关键字包括GRANT、DENY和REVOKE。p 其他语言要素:SQL还包括一些其他要素(如事务控制等)。-4-数据库基础知识结构化查询语言 主要的SQL语句:种类种类语句语句功能功能数据定义CREATE TABLE创建一个数据库表ALTER TABLE修改数据库表结构DROP TABLE从数
4、据库中删除表数据查询SELECT从数据库中检索数据行和列数据操纵INSERT向数据库表中添加新数据行UPDATE更新数据库表中的数据DELECT从数据库表中删除数据行事务控制COMMIT结束当前事务ROLLBACK回滚当前事务SET TRANSACTION定义当前事务数据访问特征-5-数据库基础知识结构化查询语言 数据库中常用的数据类型:数据类型数据类型说明说明Char(Size)固定长度的字符串型,Size指定字符数,一般不能超过255Int(或Interger)32位整数Real32位浮点数DATA日期型数据,使用10个字符保存4位的年、2位的月和2位的日期,例如2011-10-18TIM
5、E时间型数据,时、分、秒,分别是2位数。TIMESTAMP既包括日期也包括时间BINARY定长二进制数据,最大长度要根据具体的DBMS的定义VARBINARY 可变长二进制数据,最大长度要根据具体的DBMS的定义-6-数据库基础知识数据库访问技术 为了降低开发数据库应用程序的难度,微软推出了一些标准的访问DBMS的技术。这些技术包括ODBC、DAO、OLE DB、ADO等。以上几种技术中,DAO已经很少使用了;ODBC是基于C语言的;ADO比较新,而且支持自动化,所以使用的比较多。微软已经基本停止对ODBC和DAO的继续发展,大力推荐使用ADO-7-ADO数据库编程ADO技术 ADO中和数据库
6、操作相关的对象主要有三个核心对象:p 连接对象(Connection):管理应用程序和数据库之间的通信。在数据库应用程序里操作数据库都必须通过该对象。该对象代表了与数据库的一个会话,在客户/服务器模式下,这个会话相当于与服务器的一次网络连接。p 命令对象(Command):该对象是一个对数据库执行命令的定义。可以执行一个批量的数据操作,例如可以用来查询数据库并返回一个Recorset对象。p 记录集对象(Recordset):如果执行的命令是一个查询并返回存放在表中的结果集,这些结果集将保存在一个Recordset对象中。通过Recordset对象可以操纵来自数据提供者的数据,包括修改、更新行
7、、插入和删除行。-8-ADO数据库编程ADO技术 ADO编程步骤:导入ADO库。初始化OLE/COM库。利用Connection对象连接数据库。利用建立好的连接,通过Connection、Command对象执行SQL命令,或利用Recordset对象取得结果集进行查询和处理。使用完毕后关闭连接,释放相应对象。-9-ADO数据库编程ADO技术 _variant_t数据类型:p 在COM库中经常使用到_variant_t类型。该类型是一个继承自结构体tagVARIANT的类类型,tagVARIANT结构体其实是一个多种数据类型的联合。从编程角度看,_tagVARIANT结构体是一种万能数据类型,可
8、以用来存储各种类型的数据成语成语说明说明vt该值与VT_NULL相比较,可以判断变量是否为空bstrVal存储BSTR型数据cVal存储CHAR型数据boolVal存储布尔型数据intVal存储的是整形数据dblVal存储的是double型数据-10-ADO数据库编程ADO技术 _bstr_t数据类型:p _bstr_t是一个COM库中的类,其封装了BSTR数据类型,而BSTR是COM库中用来表示UNICODE编码的字符串。/程序员可以直接将字符指针赋值给_bstr_t类型的数值,例如:_bstr_t sUserName=_T(“123456”);-11-ADO数据库编程ADO技术 ADO异常
9、处理:p 操作数据库时,经常出现一些意外的错误,例如执行SQL语句错误、数据库连接意外断开等。COM库提供了一个异常类型_com_error,其ErrorMessage()成员函数可以获得异常信息。通常使用C+的try.catch块捕获此种类型的异常错误/典型的异常处理语句如下:try./数据库操作catch(_com_error)AfxMessageBox(e.ErrorMessage();-12-ADO数据库编程导入ADO库 直接用导入符号#import导入ADO库文件,示例代码如下:#import C:Program FilesCommon FilesSystemadomsado15.d
10、ll no_namespace rename(EOF,adoEOF)而后,一般在应用程序类的InitInstance()成员函数里,初始化OLE/COM库:BOOL CadoTestApp:InitInstance()if(!AfxOleInit()AfxMessageBox(_T(初始化OLE失败!);return FALSE;.-13-ADO数据库编程连接数据库1 创建连接对象实例p 先在类定义的头文件中声明_ConectionPtr对象指针作为类的数据成员p 而后在类的成员函数中,调用连接对象的CreateInstance()成员函数创建连接对象实例/类头文件protected:_Con
11、nectionPtr m_pConnection;/类实现文件HRESULT hr=m_pConnection.CreateInstance(_uuidof(Connection);if(!SUCCEEDED(hr)AfxMessageBox(_T(创建连接对象实例失败!);-14-ADO数据库编程连接数据库2 连接数据库 p 调用其Open()成员函数连接数据库/连接数据库的示例代码如下 hr=m_pConnection-Open(_T(Provider=Microsoft.Jet.OLEDB.4.0;Data Source=C:Employee.mdb),_T(),_T(),adModeU
12、nknown);if(!SUCCEEDED(hr)AfxMessageBox(_T(连接到数据库失败!);-15-ADO数据库编程连接数据库3 执行SQL语句p 调用连接对象的Execute()函数可以执行SQL语句,该函数的原型如下 _RecordsetPtr Execute(_bstr_t CommandText,/要执行的文本命令,如SQL语句、表名VARIANT*RecordsAffected,/执行命令后的返回值long Options);/要执行命令的类型,含义见下表常量值常量值说明说明adCmdText表示执行SQL语句adCmdTable表示通过数据库中定义的表名来获取记录集a
13、dCmdStoreProc表示调用数据中定义的存储过程adCmdUnknown未知记录类型-16-ADO数据库编程执行ADO对象命令1 创建命令对象实例p 首先在类的定义文件中声明命令对象指针p 而后,在类的成员函数中,调用CreateInstance()成员函数创建命令对象实例/类头文件protected:_CommandPtr m_pCommand;/类实现文件HRESULT hr=m_pCommand.CreateInstance(_uuidof(Command);if(!SUCCEEDED(hr)AfxMessageBox(_T(创建命令对象实例失败!);-17-ADO数据库编程执行A
14、DO对象命令2 设置ActiveConnection属性 p 将命令对象属性中的ActiveConnection设置为已有的连接对象指针 m_pCommand-ActiveConnection=m_pConnection;-18-ADO数据库编程执行ADO对象命令3 执行SQL语句 p 通过连接对象的CommandText属性指定要执行的SQL语句,而后调用Execute()成员函数执行命令trym_pCommand-CommandText=_T(SELECT*FROM BasicInfo);_RecordsetPtr rs=m_pCommand-Execute(NULL,NULL,adCmd
15、Text);catch(_com_error)AfxMessageBox(e.ErrorMessage();-19-ADO数据库编程Recordset对象1 记录集RecordSet对象封装了对查询结果的操作,通过Recordset对象可以操纵来自数据提供者的数据,包括p 修改p 更新行p 插入p 删除行-20-ADO数据库编程Recordset对象2 获取记录集对象p 先声明记录集对象指针,而后调用CreateInstance()成员函数创建实例,然后调用其Open()成员函数打开记录集。/下述代码,演示了创建记录集对象实例,并打开记录集的过程。_RecordsetPtr rs;rs.Cre
16、ateInstance(_uuidof(Recordset);rs-Open(_T(SELECT*FROM BasicInfo),m_pConnection.GetInterfacePtr(),adOpenDynamic,adLockOptimistic,adCmdText);-21-ADO数据库编程Recordset对象3 关于记录集对象p 从Open()函数的功能可以看出,RecordSet对象功能强大:若其第一个参数传递SQL语句,Recordset对象同COmmand对象一样也可以执行SQL数据操作;p 若第二个参数传递连接信息字符串,Recorset对象同Connection对象一样
17、可以打开数据库。p 因此,在简单的数据库应用程序可以中可以只用一个Recordset对象,但在实际的编程中,经常用一个Connection对象维护和数据库的唯一连接,然后用一个或多个Recordset对象执行SQL数据操作,这样实现使程序更易维护。-22-ADO数据库编程Recordset对象4 获取记录集的特性支持p 并不是所有的驱动程序和记录集类型都支持记录集的所有特性。为了避免应用程序出现异常,可以先调用记录集对象的Supports()函数,判定记录集支持什么样的属性和方法。/典型用法如下:if(rs-Supports(adMovePrevious)rs-MovePrevious();e
18、lseAfxMessageBox(_T(记录集不支持向上移动记录指针!);-23-ADO数据库编程Recordset对象5 遍历记录函数函数功能描述功能描述MoveFirst()移动到第一条记录MoveLast()移动到最后一条记录MoveNext()移动到下一条记录MovePrev()移动到前一条记录-24-ADO数据库编程Recordset对象 访问记录中的数据/访问记录中的数据字段可以采用如下方式,其中index是字段的索引值:rs-GetFields()-GetItem(index)-Value;rs-Fileds-Item(index)-Value;/更简单的方法是:rs-GetCo
19、llect(字段名);/典型的获取字段内容的代码如下:_variant_t vValue;vValue =m_pRecordset-GetCollect(_T(工号);If(vValue.vt!=VT_NULL)CString str=vValue.bstrVal;.-25-ADO数据库编程Recordset对象 编辑记录,需要经过以下三个步骤:p 移动记录指针到要编辑的记录。p 调用PutCollect()函数修改字段内容。p 调用Update()函数更新记录。/典型的编辑记录的示例代码如下:/假设已经将记录移动到要修改的位置rs-PutCollect(_T(工号),_variant_t(_
20、T(012);rs-PutCollect(_T(职称),_variant_t(_T(中级);rs-Update();-26-ADO数据库编程Recordset对象 添加记录,需要经过以下三个步骤:p 调用AddNew()函数。p 调用PutCollect()函数设置记录各字段的值。p 调用Update()函数更新记录/典型的添加记录的示例代码如下rs-AddNew();rs-PutCollect(_T(工号),_variant_t(_T(013);rs-PutCollect(_T(职称),_variant_t(_T(高级);.rs-Update();-27-ADO数据库编程Recordset对
21、象 删除记录p 调用Delete()函数即可删除记录。该函数的原型如下:HRESULT Delete(enum AffectEnum AffectRecords);参数AffectRecords用于指定删除的记录行,可取的常数如下:p adAffectCurrent:默认值,只删除当前记录。p adAffectGroup:删除满足当前过滤器的所有记录。-28-小结 ADO是应用程序与数据库通信的一种COM技术 ADO对象模型的核心对象有:Connection、Command、Recordset MFC中ADO编程的过程是:导入ADO、创建Connection对象、打开数据源、执行SQL命令、使用结果集、终止连接 ADO中的命令对象(Command)可用来执行SQL,执行结果返回到记录集对象(Recordset)在实际的编程中,经常用一个Connection对象维护和数据库的唯一连接,然后用一个或多个Recordset对象执行SQL数据操作-29-谢 谢 Thanks for listening.