《2019数据库应用开发 嵌入式SQL课件》由会员分享,可在线阅读,更多相关《2019数据库应用开发 嵌入式SQL课件(40页珍藏版)》请在金锄头文库上搜索。
1、1,第十章 数据库应用开发,10.1 嵌入式SQL 10.2 基于OLE DB/ADO的数据库开发方法 10.3 基于JDBC技术的数据库开发方法 10.4 SQLJ及其在数据库开发中的应用,2,10.1 嵌入式SQL,一、嵌入式SQL概述 二、嵌入式SQL的一般形式 三、嵌入式SQL语句和主语言之间的通信 四、不用游标的SQL语句 五、使用游标的SQL语句,3,一、嵌入式SQL概述,使用嵌入式SQL的原因 SQL语言不便于进行事务处理中的流程控制; 普通编程语言在涉及数据库的操作时,不能高效率地进行数据的存取。 将SQL语句嵌入到普通编程语言中使用,很好地结合了编程语言的过程性和SQL语言的
2、数据操纵能力。 嵌入式SQL语言:嵌入到普通编程语言中的SQL语言 宿主语言:嵌入SQL语句的普通编程语言,4,一、嵌入式SQL概述,DBMS处理嵌入式SQL语言有两种方法: 预编译方法 使用较多的方法 扩充编译程序法 使用嵌入式SQL,必须解决下列三个问题 让预编译器识别程序代码中的SQL语句 DBMS和宿主语言程序能够进行数据交换 协调好SQL语句和宿主语句对记录的处理方式,5,二、嵌入式SQL的一般形式,开始标志:EXEC SQL 结束标志:视不同的宿主语言而不同 PL/1和C语言中以“;”作为结束标志 COBOL语言以 END-EXEC作为结束标志 嵌入式SQL的一般形式: 开始标志+
3、SQL语句+结束标志 例:交互SQL:DROP TABLE employee, 嵌入到C语言中的写法是: EXEC SQL DROP TABLE employee;,6,三、嵌入式SQL语句和 主语言之间的通信,数据库和源程序工作单元之间通信主要包括: 向主语言传递SQL语句的执行状态信息,使主语言能够据此控制程序流程; 主语言向SQL语言提供参数; 将SQL语句查询数据库的结果交主语言进一步处理。 采用的通信方式 SQL主语言(SQL执行状态):SQLCA 主语言SQL(输入数据):主变量 SQL主语言(输出数据):主变量+游标,7,三、嵌入式SQL语句和 主语言之间的通信,SQL通信区(S
4、QLCA:SQL Communication Area) 将系统当前的工作状态和运行环境数据反馈给主程序 在应用程序中的定义: EXEC SQL INCLUDE SQLCA; SQLCA.SQLCODE是SQLCA的一个分量,属于整数类型,供DBMS向应用程序报告SQL语句的执行情况。每执行一条SQL语句,返回一个SQLCODE代码。,8,三、嵌入式SQL语句和 主语言之间的通信,SQLCA.SQLCODE代码 SQLCODE0:SQL语句执行成功,无异常出现; SQLCODE为负整数:SQL语句执行失败,具体负值表示错误的类型; SQLCODE为正整数,表示SQL语句已执行,但出现了意外的情
5、况。如当SQLCODE100时表示语句已执行,但无数据可取,如DB中无满足条件的记录。,9,三、嵌入式SQL语句和 主语言之间的通信,主变量(host variable):是在嵌入式SQL中使用的主语言的程序变量,用来在输入和输出数据 主变量声明: EXEC SQL BEGIN DECLARE SECTION; 主变量说明段 EXEC SQL END DECLARE SECTION C语言中主变量声明举例: EXEC SQL BEGIN DECLARE SECTION; int s_no; char s_name30; int s_age; EXEC SQL END DECLARE SECTI
6、ON,10,三、嵌入式SQL语句和 主语言之间的通信,主变量使用 SQL语句引用主变量时,变量名前加“:” 在宿主语言中引用主变量时就无需再加“:” s_no=101; EXEC SQL select SNAME , SAGE into :s_name , :s_age from STUDENT where SNO = :s_no;,11,三、嵌入式SQL语句和 主语言之间的通信,指示变量(Indicator Variable) 也是主变量,用来指示返回给宿主变量的值是否为null 在DML中,在宿主变量和指示变量之间加( : )或关键字indicator。 EXEC SQL BEGIN DE
7、CLARE SECTION int s_no; char s_name30; int s_age; short name_id; shortage_id; EXEC SQL END DECLARE SECTION EXEC SQL select SNAME , SAGE into :s_name : name_id , :s_age: age_id from STUDENT where SNO = :s_no ;,12,三、嵌入式SQL语句和 主语言之间的通信,游标(CURSOR):协调两种不同的数据处理方式 SQL:面向集合,一条SQL原则上可以产生或处理多条记录; 主语言:面向记录,一条语
8、句一次只能处理一个记录 游标是系统为用户开设的一个数据缓冲区,存放SQL语句的执行结果。 若一个SQL语句返回单个元组,则不用游标。 若一个SQL语句返回多个元组,则使用游标,13,四、不用游标的SQL语句,说明性语句; 数据定义语句; 数据控制语句; INSERT语句; 查询结果为单记录的SELECT语句; 对满足条件的当前记录(或记录集),由系统根据用户要求,自动进行修改或删除的UPDATE和DELETE语句。,14,五、使用游标的SQL语句,需要使用游标的语句有: 查询结果为多记录的SELECT语句; 对满足条件的结果集中记录分别进行修改或删除的UPDATE和DELETE语句。,15,五
9、、使用游标的SQL语句,结果为多记录的SELECT语句使用游标的步骤: 说明游标: EXEC SQL DECLARE CURSOR FOR ; 打开游标: EXEC SQL OPEN ; 推进游标指针并取当前记录: EXEC SQL FETCH INTO ; 关闭游标: EXEC SQL CLOSE ,16,五、使用游标的SQL语句,通过游标的更新和删除步骤: 声明游标: EXEC SQL DECLARE CURSOR FOR FOR UPDATE OF ; 打开游标: EXEC SQL OPEN ; 推进游标指针并取当前记录: EXEC SQL FETCH INTO ; 更新或修改记录 EX
10、EC SQL UPDATE SET WHERE CURRENT OF ; EXEC SQL DELETE FROM WHERE CURRENT OF ; 关闭游标: EXEC SQL CLOSE ,17,10.2 基于OLE DB/ADO的数据库开发方法,一、OLE DB 二、ADO与OLE DB 三、ADO应用程序开发,18,一、OLE DB,Microsoft采用OLE技术开发的一种新型的数据库接口程序 在ODBC技术的基础上发展而来,19,1. OLE DB的体系结构,OLE DB主要由三个层次构成: 数据使用者(Data Consumer) 数据服务提供者(Data Service P
11、rovider) 数据提供者(Data Provider),20,2. OLE DB 工作原理,21,二、ADO与OLE DB (1 of 2),22,二、ADO与OLE DB (2 of 2),利用ADO访问数据库的方法与步骤: 连接数据源 创建SQL查询命令对象 激活命令,产生记录集 操作记录集中的记录 更新数据源,23,三、ADO应用程序开发,可以在任何支持COM和自动化特性的语言环境中使用 。 具体应用见附件1。,24,10.3 基于JDBC技术的数据库开发方法,一、JDBC驱动 二、JDBC的接口和类 三、JDBC应用程序开发,25,一、JDBC驱动(1 of 2),26,一、JDB
12、C驱动(2 of 2),JDBC驱动程序有以下4类: JDBC-ODBC桥,将JDBC调用转化为ODBC(Open Database Connectivity)调用的“桥梁”,通过ODBC驱动程序来提供JDBC对数据库的访问。 本机应用编程接口部分Java驱动程序(Native-API Partly-Java Driver),将JDBC调用转换为基于客户端API的调用。 数据库中间件的纯Java驱动程序(Net-Protocol All-Java Driver),将JDBC调用转换成为中间件供应商的协议,然后通过中间件服务器将该协议转换为DBMS协议。 直接连接数据库的纯Java驱动程序(Na
13、tive-Protocol All-Java Driver),将JDBC调用转换为特定数据库直接使用的网络协议,这一类驱动程序通常由数据库厂商自己开发。,27,二、JDBC的接口和类(1 of 8),java.sql包提供了核心的JDBC API,其中含有访问数据库的所有类和接口,这个包与包java.io和java. util以相同的方式形成了Java类库的组成部分。,28,二、JDBC的接口和类(2 of 8), java.sql.DriverManager类 JDBC的管理层,作用于用户和驱动程序之间,用于管理JDBC驱动程序,并在数据库和相应的驱动程序之间建立连接。 方法的声明如下: p
14、ublic static synchronized void Connection getConnection(String url, String user, String password) throws SQLException,29,二、JDBC的接口和类(3 of 8), Statement类接口 Statement接口用于执行一个静态的SQL语句,并得到SQL语句执行后的结果。Statement接口常用的方法为: ResultSet executeQuery(String sql) throws SQLException int executeUpdate(String sql)
15、throws SQLExceptton void close() throws SQLException,30,二、JDBC的接口和类(4 of 8), PreparedStatement类 PreparedStatement对象继承Statement接口,因此也是用来执行SQL语句的,与Statement接口不同的是,包含于PreparedStatement对象中的SQL语句具有一个或多个输入(IN)参数。,31,二、JDBC的接口和类(5 of 8), CallableStatement类 是PreparedStatement类的子类 对象用 ParepareCall方法创建 对象用于执行
16、SQL存储过程,32,二、JDBC的接口和类(6 of 8), ResultSet类 提供从数据库中返回的结果集 使用该类的getXXX方法得到数据库记录集中某个字段的一条记录,33,二、JDBC的接口和类(7 of 8), 其他常用的接口和类 java.sql.SQLException类 java.sql.Driver接口 java.sql.Connection接口 java.sql.Statement接口 java.sql.ResultSet接口,34,二、JDBC的接口和类(8 of 8),35,三、JDBC应用程序开发,1. 连接数据库的步骤 加载驱动程序 建立连接 对数据库进行操作 关闭连接和相应的对象,36,2. 一个编程实例,见附件2,37,10.4 SQLJ及其在数据库开发中的应用,一、SQLJ与JDBC比较 二、SQLJ应用程序开发,38,一、SQLJ与JDBC比较,对于JAVA数据库应用程序调用SQL, DB2提供了2种方