(高等教育)数据库系统概论第五版教学课件:第8章.ppt

上传人(卖家):小豆芽 文档编号:1182381 上传时间:2021-03-17 格式:PPT 页数:139 大小:479KB
下载 相关 举报
(高等教育)数据库系统概论第五版教学课件:第8章.ppt_第1页
第1页 / 共139页
(高等教育)数据库系统概论第五版教学课件:第8章.ppt_第2页
第2页 / 共139页
(高等教育)数据库系统概论第五版教学课件:第8章.ppt_第3页
第3页 / 共139页
(高等教育)数据库系统概论第五版教学课件:第8章.ppt_第4页
第4页 / 共139页
(高等教育)数据库系统概论第五版教学课件:第8章.ppt_第5页
第5页 / 共139页
点击查看更多>>
资源描述

1、数据库系统概论 An Introduction to Database System 第八章第八章 数据库编程数据库编程 第八章 数据库编程 8.1 嵌入式SQL 8.2 过程化SQL 8.3 存储过程和函数 8.4 ODBC编程 *8.5 OLE DB *8.6 JDBC编程 8.7 小结 8.1 嵌入式SQL SQL语言提供了两种不同的使用方式 交互式 嵌入式 为什么要引入嵌入式SQL SQL语言是非过程性语言 事务处理应用需要高级语言 这两种方式细节上有差别,在程序设计的环境下,SQL语句要做某些 必要的扩充 8.1 嵌入式SQL 8.1.1 嵌入式SQL的处理过程 8.1.2 嵌入式S

2、QL语句与主语言之间的通信 8.1.3 不用游标的SQL语句 8.1.4 使用游标的SQL语句 8.1.5 动态SQL 8.1.1 嵌入式SQL的处理过程 主语言 嵌入式SQL是将SQL语句嵌入程序设计语言中,被嵌入的程序设计语言,如C、 C+、Java,称为宿主语言,简称主语言。 处理过程 预编译方法 嵌入式SQL的处理过程(续) 关系数据库管理系统预处关系数据库管理系统预处 理程序转换嵌入式理程序转换嵌入式SQL语语 句为函数调用句为函数调用 含嵌入式含嵌入式SQL语句语句 的主语言程序的主语言程序 转换后的转换后的 主语言程序主语言程序 主语言编译程序主语言编译程序 编译处理编译处理 目

3、标语言程序目标语言程序 嵌入式SQL的处理过程(续) 为了区分SQL语句与主语言语句,所有SQL语句必须加前缀EXEC SQL, 主语言为C语言时,语句格式: EXEC SQL ; 8.1 嵌入式SQL 8.1.1 嵌入式SQL的处理过程 8.1.2 嵌入式SQL语句与主语言之间的通信 8.1.3 不用游标的SQL语句 8.1.4 使用游标的SQL语句 8.1.5 动态SQL 8.1.2 嵌入式SQL语句与主语言之间的通信 将SQL嵌入到高级语言中混合编程,程序中会含有两种不同计算模 型的语句 SQL语句 描述性的面向集合的语句 负责操纵数据库 高级语言语句 过程性的面向记录的语句 负责控制逻

4、辑流程 它们之间应该如何通信? 嵌入式SQL语句与主语言之间的通信(续) 数据库工作单元与源程序工作单元之间的通信 (1)向主语言传递SQL语句的执行状态信息,使主语言能够据此控制程序流 程,主要用SQL通信区实现 (2)主语言向SQL语句提供参数,主要用主变量实现 (3)将SQL语句查询数据库的结果交主语言处理,主要用主变量和游标实现 1. SQL通信区 SQLCA: SQL Communication Area SQLCA是一个数据结构 SQLCA的用途 SQL语句执行后,系统反馈给应用程序信息 描述系统当前工作状态 描述运行环境 这些信息将送到SQL通信区中 应用程序从SQL通信区中取出

5、这些状态信息,据此决定接下来执行的语句 SQL通信区(续) SQLCA使用方法 定义SQLCA 用EXEC SQL INCLUDE SQLCA定义 使用SQLCA SQLCA中有一个存放每次执行SQL语句后返回代码的变量SQLCODE 如果SQLCODE等于预定义的常量SUCCESS,则表示SQL语句成功,否则表示出错 应用程序每执行完一条SQL 语句之后都应该测试一下SQLCODE的值,以了解该SQL语句 执行情况并做相应处理 2. 主变量 主变量 嵌入式SQL语句中可以使用主语言的程序变量来输入或输出数据 在SQL语句中使用的主语言程序变量简称为主变量 (Host Variable) 主变

6、量(续) 主变量的类型 输入主变量 由应用程序对其赋值,SQL语句引用 输出主变量 由SQL语句对其赋值或设置状态信息,返回给应用程序 主变量(续) 指示变量 是一个整型变量,用来“指示”所指主变量的值或条件 一个主变量可以附带一个指示变量(Indicator Variable) 指示变量的用途 指示输入主变量是否为空值 检测输出变量是否为空值,值是否被截断 主变量(续) 在SQL语句中使用主变量和指示变量的方法 说明主变量和指示变量 BEGIN DECLARE SECTION . . (说明主变量和指示变量) . END DECLARE SECTION 主变量(续) 在SQL语句中使用主变量

7、和指示变量的方法(续) 使用主变量 说明之后的主变量可以在SQL语句中任何一个能够使用表达式的地方出现 为了与数据库对象名(表名、视图名、列名等)区别,SQL语句中的主变量名前要加冒号 (:)作为标志 使用指示变量 指示变量前也必须加冒号标志 必须紧跟在所指主变量之后 主变量(续) 在SQL语句之外(主语言语句中)使用主变量和指示变量的方法 可以直接引用,不必加冒号 3. 游标 为什么要使用游标 SQL语言与主语言具有不同数据处理方式 SQL语言是面向集合的,一条SQL语句原则上可以产生或处理多条记录 主语言是面向记录的,一组主变量一次只能存放一条记录 仅使用主变量并不能完全满足SQL语句向应

8、用程序输出数据的要求 嵌入式SQL引入了游标的概念,用来协调这两种不同的处理方式 游标(续) 游标 游标是系统为用户开设的一个数据缓冲区,存放SQL语句的执行结果 每个游标区都有一个名字 用户可以用SQL语句逐一从游标中获取记录,并赋给主变量,交由主语言进 一步处理 4. 建立和关闭数据库连接 (1)建立数据库连接 EXEC SQL CONNECT TO targetAS connection-nameUSER user- name; target是要连接的数据库服务器 常见的服务器标识串,如: 包含服务器标识的SQL串常量 DEFAULT 建立和关闭数据库连接(续) connect-name

9、是可选的连接名,连接名必须是一个有效的标识符 在整个程序内只有一个连接时可以不指定连接名 程序运行过程中可以修改当前连接 EXEC SQL SET CONNECTION connection-name |DEFAULT; 建立和关闭数据库连接(续) (2)关闭数据库连接 EXEC SQL DISCONNECT connection; 5. 程序实例 例8.1 依次检查某个系的学生记录,交互式更新某些学生年龄。 EXEC SQL BEGIN DECLARE SECTION; /*主变量说明开始*/ char Deptname20; char Hsno9; char Hsname20; char

10、Hssex2; int HSage; int NEWAGE; EXEC SQL END DECLARE SECTION; /*主变量说明结束*/ long SQLCODE; EXEC SQL INCLUDE SQLCA; /*定义SQL通信区*/ 程序实例(续) int main(void) /*C语言主程序开始*/ int count = 0; char yn; /*变量yn代表yes或no*/ printf(Please choose the department name(CS/MA/IS): ); scanf(%s,deptname); /*为主变量deptname赋值*/ EXEC

11、SQL CONNECT TO TESTlocalhost:54321 USER SYSTEM/MANAGER; /*连接数据库TEST*/ EXEC SQL DECLARE SX CURSOR FOR /*定义游标SX*/ SELECT Sno,Sname,Ssex,Sage /*SX对应的语句*/ FROM Student WHERE SDept = :deptname; EXEC SQL OPEN SX; /*打开游标SX,指向查询结果的第一行*/ 程序实例(续) for ( ; ; ) /*用循环结构逐条处理结果集中的记录*/ EXEC SQL FETCH SX INTO :HSno,:

12、Hsname,:HSsex,:HSage; /*推进游标,将当前数据放入主变量*/ if (SQLCA.SQLCODE!= 0) /*SQLCODE != 0,表示操作不成功*/ break; /*利用SQLCA中的状态信息决定何时退出循环*/ if(count+ = 0) /*如果是第一行的话,先打出行头*/ printf(n%-10s %-20s %-10s %-10sn, Sno“,Sname“,Ssex, Sage); printf(%-10s %-20s %-10s %-10dn“, HSno,Hsname,Hssex,HSage); /*打印查询结果*/ printf(“UPDAT

13、E AGE(y/n)?”); /*询问用户是否要更新该学生的年龄*/ doscanf(%c, while(yn != N 程序实例(续) if (yn = y | yn = Y) /*如果选择更新操作*/ printf(INPUT NEW AGE:); scanf(%d, /*用户输入新年龄到主变量中*/ EXEC SQL UPDATE Student /*嵌入式SQL更新语句*/ SET Sage = :NEWAGE WHERE CURRENT OF SX; /*对当前游标指向的学生年龄进行更新*/ EXEC SQL CLOSE SX; /*关闭游标SX,不再和查询结果对应*/ EXEC S

14、QL COMMIT WORK; /*提交更新*/ EXEC SQL DISCONNECT TEST; /*断开数据库连接*/ 8.1 嵌入式SQL 8.1.1 嵌入式SQL的处理过程 8.1.2 嵌入式SQL语句与主语言之间的通信 8.1.3 不用游标的SQL语句 8.1.4 使用游标的SQL语句 8.1.5 动态SQL 8.1.3 不用游标的SQL语句 不用游标的SQL语句的种类 说明性语句 数据定义语句 数据控制语句 查询结果为单记录的SELECT语句 非CURRENT形式的增删改语句 不用游标的SQL语句(续) 1. 查询结果为单记录的SELECT语句 2. 非CURRENT形式的增删改

15、语句 1. 查询结果为单记录的SELECT语句 这类语句不需要使用游标,只需用INTO子句指定存放查询结果的主 变量。 例8.2 根据学生号码查询学生信息。 EXEC SQL SELECT Sno,Sname,Ssex,Sage,Sdept INTO:Hsno,:Hname,:Hsex,:Hage,:Hdept FROM Student WHERE Sno=:givensno; /*把要查询的学生的学号赋给为了主变量givensno*/ 查询结果为单记录的SELECT语句(续) INTO子句、WHERE子句和HAVING短语的条件表达式中均可以使 用主变量 查询返回的记录中,可能某些列为空值N

16、ULL 如果查询结果实际上并不是单条记录,而是多条记录,则程序出 错,关系数据库管理系统会在SQLCA中返回错误信息 查询结果为单记录的SELECT语句(续) 例8.3 查询某个学生选修某门课程的成绩。假设已经把将要查询的 学生的学号赋给了主变量givensno,将课程号赋给了主变量givencno。 EXEC SQL SELECT Sno,Cno,Grade INTO :Hsno,:Hcno,:Hgrade:Gradeid /*指示变量Gradeid*/ FROM SC WHERE Sno=:givensno AND Cno=:givencno; 如果Gradeid 0,不论Hgrade为何

17、值,均认为该学生成绩为 空值。 2. 非CURRENT形式的增删改语句 在UPDATE的SET子句和WHERE子句中可以使用主变量,SET子句还可以 使用指示变量 例8.4 修改某个学生选修1号课程的成绩。 EXEC SQL UPDATE SC SET Grade=:newgrade /*修改的成绩已赋给主变量:newgrade*/ WHERE Sno=:givensno; /*学号赋给主变量:givensno*/ 非CURRENT形式的增删改语句(续) 例8.5 某个学生新选修了某门课程,将有关记录插入SC表中。假设 插入的学号已赋给主变量stdno,课程号已赋给主变量couno。 grad

18、eid=-1; /*gradeid为指示变量,赋为负值*/ EXEC SQL INSERT INTO SC(Sno,Cno,Grade) VALUES(:stdno,:couno,:gr :gradeid); /*:stdno,:couno,:gr为主变量*/ 由于该学生刚选修课程,成绩应为空,所以要把指示变量 赋为负值 8.1 嵌入式SQL 8.1.1 嵌入式SQL的处理过程 8.1.2 嵌入式SQL语句与主语言之间的通信 8.1.3 不用游标的SQL语句 8.1.4 使用游标的SQL语句 8.1.5 动态SQL 8.1.4 使用游标的SQL语句 必须使用游标的SQL语句 查询结果为多条记录

19、的SELECT语句 CURRENT形式的UPDATE语句 CURRENT形式的DELETE语句 使用游标的SQL语句(续) 1. 查询结果为多条记录的SELECT语句 2. CURRENT形式的UPDATE和DELETE语句 1. 查询结果为多条记录的SELECT语句 使用游标的步骤 (1)说明游标 (2)打开游标 (3)推进游标指针并取当前记录 (4)关闭游标 (1)说明游标 使用DECLARE语句 语句格式 EXEC SQL DECLARE CURSOR FOR ; 功能 是一条说明性语句,这时关系数据库管理系统并不执行SELECT语句 (2)打开游标 使用OPEN语句 语句格式 EXEC

20、 SQL OPEN ; 功能 打开游标实际上是执行相应的SELECT语句,把查询结果取到缓冲区中 这时游标处于活动状态,指针指向查询结果集中的第一条记录 (3)推进游标指针并取当前记录 使用FETCH语句 语句格式 EXEC SQL FETCH INTO ,.; 功能 指定方向推动游标指针,同时将缓冲区中的当前记录取出来送至主变量供 主语言进一步处理 (4)关闭游标 使用CLOSE语句 语句格式 EXEC SQL CLOSE ; 功能 关闭游标,释放结果集占用的缓冲区及其他资源 说明 游标被关闭后,就不再和原来的查询结果集相联系 被关闭的游标可以再次被打开,与新的查询结果相联系 2. CURR

21、ENT形式的UPDATE语句和DELETE语句 CURRENT形式的UPDATE语句和DELETE语句的用途 非CURRENT形式的UPDATE语句和DELETE语句 面向集合的操作 一次修改或删除所有满足条件的记录 CURRENT形式的UPDATE语句和DELETE语句(续) CURRENT形式的UPDATE语句和DELETE语句的用途(续) 如果只想修改或删除其中某个记录 用带游标的SELECT语句查出所有满足条件的记录 从中进一步找出要修改或删除的记录 用CURRENT形式的UPDATE语句和DELETE语句修改或删除之 UPDATE语句和DELETE语句中要用子句 WHERE CURR

22、ENT OF 表示修改或删除的是最近一次取出的记录,即游标指针指向的记录 CURRENT形式的UPDATE语句和DELETE语句(续) 不能使用CURRENT形式的UPDATE语句和DELETE语句 当游标定义中的SELECT语句带有UNION或ORDER BY子句 该SELECT语句相当于定义了一个不可更新的视图 8.1 嵌入式SQL 8.1.1 嵌入式SQL的处理过程 8.1.2 嵌入式SQL语句与主语言之间的通信 8.1.3 不用游标的SQL语句 8.1.4 使用游标的SQL语句 8.1.5 动态SQL 8.1.5 动态SQL 静态嵌入式SQL 静态嵌入式SQL语句能够满足一般要求 无法

23、满足要到执行时才能够确定要提交的SQL语句、查询的条件 动态嵌入式SQL 允许在程序运行过程中临时“组装”SQL语句 支持动态组装SQL语句和动态参数两种形式 动态SQL(续) 1. 使用SQL语句主变量 2. 动态参数 3. 执行准备好的语句(EXECUTE) 1. 使用SQL语句主变量 SQL语句主变量 程序主变量包含的内容是SQL语句的内容,而不是原来保存数据的输入或输 出变量 SQL语句主变量在程序执行期间可以设定不同的SQL语句,然后立即执行 使用SQL语句主变量(续) 例8.6 创建基本表TEST。 EXEC SQL BEGIN DECLARE SECTION; const cha

24、r *stmt=CREATE TABLE test(a int); /*SQL语句主变量,内容是创建表的SQL语句*/ EXEC SQL END DECLARE SECTION; . EXEC SQL EXECUTE IMMEDIATE :stmt; /*执行动态SQL语句*/ 2. 动态参数 动态参数 SQL语句中的可变元素 使用参数符号(?)表示该位置的数据在运行时设定 和主变量的区别 动态参数的输入不是编译时完成绑定 而是通过 PREPARE语句准备主变量和执行语句EXECUTE绑定数据或主变量来 完成 动态参数(续) 使用动态参数的步骤 (1)声明SQL语句主变量 (2)准备SQL语句

25、(PREPARE) EXEC SQL PREPARE FROM ; 3. 执行准备好的语句(EXECUTE) EXEC SQL EXECUTE INTO USING ; 执行准备好的语句(EXECUTE)(续) 例8.7 向TEST中插入元组。 EXEC SQL BEGIN DECLARE SECTION; const char *stmt = INSERT INTO test VALUES(?); /*声明SQL主变量内容是INSERT语句 */ EXEC SQL END DECLARE SECTION; . EXEC SQL PREPARE mystmt FROM :stmt; /*准备语

26、句*/ . EXEC SQL EXECUTE mystmt USING 100; /*执行语句,设定INSERT语句插入值100 */ EXEC SQL EXECUTE mystmt USING 200; /* 执行语句,设定INSERT语句插入值200 */ 第八章 数据库编程 8.1 嵌入式SQL 8.2 过程化SQL 8.3 存储过程和函数 8.4 ODBC编程 *8.5 OLE DB *8.6 JDBC编程 8.7 小结 8.2 过程化SQL 8.2.1 过程化SQL的块结构 8.2.2 变量和常量的定义 8.2.3 流程控制 8.2.1 过程化SQL的块结构 过程化SQL SQL的扩

27、展 增加了过程化语句功能 基本结构是块 块之间可以互相嵌套 每个块完成一个逻辑操作 过程化SQL的块结构(续) 过程化SQL块的基本结构 1. 定义部分 DECLARE 变量、常量、游标、异常等 定义的变量、常量等只能在该基本块中使用 当基本块执行结束时,定义就不再存在 过程化SQL的块结构(续) 过程化SQL块的基本结构(续) 2. 执行部分 BEGIN SQL语句、过程化SQL的流程控制语句 EXCEPTION 异常处理部分 END; 8.2 过程化SQL 8.2.1 过程化SQL的块结构 8.2.2 变量和常量的定义 8.2.3 流程控制 8.2.2 变量和常量的定义 1. 变量定义 变

28、量名 数据类型 NOT NULL:=初值表达式或 变量名 数据类型 NOT NULL 初值表达式 2. 常量定义 常量名 数据类型 CONSTANT :=常量表达式 常量必须要给一个值,并且该值在存在期间或常量的作用域内不能改变。 如果试图修改它,过程化SQL将返回一个异常 3. 赋值语句 变量名称 :=表达式 8.2 过程化SQL 8.2.1 过程化SQL的块结构 8.2.2 变量和常量的定义 8.2.3 流程控制 8.2.3 流程控制 过程化SQL功能 1. 条件控制语句 2. 循环控制语句 3. 错误处理 流程控制(续) 1. 条件控制语句 IF-THEN,IF-THEN-ELSE和嵌套

29、的IF语句 (1)IF condition THEN Sequence_of_statements; END IF; (2)IF condition THEN Sequence_of_statements1; ELSE Sequence_of_statements2; END IF; (3)在THEN和ELSE子句中还可以再包含IF语句,即IF语句可以嵌套 流程控制(续) 2. 循环控制语句 LOOP,WHILE-LOOP和FOR-LOOP (1)简单的循环语句LOOP LOOP Sequence_of_statements; END LOOP; 多数数据库服务器的过程化SQL都提供EXIT、

30、BREAK或 LEAVE等循环结束语句,保证LOOP语句块能够结束 流程控制(续) 2. 循环控制语句(续) (2)WHILE-LOOP WHILE condition LOOP Sequence_of_statements; END LOOP; 每次执行循环体语句之前,首先对条件进行求值 如果条件为真,则执行循环体内的语句序列 如果条件为假,则跳过循环并把控制传递给下一个语句 流程控制(续) 2. 循环控制语句(续) (3)FOR-LOOP FOR count IN *REVERSE+ bound1 bound2 LOOP Sequence_of_statements; END LOOP;

31、流程控制(续) 3. 错误处理 如果过程化SQL在执行时出现异常,则应该让程序在产生异常的语句处停下 来,根据异常的类型去执行异常处理语句 SQL标准对数据库服务器提供什么样的异常处理做出了建议,要求过程化 SQL管理器提供完善的异常处理机制 第八章 数据库编程 8.1 嵌入式SQL 8.2 过程化SQL 8.3 存储过程和函数 8.4 ODBC编程 *8.5 OLE DB *8.6 JDBC编程 8.7 小结 8.3 存储过程和函数 8.3.1 存储过程 8.3.2 函数 *8.3.3 过程化SQL中的游标 8.3.1 存储过程 过程化SQL块类型 命名块 编译后保存在数据库中,可以被反复调

32、用,运行速度较快,过程和函数是命名块 匿名块 每次执行时都要进行编译,它不能被存储到数据库中,也不能在其他过程化SQL块中调 用 存储过程(续) 1. 存储过程的优点 2. 存储过程的用户接口 存储过程(续) 存储过程:由过程化SQL语句书写的过程,经编译和优化后存储在 数据库服务器中,使用时只要调用即可。 存储过程的优点 (1)运行效率高 (2)降低了客户机和服务器之间的通信量 (3)方便实施企业规则 存储过程(续) 存储过程的用户接口 (1)创建存储过程 (2)执行存储过程 (3)修改存储过程 (4)删除存储过程 2. 存储过程的用户接口 (1)创建存储过程 CREATE OR REPLA

33、CE PROCEDURE 过程名(参数1,参数2,.) AS ; 过程名:数据库服务器合法的对象标识 参数列表:用名字来标识调用时给出的参数值,必须指定值的数据类型。 参数也可以定义输入参数、输出参数或输入/输出参数,默认为输入参数 过程体:是一个,包括声明部分和可执行语句部分 存储过程的用户接口(续) 例8.8 利用存储过程来实现下面的应用:从账户1转指定数额 的款项到账户2中。 CREATE OR REPLACE PROCEDURE TRANSFER(inAccount INT,outAccount INT,amount FLOAT) /*定义存储过程TRANSFER,其参数为转入账户、转

34、出账户、转账额度*/ AS DECLARE /*定义变量*/ totalDepositOut Float; totalDepositIn Float; inAccountnum INT; 存储过程的用户接口(续) BEGIN /*检查转出账户的余额 */ SELECT Total INTO totalDepositOut FROM Accout WHERE accountnum=outAccount; IF totalDepositOut IS NULL THEN /*如果转出账户不存在或账户中没有存款*/ ROLLBACK; /*回滚事务*/ RETURN; END IF; 存储过程的用户接

35、口(续) IF totalDeposit Out amount THEN /*如果账户存款不足*/ ROLLBACK; /*回滚事务*/ RETURN; END IF; SELECT Accountnum INTO inAccountnum FROM Account WHERE accountnum=inAccount; IF inAccount IS NULL THEN /*如果转入账户不存在*/ ROLLBACK; /*回滚事务*/ RETURN; ENDIF; 存储过程的用户接口(续) UPDATE Account SET total=total-amount WHERE account

36、num=outAccount; /* 修改转出账户余额,减去转出额 */ UPDATE Account SET total=total + amount WHERE accountnum=inAccount; /* 修改转入账户余额,增加转入额 */ COMMIT; /* 提交转账事务 */ END; 存储过程的用户接口(续) (2)执行存储过程 CALL/PERFORM PROCEDURE 过程名(参数1,参数2,.); 使用CALL或者PERFORM等方式激活存储过程的执行 在过程化SQL中,数据库服务器支持在过程体中调用其他存储过程 存储过程的用户接口(续) 例8.9 从账户010038

37、15868转10000元到01003813828账户中。 CALL PROCEDURE TRANSFER(01003813828,01003815868,10000); 存储过程的用户接口(续) (3)修改存储过程 ALTER PROCEDURE 过程名1 RENAME TO 过程名2; (4)删除存储过程 DROP PROCEDURE 过程名(); 8.3 存储过程和函数 8.3.1 存储过程 8.3.2 函数 *8.3.3 过程化SQL中的游标 8.3.2 函数 函数和存储过程的异同 同:都是持久性存储模块 异:函数必须指定返回的类型 函数(续) 1. 函数的定义语句格式 CREATE O

38、R REPLACE FUNCTION 函数名 (参数1,参数2,+) RETURNS AS ; 2. 函数的执行语句格式 CALL/SELECT 函数名 (参数1,参数2,+); 3. 修改函数 重命名 ALTER FUNCTION 过程名1 RENAME TO 过程名2; 重新编译 ALTER FUNCTION 过程名 COMPILE; 第八章 数据库编程 8.1 嵌入式SQL 8.2 过程化SQL 8.3 存储过程和函数 8.4 ODBC编程 *8.5 OLE DB *8.6 JDBC编程 8.7 小结 8.4 ODBC编程 ODBC优点 移植性好 能同时访问不同的数据库 共享多个数据资源

39、 8.4 ODBC编程 8.4.1 ODBC概述 8.4.2 ODBC工作原理概述 8.4.3 ODBC API 基础 8.4.4 ODBC的工作流程 8.4.1 ODBC概述 ODBC产生的原因 由于不同的数据库管理系统的存在,在某个关系数据库管理系统下编写的 应用程序就不能在另一个关系数据库管理系统下运行 许多应用程序需要共享多个部门的数据资源,访问不同的关系数据库管理 系统 ODBC概述(续) ODBC 是微软公司开放服务体系(Windows Open Services Architecture,WOSA)中 有关数据库的一个组成部分 提供了一组访问数据库的应用程序编程接口(Applic

40、ation Programming Interface,API ) ODBC约束力 规范应用开发 规范关系数据库管理系统应用接口 8.4 ODBC编程 8.4.1 ODBC概述 8.4.2 ODBC工作原理概述 8.4.3 ODBC API 基础 8.4.4 ODBC的工作流程 8.4.2 ODBC工作原理概述 ODBC应用系统的体系结构 1. 用户应用程序 2. ODBC驱动程序管理器 3. 数据库驱动程序 4. 数据源 ODBC工作原理概述(续) 数据源数据源 KingbaseES 数据源数据源 Oracle 数据源数据源 SQL Server 用户应用程序用户应用程序 ODBC应用程序编

41、程接口应用程序编程接口 ODBC驱动程序管理器驱动程序管理器 数据库数据库 驱动程序驱动程序2 数据库数据库 驱动程序驱动程序1 数据库数据库 驱动程序驱动程序3 网络网络 图图8.3 ODBC应用系统的体系结构应用系统的体系结构 1. 用户应用程序 ODBC应用程序包括的内容 请求连接数据库 向数据源发送SQL语句 为SQL语句执行结果分配存储空间,定义所读取的数据格式 获取数据库操作结果或处理错误 进行数据处理并向用户提交处理结果 请求事务的提交和回滚操作 断开与数据源的连接 2. ODBC驱动程序管理器 驱动程序管理器:用来管理各种驱动程序 包含在ODBC32.DLL中 管理应用程序和驱

42、动程序之间的通信 建立、配置或删除数据源,并查看系统当前所安装的数据库ODBC驱动程序 ODBC驱动程序管理器(续) 主要功能: 装载ODBC驱动程序 选择和连接正确的驱动程序 管理数据源 检查ODBC调用参数的合法性 记录ODBC函数的调用等 3. 数据库驱动程序 ODBC通过驱动程序来提供应用系统与数据库平台的独立性 ODBC应用程序不能直接存取数据库 其各种操作请求由驱动程序管理器提交给某个关系数据库管理系统的ODBC 驱动程序 通过调用驱动程序所支持的函数来存取数据库 数据库的操作结果也通过驱动程序返回给应用程序 如果应用程序要操纵不同的数据库,就要动态地链接到不同的驱动程序上 数据库

43、驱动程序(续) ODBC驱动程序类型 单束 数据源和应用程序在同一台机器上 驱动程序直接完成对数据文件的I/O操作 驱动程序相当于数据管理器 多束 支持客户机服务器、客户机应用服务器/数据库服务器等网络环境下的数据访问 由驱动程序完成数据库访问请求的提交和结果集接收 应用程序使用驱动程序提供的结果集管理接口操纵执行后的结果数据 4. ODBC数据源管理 数据源:是最终用户需要访问的数据,包含了数据库位置和数据库 类型等信息,是一种数据连接的抽象 ODBC数据源管理 (续) 数据源对最终用户是透明的 ODBC给每个被访问的数据源指定唯一的数据源名(Data Source Name, 简称DSN)

44、,并映射到所有必要的、用来存取数据的低层软件 在连接中,用数据源名来代表用户名、服务器名、所连接的数据库名等 最终用户无须知道数据库管理系统或其他数据管理软件、网络以及有关 ODBC驱动程序的细节 ODBC数据源管理(续) 例如,假设某个学校在SQL Server和KingbaseES上创建了两个数据库: 学校人事数据库和教学科研数据库。 学校的信息系统要从这两个数据库中存取数据 为了方便地与两个数据库连接,为学校人事数据库创建一个数据源名 PERSON,为教学科研数据库创建一个名为EDU的数据源 当要访问每一个数据库时,只要与PERSON和EDU连接即可,不需要记住使 用的驱动程序、服务器名

45、称、数据库名 8.4 ODBC编程 8.4.1 ODBC概述 8.4.2 ODBC工作原理概述 8.4.3 ODBC API 基础 8.4.4 ODBC的工作流程 8.4.3 ODBC API 基础 ODBC 应用程序编程接口的一致性 API一致性 包含核心级、扩展1级、扩展2级 语法一致性 包含最低限度SQL语法级、核心SQL语法级、扩展SQL语法级 ODBC API 基础(续) 1. 函数概述 2. 句柄及其属性 3. 数据类型 1. 函数概述 ODBC 3.0 标准提供了76个函数接口 分配和释放环境句柄、连接句柄、语句句柄 连接函数(SQLDriverconnect等) 与信息相关的函

46、数(SQLGetinfo、SQLGetFuction等) 事务处理函数(如SQLEndTran) 执行相关函数(SQLExecdirect、SQLExecute等) 编目函数,ODBC 3.0提供了11个编目函数,如SQLTables、SQLColumn等。应用 程序可以通过对编目函数的调用来获取数据字典的信息,如权限、表结构等 函数概述(续) ODBC不同版本上的函数和函数使用是有差异的,读者必须注意使用的 版本,目前最新的版本是ODBC 3.8 2. 句柄及其属性 句柄是32位整数值,代表一个指针 ODBC 3.0中句柄分类 环境句柄 连接句柄 语句句柄 描述符句柄 句柄及其属性(续) 应

47、用程序句柄之间的关系 每个ODBC应用程序需要建立一个ODBC环境,分配一个环境句柄,存取数据的 全局性背景,如环境状态、当前环境状态诊断、当前在环境上分配的连接句 柄等 一个环境句柄可以建立多个连接句柄,每一个连接句柄实现与一个数据源之 间的连接 句柄及其属性(续) ODBC应用程序应用程序 环境句柄环境句柄 连接句柄连接句柄 语句句柄语句句柄 数据源数据源 描述符句柄描述符句柄 1 1 1 n 1 n 1 1 1 n 图图8.4 应用程序句柄之间的关系应用程序句柄之间的关系 句柄及其属性(续) 应用程序句柄之间的关系(续) 在一个连接中可以建立多个语句句柄,它不只是一个SQL语句,还包括S

48、QL 语句产生的结果集以及相关的信息等 在ODBC 3.0中又提出了描述符句柄的概念,它是描述SQL语句的参数、结果 集列的元数据集合 3. 数据类型 ODBC数据类型 SQL数据类型:用于数据源 C数据类型 :用于应用程序的C代码 应用程序可以通过SQLGetTypeInfo来获取不同的驱动程序对于数据类 型的支持情况 数据类型(续) SQL数据类型和C数据类型之间的转换规则 SQL数据类型数据类型 C数据类型数据类型 SQL数据类型数据类型 数据源之间转换数据源之间转换 应用程序变量传送到语句应用程序变量传送到语句 参数(参数(SQLBindparameter) C数据类型数据类型 从结果

49、集列中返回到应用从结果集列中返回到应用 程序变量(程序变量(SQLBindcol) 应用程序变量之间转换应用程序变量之间转换 8.4 ODBC编程 8.4.1 ODBC概述 8.4.2 ODBC工作原理概述 8.4.3 ODBC API 基础 8.4.4 ODBC的工作流程 8.4.4 ODBC的工作流程 ODBC的工作流程 ODBC的工作流程(续) 例8.11 将KingbaseES数据库中Student表的数据备份到SQL Server数 据库中。 该应用涉及两个不同的关系数据库管理系统中的数据源 使用ODBC来开发应用程序,只要改变应用程序中连接函数(SQLConnect) 的参数,就可

50、以连接不同关系数据库管理系统的驱动程序,连接两个数据 源 ODBC的工作流程(续) 在应用程序运行前,已经在KingbaseES和SQL Server中分别建立了 Student关系表 应用程序要执行的操作 在KingbaseES上执行SELECT * FROM Student; 把获取的结果集,通过多次执行INSERT语句插入到SQL Server的Student表中 ODBC的工作流程(续) 操作步骤 1. 配置数据源 2. 初始化环境 3. 建立连接 4. 分配语句句柄 5. 执行SQL语句 6. 结果集处理 7. 中止处理 1. 配置数据源 配置数据源有两种方法 运行数据源管理工具来进

展开阅读全文
相关资源
猜你喜欢
相关搜索
资源标签

当前位置:首页 > 大学
版权提示 | 免责声明

1,本文((高等教育)数据库系统概论第五版教学课件:第8章.ppt)为本站会员(小豆芽)主动上传,163文库仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对上载内容本身不做任何修改或编辑。
2,用户下载本文档,所消耗的文币(积分)将全额增加到上传者的账号。
3, 若此文所含内容侵犯了您的版权或隐私,请立即通知163文库(发送邮件至3464097650@qq.com或直接QQ联系客服),我们立即给予删除!


侵权处理QQ:3464097650--上传资料QQ:3464097650

【声明】本站为“文档C2C交易模式”,即用户上传的文档直接卖给(下载)用户,本站只是网络空间服务平台,本站所有原创文档下载所得归上传人所有,如您发现上传作品侵犯了您的版权,请立刻联系我们并提供证据,我们将在3个工作日内予以改正。


163文库-Www.163Wenku.Com |网站地图|