第5章 关系数据库编程基础本章要点嵌入式SQL的实现方式、使用规定及使用技术面向对象应用程序访问数据库的常用接口ODBCJDBCADO.NE TSQL Server的存储过程SQL Server的触发器5.1 应用程序访问数据库SQL语言提供了两种不同的使用方式在终端 交互方式下直接运行将SQL语句嵌入到其他程序设计语言程序的源代码中SQL语言提供了两种不同的使用方式嵌入SQL语句的高级语言称为主 语言或宿主语言。将SQL语言嵌入到某种高级语言中使用,利用高级语言的过程性结构弥补SQL语言在实现复杂应用方面的不足。SQL语句负 责对数据库中数据的提取及操作,它所提取的数据提交给程序,程序中其他语句负责数据的处理和传递。嵌入式SQL:通常采用专用的SQL预编 译程序将嵌入的SQL语句转换为能被程序设计语言的编译器识别的函数调用,然后程序设计语言的编译器将源代码编译为可执行程序。应用程序编 程接口( API ):通过API的调用,可以将SQL语句传递到DBMS,并用API调用返回结果。这种方法不需要专用的SQL预编译程 序。应用程序可以通过嵌入式SQL或应用程序编程接口(API)实现对数据库的访问。5.1.1 嵌入式SQLSQL语言是基于关系数据 模型的语言,而高级语言是基于整数、实数、字符、数组等数据类型的语言,因此两者之间有很大差别。例如,SQL语句不能直接使用指针、数组 等数据结构,而高级语言一般不能直接进行集合运算。为了能在宿主语言的程序中嵌入SQL语句,嵌入式SQL必须解决一些问题如何将嵌有SQ L的宿主语言程序编译成可执行码宿主语言和数据库管理系统之间如何传递数据和信息如何协调SQL的集合处理方式与宿主语言的单记录处理方式 等。5.1.1 嵌入式SQL虽然在程序设计的环境下,SQL语句要做某些必要的扩充,但嵌入式SQL和交互式SQL的大部分语法是相同 的。1.在宿主语言中标识SQL语句在嵌入式SQL中,为了使预处理程序能够区分SQL语句与主语言语句,所有SQL语句都必须加前缀“E XEC SQL”和SQL语句的结束标志。ESQL/C的SQL语句结束标志是分号,一般格式如下: EXEC SQL ;连接到SQL Server在ESQL/C中,连接到SQL Server使用CONNECT TO语句,语法如下: CONNECT TO <服务器名>. <数据库名> <连接的名称> USER <登录名>. <登录 密码>使用另外一个连接:SET CONNECTION <连接的名称>关闭与数据的连接用DISCONNECT语句,语法如下DISC ONNECT <连接的名称> | ALL | CURRENT连接到SQL Server【例5.1】连接服务器myServer上数 据库名为SaleProduct和test的SQL Server数据库,数据库登录名为sa,密码为123456,然后分别关闭它们。E XEC SQL CONNECT TO myServer.SaleProduct AS con1 USER sa.123456;EX EC SQL CONNECT TO myServer.test AS con2 USER sa.123456;EXEC SQL D ISCONNECT con1EXEC SQL DISCONNECT con2【例5.2】建立基本表Customer。EXEC SQ L CREATE TABLE Customer (custID varchar(5) PRIMARY KEY, cu stName varchar(20) NOT NULL UNIQUE, custCity VARCHAR(10), custPhone VARCHAR(13));【例5.3】删除基本表Customer。 EXEC SQL DROP TABLE Customer;2.数据库工作单元与宿主程序工作单元之间的通信主变量:在嵌入式SQL语句中引用宿主语言说明 的程序变量。SQL与C之间数据的传送可以通过主变量实现。在SQL语句中引用主变量时,为了区别数据库变量,主变量前须加“:” 。在宿 主语言语句中,主变量可与其它变量一样使用,不须加冒号。2.数据库工作单元与宿主程序工作单元之间的通信程序中的主变量都应在程序说明部 分使用DECLARE语句加以声明。一般在BEGIN DECLARE SECTION 和END DECLARE SECTION之间声 明主变量。需要注意的是,在ESQL/C中关键字和SQL语句都是不区分大小写的,但是对于宿主变量的大小写敏感。【例5.4】在商品销售 管理数据库SaleProduct中,查询903号客户的名称和电话号码,分别将其存储到宿主变量xCustName,xCustPhon e中。EXEC SQL BEGIN DECLARE SECTION; /说明语句开头/ char xCus tID[5]; char xCustName[20]; char xCustCity[10]; char xCustPhone[13];EXEC SQL END DECLARE SECTION; /说明语句结束/EXEC SQL SELECT custName,custPhone INTO :xCustName,:xCustPhone FROM Customer WHERE custID=''903'';【例5.5】在商品销售管理数据库S aleProduct中,向Customer表插入一个元组,元组的各分量值分别来自宿主变量xCustID、xCustName、xCu stPhone。EXEC SQL INSERT INTO Customer (custID,custName,c ustPhone) VALUES (:xCustID, :xCustName, :xCustPhone);SQL通 信区(SQLCA)SQL语句执行后,数据库管理系统需要反馈给应用程序一些状态信息,包括描述系统当前工作状态和运行环境的各种数据。这 些信息被送到SQL通信区(SQLCA)。SQLCA是一个含有错误变量和状态指示符的数据结构,使用语句EXEC SQL INCLUD E SQLCA加以定义,它是全局变量。SQLCA.SQLCODE:它是一个整数,用于DBMS向应用程序报告SQL语句的执行情况。S QLCODE>0,表示SQL已执行,但有异常SQLCODE<0,表示SQL没有执行,有错误SQLCODE=0,表示执行成功,无异常 3. SQL的集合处理方式与宿主语言单记录处理方式之间的转换嵌入式SQL引入游标机制,把集合操作转换成单记录方式。游标是系统为用户 开设的一个数据缓冲区,存放SQL语句的执行结果。每个游标区都有一个名字,用户可以通过游标逐一获取记录,并将其赋给主变量,交由主语言 进一步处理。3. SQL的集合处理方式与宿主语言单记录处理方式之间的转换游标分为静态游标和动态游标静态游标包含完整的SQL语句静态 游标可以包含宿主变量,当打开它时,宿主变量就被读到SQL语句中,形成一个完整的SQL语句。动态游标则需要在运行时指定参数。动态游标 中的参数用?标记符来指定,当打开游标时,根据提供的?标记符代码的数据来构造SQL语句。3. SQL的集合处理方式与宿主语言单记录处 理方式之间的转换在使用游标之前必须要定义游标,定义游标语法如下: DECLARE <游标名称> CURSOR FOR |
|