第 五 章 sql 编程 数据库接口技术

100

Upload: zuri

Post on 27-Jan-2016

182 views

Category:

Documents


0 download

DESCRIPTION

第 五 章 SQL 编程 数据库接口技术. 提纲. 嵌入式 SQL ODBC JDBC PHP. 嵌入式 SQL. 为什么使用嵌入式 SQL ? 嵌入式 SQL 执行过程 需要解决的几个问题. 为什么使用嵌入式 SQL ?. 有些操作对于交互式 SQL 是 不可能的任务 SQL 的表达能力相比高级语言有一定的限制,有些数据访问要求单纯使用 SQL 无法完成。一方面, SQL 在逐渐增强自己的表达能力(参见习题 4.10 ),另一方面,太多的扩展会导致优化能力及执行效率的降低 非声明性动作 - PowerPoint PPT Presentation

TRANSCRIPT

Page 1: 第 五 章  SQL 编程 数据库接口技术
Page 2: 第 五 章  SQL 编程 数据库接口技术

2

嵌入式 SQL ODBC JDBC PHP

提纲

Page 3: 第 五 章  SQL 编程 数据库接口技术

嵌入式 SQL

为什么使用嵌入式 SQL ?嵌入式 SQL 执行过程需要解决的几个问题

Page 4: 第 五 章  SQL 编程 数据库接口技术

为什么使用嵌入式 SQL ?

有些操作对于交互式 SQL 是不可能的任务 SQL 的表达能力相比高级语言有一定的限制,

有些数据访问要求单纯使用 SQL 无法完成。一方面, SQL 在逐渐增强自己的表达能力(参见习题 4.10 ),另一方面,太多的扩展会导致优化能力及执行效率的降低

非声明性动作 实际的应用系统是非常复杂的,数据库访问只

是其中一个部件。有些动作如与用户交互、图形化显示数据等只能用高级语言实现

Page 5: 第 五 章  SQL 编程 数据库接口技术

嵌入式 SQL 执行过程

主语言 + 嵌入 SQL

预处理

主语言 + 函数调用

主语言编译器

主语言执行程序

Page 6: 第 五 章  SQL 编程 数据库接口技术

需要解决的几个问题

区分 SQL 语句与 C 语言语句嵌入 SQL 语句与 C 语言之间的数据传递SQL 与主语言之间操作方式的协调SQL 语句执行信息反馈

Page 7: 第 五 章  SQL 编程 数据库接口技术

区分 SQL 语句与 C 语言语句

嵌入的 SQL 语句以 EXEC SQL 开始,以分号 (;) 或 END_EXEX 结束

EXEC SQL delete from PROF

where DNO = 10 ;

Page 8: 第 五 章  SQL 编程 数据库接口技术

嵌入 SQL 与 C 语言之间的数据传递

宿主变量 C 变量,既可以用在 C 语句中,也可用在 SQL 语

句中,用来在两者之间传递数据宿主变量的声明

声明为通常的 C 变量,并将其放在下列标识语句之间

EXEC SQL BEGIN DECLARE SECTION

EXEC SQL END DECLARE SECTION

Page 9: 第 五 章  SQL 编程 数据库接口技术

嵌入 SQL 与 C 语言之间的数据传递

EXEC SQL BEGIN DECLARE SECTION

int prof_no;

char prof_name[30];

int salary;

EXEC SQL END DECLARE SECTION

Page 10: 第 五 章  SQL 编程 数据库接口技术

嵌入 SQL 与 C 语言之间的数据传递

注:宿主变量出现于 SQL 语句中时,前面加( : )以区别列名 宿主变量可出现的地方: SQL 的数据操纵语句中可出现常数的任何地方, select , fetch 等语句的 into 字句中示例: EXEC SQL

select PNAME , SAL

into :prof_name , :salary

from PROF

where PNO = :prof_no ;

Page 11: 第 五 章  SQL 编程 数据库接口技术

嵌入 SQL 与 C 语言之间的数据传递指示变量

C 变量,用来指示返回给宿主变量的值是否为 null 值,以及返回给宿主变量的字符串是否发生了截断

指示变量应用场合 如果一个宿主变量所对应的数据库字段允许空值,或字符

串类型的宿主变量的长度可能小于所对应的数据库字段的长度,则需要一个指示变量来指明数据库访问的返回状态

指示变量的返回值 = 0 :取到主变量的值不空,没有发生截断 = 1 :取到主变量的值为空值 > 0 :取到主变量的值发生了截断,指示变量的值是截断

前的字符串的实际长度

Page 12: 第 五 章  SQL 编程 数据库接口技术

嵌入 SQL 与 C 语言之间的数据传递 指示变量的用法

• 声明与宿主变量的声明方式一样,在数据操纵语句中,在宿主变量和指示变量之间加 ( : ) 或关键字 indicator

EXEC SQL BEGIN DECLARE SECTIONint prof_no;char prof_name[30];int salary;short name_id;short sal_id;

EXEC SQL END DECLARE SECTION

EXEC SQL select PNAME , SALinto :prof_name : name_id , :salary:

sal_idfrom PROFwhere PNO = :prof_no ;

Page 13: 第 五 章  SQL 编程 数据库接口技术

SQL 与主语言之间操作方式的协调

执行方式的差别 SQL :一次一集合 C 语言:一次一记录

游标 在查询结果的记录集合中移动的指针 若一个 SQL 语句返回单个元组,则不用游标 若一个 SQL 语句返回多个元组,则使用游标

Page 14: 第 五 章  SQL 编程 数据库接口技术

SQL 语句执行信息反馈

良好的应用程序必须提供对错误的处理 , 应用程序需要知道 SQL 语句是否正确执行了,发生错误时的错误代码,执行时遇到特殊情况时的警告信息

SQL 通讯域 SQLCA 是一结构 , 每一嵌入 SQL 语句的执行情况在其执行完成后写入 SQLCA 结构中的各变量中 , 根据 SQLCA 中的内容可以获得每一嵌入 SQL 语句执行后的信息 , 应用程序就可以做相应的处理

为了说明 (USERCA), 必须在应用程序中包括 :EXEC SQL INCLUDE SQLCA;

Page 15: 第 五 章  SQL 编程 数据库接口技术

Company

LOGO

数据库接口技术—— ODBC

Page 16: 第 五 章  SQL 编程 数据库接口技术

www.themegallery.com

数据库接口技术的分类

微软最新的数据访问技术 ,用以实现访问关系或非关系数据库中的数据。

ADO

Microsoft推出的最早的整合异质数据库的数据库接口,现在已成为一种事实上的标准。

ODBC

是执行 SQL语句的 Java API ,由一组用 Java 语言编写的类与接口组成。

JDBC

Page 17: 第 五 章  SQL 编程 数据库接口技术

www.themegallery.com

ODBC

ODBC :Open DataBase Connectivity开放式数据库联接Microsoft引进这种技术的一个主要

目的是,以非语言专用的方式,提供给程序员一种访问数据库内容的简单方法。

Page 18: 第 五 章  SQL 编程 数据库接口技术

www.themegallery.com

ODBC 的产生背景

关系型数据库产生后很快就成为数据库系统的主流产品,由于每个 DBMS厂商都有自己的一套标准,人们很早就产生了标准化的想法,于是产生了 SQL ,由于其语法规范逐渐为人所接受,成为RDBMS上的主导语言。最初,各数据库厂商为了解决互连的问题,往往提供嵌入式 SQL API ,用户在客户机端要操作系统中的 RDBMS 时,往往要在程序中嵌入 SQL 语句进行预编译。由于不同厂商在数据格式、数据操作、具体实现甚至语法方面都具有不同程度的差异,所以彼此不能兼容。

Page 19: 第 五 章  SQL 编程 数据库接口技术

www.themegallery.com

ODBC 的产生

1991年 11月,微软宣布了 ODBC ,次年推出可用版本。

1992年 2月,推出了 ODBC SDK 2.0版。ODBC基于 SAG 的 SQL CAE草案所规定

的语法,共分为Core 、 Level 1 、 Level 2三种定义,分别规范了 22 、 16 、 13共 51条命令,其中 29条命令甚至超越了 SAG CLI 中原有的定义,功能强大而灵活。它还包括标准的错误代码集、标准的连接和登录DBMS 方法、标准的数据类型表示等。

Page 20: 第 五 章  SQL 编程 数据库接口技术

www.themegallery.com

ODBC 的发展

由于当时 ODBC思想上的先进性,且没有同类的标准或产品与之竞争,它一枝独秀,推出后仅仅两三年就受到了众多厂家与用户的青睐,成为一种广为接受的标准。目前,已经有 130 多家独立厂商宣布了对 ODBC 的支持,常见的 DBMS都提供了 ODBC 的驱动接口,这些厂商包括Oracle 、 Sybase 、 Informix 、 Ingres 、 IBM(DB/2) 、 DEC(RDB) 、 HP(ALLBASE/SQL) 、 Gupta 、 Borland(Paradox) 等。目前,ODBC已经成为客户机 /服务器系统中的一个重要支持技术。

Page 21: 第 五 章  SQL 编程 数据库接口技术

www.themegallery.com

ODBC 的基本思想

为用户提供简单、标准、透明的数据库连接的公共编程接口 。

ODBC基本思想

开发厂商根据ODBC 的标准去实现底层的驱动程序 。

Page 22: 第 五 章  SQL 编程 数据库接口技术

www.themegallery.com

ODBC 与传统方式的比较

传统方式 ODBC

Page 23: 第 五 章  SQL 编程 数据库接口技术

www.themegallery.com

ODBC 的特点

1

使用户程序有很高的互操作性,相同的目标代码适用于不同的 DBMS

2

由于 ODBC 的开放性,它为程序集成提供了便利,为客户机 /服务器结构提供了技术支持

3

由于应用与底层网络环境和 DBMS分开,简化了开发维护上的困难

Page 24: 第 五 章  SQL 编程 数据库接口技术

www.themegallery.com

ODBC 的体系结构和实现

ODBC 是依靠分层结构来实现的

具体分为四层: 应用程序 驱动程序管理器 驱动程序 数据源

Page 25: 第 五 章  SQL 编程 数据库接口技术

www.themegallery.com

体系结构

应用程序

驱动程序管理器

驱动程序

数据源

Application

Drive manager

Drive

Data sourse

Page 26: 第 五 章  SQL 编程 数据库接口技术

www.themegallery.com

应用程序层

使用 ODBC 接口的应用程序可执行以下任务: 请求与数据源的连接和会话 (SQLConnect) 向数据源发送 SQL 请求 (SQLExecDirct 或

SQLExecute) 对 SQL 请求的结果定义存储区和数据格式 请求结果 处理错误 如果需要,把结果返回给用户 对事务进行控制,请求执行或回退操作

(SQLTransact) 终止对数据源的连接 (SQLDisconnect) 。

Page 27: 第 五 章  SQL 编程 数据库接口技术

www.themegallery.com

驱动程序管理程序功能

为 ODBC 提供提供参数和次数验证

为每一个驱动程序提供 ODBC 函数入口地点

处理几个 ODBC 的初始化调用

Page 28: 第 五 章  SQL 编程 数据库接口技术

www.themegallery.com

驱动程序功能

建立与数据源的连接向数据源提交请求在应用程序需求时,转换数据格式返回结果给应用程序将运行错误格式化为标准代码返回在需要时说明和处理光标。

Page 29: 第 五 章  SQL 编程 数据库接口技术

www.themegallery.com

数据源的组成

数据源 网络环境

DBMS

数据

操作系统

Page 30: 第 五 章  SQL 编程 数据库接口技术

www.themegallery.com

ODBC 的接口函数

I. 连接数据源( Connecting to a Data Source ) SQLAllocEnv SQLAllocConnect SQLConnect SQLPriverConnect SQLBrowseConnect

II.  取得驱动程序及数据源的相关讯息 SQLDataSource SQLGetInfo SQLGetFunctions SQLGetTypeInfo.

III. 设定及取得驱动程序的选项 SQLSetConnectOption SQLGetConnectOption SQLSetStmtOption SQLGetStmtOption.

Page 31: 第 五 章  SQL 编程 数据库接口技术

www.themegallery.com

ODBC 的接口函数

IV. 准备 SOL 指令之需求 SQLAllocStmt SQLPrepare SQLSetParam SQLParamOptions SQLGetCursorName SQLSetCursorName SQLSetScrollOptions.

V.  传送及执行需求 SQLExecute SQLExecDirect SQLNativeSql SQLDescribeParanl SQLNumParams SQLParamData SQLPutData.

Page 32: 第 五 章  SQL 编程 数据库接口技术

www.themegallery.com

ODBC 的接口函数

VI.  取得执行结果及有关结果的讯息 SQLRowCount SQLNumResultCols SQLDescribeCol SQLColAttributes SQLBindCol SQLFetch SQLExtendedFetch SQLGetData SQLSetDos SQLMoreResults SQLError

VII.  取得有关数据源系统表( System tables or Catalog )的讯息 SQLColumnPrivileges SQLColumns SQLForeignkeys SQLPrimaryKeys SQLProcedureColumns SQLProcedures SQLSpecialColumns SQLStatistics SQLTablePrivileges SQLTables

Page 33: 第 五 章  SQL 编程 数据库接口技术

www.themegallery.com

ODBC 的接口函数

VIII.  结束 SQL 指令需求 SQLFreeStmt SQLCancel SQLTransact

IX.  结束与数据源的连接 SQLDisconnect SQLFreeConnect SQLFreeEnv

Page 34: 第 五 章  SQL 编程 数据库接口技术

www.themegallery.com

ODBC 程序流程

为 ODBC 分配环境句柄分配一个连接句柄连接到数据库用 SQL命令分配一个语

句句柄传送该命令关闭连接解除连接和环境句柄

Page 35: 第 五 章  SQL 编程 数据库接口技术

www.themegallery.com

ODBC 实例

应用程序要访问一个数据库,首先必须用 ODBC管理器注册一个数据源,管理器根据数据源提供的数据库位置、数据库类型及 ODBC驱动程序等信息,建立起 ODBC 与具体数据库的联系。这样,只要应用程序将数据源名提供给 ODBC , ODBC就能建立起与相应数据库的连接。

在 ODBC 中, ODBC API 不能直接访问数据库,必须通过驱动程序管理器与数据库交换信息。驱动程序管理器负责将应用程序对 ODBC API 的调用传递给正确的驱动程序,而驱动程序在执行完相应的操作后,将结果通过驱动程序管理器返回给应用程序。

Page 36: 第 五 章  SQL 编程 数据库接口技术

www.themegallery.com

ODBC 实例(续 1 )

实现步骤: 1. 设置ODBC 数据源 步骤是控制面板->管理工具-> 数据源

( ODBC )。这里将加入一个本用户的数据源local ,连接到本地的 SQL Server 2000服务器上。

选择添加数据源,选择 SQL Server 的驱动。完成相关的设置之后就可以看到本地的 DSN中多了一个名为 local 的数据源。如图所示:

Page 37: 第 五 章  SQL 编程 数据库接口技术

www.themegallery.com

ODBC 实例(续 2 )

设置完之后就可以在程序中使用 ODBC 的 API 来连接到数据库了。

Page 38: 第 五 章  SQL 编程 数据库接口技术

www.themegallery.com

ODBC 实例(续 3 )

2. 连接到 ODBC 数据源 下面通过一个简单的基于控制台的 VC 程序来演示如何连接到 ODBC 数据源。

要连接到 ODBC 数据源,需要先分配环境句柄,设置环境句柄,分配连接句柄,然后用这些句柄连接到ODBC建立连接。这部分的代码如下: • SQLHENV hEnv; • SQLHDBC hConnect; • SQLRETURN r; • // 分配环境句柄 • r = SQLAllocHandle ( SQL_HANDLE_ENV,

SQL_NULL_HANDLE, &hEnv); • if ( r != SQL_SUCCESS ) { • cout << "SQLAllocHandle error!" << endl ; • exit(1); • }

Page 39: 第 五 章  SQL 编程 数据库接口技术

www.themegallery.com

ODBC 实例(续 4 )

• // 设置环境句柄 • r = SQLSetEnvAttr ( hEnv, SQL_ATTR_ODBC_VERSION, (void • *)SQL_OV_ODBC3, 0 ); • if ( r != SQL_SUCCESS ) { • cout << "SQLSetEnvAttr error!" << endl ; • exit(1); • } • // 分配连接句柄 • r = SQLAllocHandle ( SQL_HANDLE_DBC, hEnv, &hConnect); • if ( r != SQL_SUCCESS ) { • cout << "SQLAllocHandle error!" << endl ; • exit(1); • } • // 连接 ODBC 数据库 • r = SQLConnect ( hConnect, (SQLCHAR*) "local", SQL_NTS, • (SQLCHAR*) "zhdf", SQL_NTS, • (SQLCHAR*) "123456", SQL_NTS); • if ( r!=SQL_SUCCESS && r!=SQL_SUCCESS_WITH_INFO ) { • cout << "SQLConnect error!" << endl; • exit (1); • }

Page 40: 第 五 章  SQL 编程 数据库接口技术

www.themegallery.com

ODBC 实例(续 5 )

3 . 查询实现 在建立 ODBC 的时候我选择的默认数据库是 pubs 。在这里用代码查询一下 authors : char SQLString[100] ; SQLCHAR RetName[20]; SQLLEN cbName; // 分配语句句柄 r = SQLAllocHandle ( SQL_HANDLE_STMT, hConnect,

&hStmt); if ( r != SQL_SUCCESS ) { cout << "SQLAllocHandle error!" << endl ; exit(1); } // 执行 SQL 查询 strcpy ( SQLString, "select au_lname from authors"); r = SQLExecDirect( hStmt, (SQLCHAR *)SQLString,

strlen(SQLString) ); if ( r != SQL_SUCCESS ) { cout << "SQLExecDirect error!" << endl ; exit(1); }

Page 41: 第 五 章  SQL 编程 数据库接口技术

www.themegallery.com

ODBC 实例(续 6 )

// 绑定数据并输出 r = SQLBindCol ( hStmt, 1, SQL_C_CHAR, (SQLPOINTER)

RetName, 20, &cbName); while (1) { r = SQLFetch ( hStmt ); if ( r == SQL_ERROR || r == SQL_SUCCESS_WITH_INFO)

{ cout << "SQLFetch error!" << endl ; exit(1); } if ( r == SQL_SUCCESS || r ==

SQL_SUCCESS_WITH_INFO){ cout << RetName << endl; } else break; }

Page 42: 第 五 章  SQL 编程 数据库接口技术

www.themegallery.com

ODBC 实例(续 7 )

执行结果

Page 43: 第 五 章  SQL 编程 数据库接口技术

Company

LOGO

数据库接口技术—— JDBC

Page 44: 第 五 章  SQL 编程 数据库接口技术

www.themegallery.com

JDBC简介

JDBC概述JDBC技术特点JDBC编程框架实例介绍

Page 45: 第 五 章  SQL 编程 数据库接口技术

www.themegallery.com

JDBC 概述 JDBC 的诞生

SUN公司开发的一个以 Java 语言为接口的数据库应用程序开发的接口。

在 JDK1. x版本中, JDBC 只是一个可选部件,到了 JDK1.1公布时, SQL 类包(也就是 JDBCAPI )就成 Java 语言的标准部件。

在 JDBC2.0 中, JDBC 中的一系列可选的扩展对连接过程进行了改进。

JDBC重要性 JDBC 扩展了 Java 的能力。 随着越来越多的程序开发人员使用 Java 语言,对 Java 访问数

据库易操作性的需求越来越强烈。

Page 46: 第 五 章  SQL 编程 数据库接口技术

www.themegallery.com

JDBC 概述

JDBC 和 ODBC 及其他 API 的比较 正如 Java被设计成与硬件平台无关那样, JDBC

也被设计成向开发者提供某种程度的数据库无关性。 ODBC 并不适合在 Java 中直接使用。 ODBC 是

一个 C 语言实现的 API ,从 Java 程序调用本地的C 程序会带来一系列类似安全性、完整性、健壮性的缺点。

完全精确地实现从 C 代码 ODBC 到 JavaAPI 写的ODBC 的翻译也并不令人满意。

JDBC这样的 JavaAPI 对于纯 Java 方案来说是必须的。

Page 47: 第 五 章  SQL 编程 数据库接口技术

www.themegallery.com

JDBC 技术特点 JDBC 是一种用于执行 SQL 语句的 Java API ,它由一

组用 Java 编程语言编写的类和接口组成,可以使用它来访问数据库和执行 SQL 语句。

JDBC 为工具 / 数据库开发人员提供了一个标准的 API ,使他们能够用纯 Java API 来编写数据库应用程序。

JDBC 对 Java 程序员而言是 API ,对实现与数据库连接的服务提供商而言是接口模型。作为 API , JDBC 为程序开发提供标准的接口,并为数据库厂商及第三方中间件厂商实现与数据库的连接提供了标准方法。

Page 48: 第 五 章  SQL 编程 数据库接口技术

www.themegallery.com

JDBC 技术特点

JDBC 的结构

Page 49: 第 五 章  SQL 编程 数据库接口技术

www.themegallery.com

JDBC 技术特点

JDBC规范提供了数据库厂商必须实现的接口集合。目前有四种不同类型的实现。

Page 50: 第 五 章  SQL 编程 数据库接口技术

www.themegallery.com

JDBC 编程框架

JDBC 能完成下列三件事: 同一个数据库建立连接; 向数据库发送 SQL 语句; 处理数据库返回的结果。

JDBC 的接口 一个是面向程序开发人员的 JDBC API 一个是底层的 JDBC Driver API 。

Page 51: 第 五 章  SQL 编程 数据库接口技术

www.themegallery.com

JDBC 编程框架JDBC API

JDBC API 被描述成为一组抽象的 Java接口,可以对某个数据库打开连接,执行 SQL 语句并且处理结果。最重要的接口是:

java.sql.DriverManager 处理驱动的调入并且对产生新的数据库连接提供支持。

java.sql.Connection 代表对特定数据库的连接。

java.sql.Statement 代表一个特定的容器,来对一个特定的数据库执行 SQL 语句。

Page 52: 第 五 章  SQL 编程 数据库接口技术

www.themegallery.com

JDBC 编程框架 java.sql.ResultSet  控制对一个特定语句

的行数据的存取。

其中 java.sql.Statement又有两个子类型:

java.sql.PreparedStatement  用于执行预编译的 SQL 语句。

java.sql.CallableStatement  用于执行对一个数据库内嵌过程的调用。

Page 53: 第 五 章  SQL 编程 数据库接口技术

www.themegallery.com

JDBC 编程框架

JDBC Driver API java.sql.Driver 驱动程序,会将自身载入到

DriverManager 中去,并处理相应的请求并返回相应的数据库连接。

每个 database driver 必须提供这样一个类,以使得系统可以由 java.sql.DriverManager 来管理。

所有的 driver 必须提供对 java.sql.Connection, java.sql.Statement, java.sql.PreparedStatement, and java.sql.ResultSet 的实现。

如果目标 DBMS 提供有 OUT 参数的内嵌过程,那么还必须提供 java.sql.CallableStatement 接口。

Page 54: 第 五 章  SQL 编程 数据库接口技术

www.themegallery.com

JDBC 编程框架

加载驱动程序 建立连接 用于向数据库发送 SQL 语句 执行查询 处理得到的查询结果 关闭所有打开的资源

Page 55: 第 五 章  SQL 编程 数据库接口技术

www.themegallery.com

实例介绍

//JDBCexample.java

import java.sql.*;

class JDBC{public static void JDBCexample(String dbid, String userid, String passwd){

try{Class.forName("sun.jdbc.odbc.JdbcOdbcDriver");

Connection con = DriverManager.getConnection(dbid, userid, passwd);

Page 56: 第 五 章  SQL 编程 数据库接口技术

www.themegallery.com

Statement stmt = con.createStatement();

try{stmt.executeUpdate(“insert into S

values(‘s030’, ‘刘’ , ‘铁岭 ', 1)");

}catch(SQLException sqle){System.out.println("Could not

insert tuple. " + sqle);}ResultSet rs =

stmt.executeQuery("Select SNO, SNAME, CITY from S");

Page 57: 第 五 章  SQL 编程 数据库接口技术

www.themegallery.com

while( rs.next() ){System.out.println(" SNO: "

+rs.getString("SNO")+ " SNAME: " + rs.getString("SNAME")+ " CITY " + rs.getString("CITY") );

}con.close();

}catch(SQLException sqle){System.out.println("SQLException: " +

sqle);}catch(Exception e)

{System.out.println("Exception: " + e);}}

};

Page 58: 第 五 章  SQL 编程 数据库接口技术

www.themegallery.com

public class JDBCexample{

public static void main(String args[]){JDBC example = new JDBC();example.JDBCexample("jdbc:odbc:db1","",

"");}

};

Page 59: 第 五 章  SQL 编程 数据库接口技术

Company

LOGO

Page 60: 第 五 章  SQL 编程 数据库接口技术

www.themegallery.com

为什么数据库要与 Web 接口

Web浏览器已经变成用户访问数据库的 defacto标准 能够使大量用户从任何地方访问数据库 避免下载 /安装特定软件,同时提供良好的图形化用户界面

例如 Banks, Airline/Car reservations, University course registration/grading, …

Web 和数据库的连接打开创新服务的大门 新的服务和产品快速推向市场,对竞争做出及时反应 基于 Web 的支持服务,增加客户满意度 世界范围的通用访问,快速有效的信息维度

Page 61: 第 五 章  SQL 编程 数据库接口技术

www.themegallery.com

为什么数据库要与 Web 接口

动态文档给 Web赋予生命 静态文档的缺陷

• 不能为用户提供个性化文档• 文档更新有问题,尤其是许多文档共享数据时

解决途径:从数据库中动态产生文档• 可以基于存储在数据库中的用户信息来定制文档

– 例如定制广告、天气、新闻等• 显示的信息是最新的,不像静态页面

– 例如股票信息动态网页技术

客户端技术: Java Applet ,客户端脚本 服务器端技术: Java Servlet ,服务器端脚本

Page 62: 第 五 章  SQL 编程 数据库接口技术

www.themegallery.com

HTML

HTML 提供格式、显示超文本链接HTML 也提供输入特征

选择项: Pop-up menus, radio buttons, check lists

值输入:文本框 输入被送回服务器处理

Page 63: 第 五 章  SQL 编程 数据库接口技术

www.themegallery.com

HTML 示例

<html> <body><table border cols = 3>

<tr> <td> A-101 </td> <td> Downtown </td> <td> 500 </td> </tr>…

</table><center> The <i>account</i> relation </center><form action=“BankQuery” method=get>

Select account/loan and enter number <br><select name=“type”>

<option value=“account” selected> Account<option value=“loan”> Loan

</select><input type=text size=5 name=“number”><input type=submit value=“submit”>

</form></body> </html>

Page 64: 第 五 章  SQL 编程 数据库接口技术

www.themegallery.com

HTML 显示

Page 65: 第 五 章  SQL 编程 数据库接口技术

www.themegallery.com

HTTP

HTTP : HyperText Transfer Protocol 浏览器与 Web服务器之间的通讯协议

HTTP 协议是无连接的 当用户登录到计算机或 JDBC/ODBC服务器时,连接一直保持,直到客户端关闭它(保留用户权限和其他信息)

与此不同的,一旦Web服务器对请求做出响应, Web服务器马上关闭与客户端的连接

动机:减少服务器负载• 操作系统对一个机器上打开连接的数目有严格限制

Page 66: 第 五 章  SQL 编程 数据库接口技术

www.themegallery.com

HTTP 会话和 Cookies

信息服务需要会话信息 例如用户权限只在一次会话时授予 解决方案: cookie

Cookie 是包含确认信息的小片文本 在第一次连接时由服务器发送给浏览器 由浏览器将创建的 Cookie 发送给服务器 服务器保留它收到的 Cookie ,并在响应请求

时使用• 例如用户授权信息,用户偏好等

SITESERVERID=743886a420d9cc2ca7b9554b67c43293sohu.com/06428590083188777793003273629307734*

Page 67: 第 五 章  SQL 编程 数据库接口技术

www.themegallery.com

客户端脚本 /Applets

浏览器可以将脚本或程序与文档一起取回,并在客户端以“安全模式”运行它们 Javascript Applets

客户端脚本 / 程序使得文档成为活动的 动画显示 保证用户的输入满足正确性检查 允许与用户进行更便捷的交互,避免反复与

Server 通讯

Page 68: 第 五 章  SQL 编程 数据库接口技术

www.themegallery.com

Java Applets

Web-ServerHTTP-Request

HTML-File

Web-Server

File-System

Load File

FileLoad Applet...

Java-Class Requests

Java-Classes

Execute Applet...

Java Virtual Machine (JVM)

Server-Process

Page 69: 第 五 章  SQL 编程 数据库接口技术

www.themegallery.com

三层 Web 体系结构

Page 70: 第 五 章  SQL 编程 数据库接口技术

www.themegallery.com

请求 - 服务流程

1. Web浏览器向Web服务器请求一个网页;2. Web服务器用 CGI 将请求传递给应用服务器;

3. 应用服务器用 ODBC连接数据库;4. 应用服务器接受查询结果并创建 HTML网页;5. 应用服务器用 CGI 将网页发送回 Web服务器;

6. Web服务器将网页发送回浏览器;7. HTML输出显示在客户计算机的 Web浏览器上。

Page 71: 第 五 章  SQL 编程 数据库接口技术

www.themegallery.com

Web-ServerHTTP-Request

HTML-File

Web-Server

File-SystemLoad File

FileHTML?

HTML

Execute Program

Program?Output

I/O, Network, DB

通用网关接口: CGI

Page 72: 第 五 章  SQL 编程 数据库接口技术

www.themegallery.com

两层 Web 体系结构

Page 73: 第 五 章  SQL 编程 数据库接口技术

www.themegallery.com

体系结构的简化

三层Web体系结构的弊端 多级服务器之间的交互增加了系统负载 CGI接口对每一个请求都会开始一个新进程

二层Web体系结构 应用服务器作为 Web服务器本身的一部分运

行两种实现方式

通过 Web服务器装载 Java 程序• Java servlet 定义了服务器和应用程序之间的通信接口。

更简单的方法:使用服务器端脚本语言

Page 74: 第 五 章  SQL 编程 数据库接口技术

www.themegallery.com

服务器端脚本

服务器端脚本简化了数据库与 Web连接的任务 定义嵌入可执行代码 /SQL 查询的 HTML文档 从 HTML文档输入的值可以直接在嵌入代码 /

SQL 查询中使用 当请求该文档时, Web服务器执行嵌入代

码 /SQL 查询,产生真正的 HTML文档很多服务器端脚本语言

JSP,服务器端 Javascript, ColdFusion, PHP, Jscript

VBScript, Perl, Python

Page 75: 第 五 章  SQL 编程 数据库接口技术

www.themegallery.com

服务器端脚本

Web-Server

File-SystemWeb-Server

HTTP-Request

HTML-File

Load File

File

HTML

I/O, Network, DB

Script?Output

Server Extension

HTML?

Page 76: 第 五 章  SQL 编程 数据库接口技术

www.themegallery.com

PHP

File-SystemWeb-Server

HTTP-Request

HTML-File

Load File

PHP-File

HTML

PHP-ScriptOutput

Database APIs,

other APIs SNMP,

IMAP, POP3,

LDAP, ...

PHP

Module

Web-Server

Page 77: 第 五 章  SQL 编程 数据库接口技术

www.themegallery.com

PHP

<HTML> <BODY>

<?PHP $db = mysql_connect("localhost", "dbuser"); mysql_select_db("mydb",$db); $result = mysql_query("SELECT * FROM employees",$db);?>

<TABLE BORDER=1> <TR><TD>NAME</TD><TD>POSITION</TR>

<?PHP while ($myrow = mysql_fetch_row($result)) { printf("<tr><td>%s %s</td><td>%s</td></tr>\n", $myrow[1], $myrow[2], $myrow[3]); } ?>

</TABLE></BODY></HTML>

Page 78: 第 五 章  SQL 编程 数据库接口技术

Company

LOGO

使用 PHP 访问 MySQL 数据库

Page 79: 第 五 章  SQL 编程 数据库接口技术

www.themegallery.com

提纲

PHP介绍MySQL介绍PHP 访问 MySQL 数据库

利用 PHP 数据库函数连接MySQL PHP 通过 ODBC 连接MySQL

两种方法的对比

Page 80: 第 五 章  SQL 编程 数据库接口技术

www.themegallery.com

PHP 介绍

PHP (Personal Home Page) 是一种跨平台的服务器端嵌入式脚本语言。它最初是Rasmus Lerdorf 于 1994年开发的。

在 PHP早期的版本中,提供了访客留言本、访客计数器等简单功能。随后,在第二版中增加了对 mSQL 的支持。自此奠定了PHP 在动态网页开发上的影响力,并迅速在 Internet上流传开来。

Page 81: 第 五 章  SQL 编程 数据库接口技术

www.themegallery.com

PHP 介绍

截至 2006年 8月,在全球范围内,共有超过 2000万动态站点使用着 PHP ,包括Yahoo! 等著名网站,目前有超过半数的Ajax-enabled 和 Web2.0站点选择应用PHP 。

除此之外, PHP 也是企业用来构建服务导向型、创造和混合 web服务融于新一代的综合性商业应用的语言,成为开源商业应用发展的方向。

Page 82: 第 五 章  SQL 编程 数据库接口技术

www.themegallery.com

PHP 介绍

PHP流行有以下几个原因:兼容 C 的语法,容易掌握。运行速度快。非常强的容错,很好的鲁棒性能。丰富的函数和简单的操作。

在函数支持方面, PHP 几乎覆盖了 Web 应用的各个方面,其中最有特色的是数据库函数,使用 PHP 完成一个含有数据库功能的网页非常简单,而 PHP支持的数据库也非常丰富,目前包括: Oracle 、 Sybase 、SQL Server 、 MySQL 、 Informix 等。

PHP 是开源的,在各种平台上都可以自由加入新的函数。

Page 83: 第 五 章  SQL 编程 数据库接口技术

www.themegallery.com

MySQL 介绍

MySQL 是一个快速、健壮和易用,且支持多线程、多用户的 SQL 数据库服务器。

MySQL 是一个客户机 /服务器结构的应用,它由一个服务器守护程序 mysqld 和很多不同的客户程序和库组成。

MySQL 是多平台的,是目前使用最广的开源数据库软件。

Page 84: 第 五 章  SQL 编程 数据库接口技术

www.themegallery.com

MySQL 介绍

MySQL 的主要特点 完全多线程,适于多 CPU 使用。 提供 C , C + + , JAVA (JDBC) ,

Perl , Python , PHP 和 TCL 的 API接口。 多平台,包括 :

Solaris , SunOS , BSDI , SGI AIX ,DEC UNIX , Linux , FreeBSD , SCO OpenServer , NetBSD , OpenBSD , HPUX , Win9x and NT. ( 各台支持的功能不尽相同 ) 。

Page 85: 第 五 章  SQL 编程 数据库接口技术

www.themegallery.com

MySQL 介绍

数据类型多样。 非常灵活和安全的权限系统,密码加密。 为 Win9X 提供 ODBC 接口,可通过 Access

与之相联 . 另有第三方开发商提供多样的ODBC 驱动程序。

可处理大型数据 (超过 5千万个记录 ) 。 通过权威检测,无内存泄露。 多种语言支持。

Page 86: 第 五 章  SQL 编程 数据库接口技术

www.themegallery.com

MySQL 介绍

MySQL 的快速和灵活性足以满足一个网站的信息管理工作。

因此, PHP+MySQL靠其功能强大、价格低廉、跨平台等特性,成为网站架构的绝佳组合。

Page 87: 第 五 章  SQL 编程 数据库接口技术

www.themegallery.com

PHP 访问 MySQL 数据库

PHP 访问 MySQL 数据库的方式主要有两种:

1.利用 PHP 的数据库函数连接。 PHP 对不同类型的数据库一般有不同的访问函

数,使它能够快速读取绝大多数数据库或数据源中的数据,包括DBA 、 dBase 、 Informix 、 SQL Server 、 MySQL 、 Sybase 、 Oracle 、 Postgre SQL 等等。

2. 通过 ODBC 连接

Page 88: 第 五 章  SQL 编程 数据库接口技术

www.themegallery.com

利用 PHP 数据库函数连接 MySQL

PHP函数中,针对 MySQL 数据库,常用函数有 : mysql_connect () :建立与 MySQL 服务器的连接。 mysql_create db () :建立一个新的 MySQL 数据库。 mysql_drop_db () :删除一个指定的 MySQL 数据库。 mysql_select_db () :选择一个 MySQL 数据库。 mysql_query () : 送出 query 字符串以帮助

MySQL 做相关的处理或执行。 mysql_num_rows () :本函数返回表行的数目,一般配合 SELECT 语句进行查询操作。

mysql_close () : 关闭与 MySQL 服务器的连接。

Page 89: 第 五 章  SQL 编程 数据库接口技术

www.themegallery.com

利用 PHP 数据库函数连接 MySQL

用 PHP 程序访问 MySQL 数据库的方法比较简单, 典型的步骤如下 :

(1) 用函数 mysql_connect ( string [server] , string [username] , string [password]) 建立与 MySQL 服务器的连接。 如连接成功,函数返回一个连接标识;否则,返回

FALSE ,表明连接失败。 这里,参数 server 可以写成“ host-name:po rt” 的

形式。如果函数调用中未填写参数 server , 则缺省为server = ’localhost: 3306’ ,缺省用户名为数据库服务器进程的拥有者。

Page 90: 第 五 章  SQL 编程 数据库接口技术

www.themegallery.com

利用 PHP 数据库函数连接 MySQL

(2) 用 mysql_select_db ( string database-name , resource [ link-identifier]) 函数设置与指定数据库连接标识相关的当前活动数据库。 如缺省连接标识,则使用前面已经建立的连接;

如前面没有建立连接,则函数试图建立一个连接后再设置与指定数据库连接相关的当前活动数据库。函数调用成功,返回 TRUE;否则,返回 FALSE 。

Page 91: 第 五 章  SQL 编程 数据库接口技术

www.themegallery.com

利用 PHP 数据库函数连接 MySQL

(3) 准备好符合 SQL 语言标准的语句字符串,即类似于$ sql1=“select * from table w here ….” 程序语句。

(4) 用 mysql_query(string query[ , resou rce link_identifier]) 访问数据库。

(5) 如 (4) 是查询操作,则用mysql_fetch_ array (resource result ,int [result_type])从生成的记录集中取记录。

(6) 用 mysql_close() 关闭数据库。

Page 92: 第 五 章  SQL 编程 数据库接口技术

www.themegallery.com

利用 PHP 数据库函数连接 MySQL

例程:<?php$con=mysql_connect(‘localhost’ ,’root’ ,’ adminpassword’);/*上面 localhost 是数据库服务器的名称,root 是用户名,后面一项是 root密码。 */Mysql_select_db(‘database’);/*选择一个数据库, database 代表数据库的名字 */

Page 93: 第 五 章  SQL 编程 数据库接口技术

www.themegallery.com

利用 PHP 数据库函数连接 MySQL

$query=“select * from table”;/*建立数据库操作语句, table 指表的名字 */$result=mysql_query($query ,$con);/* 执行数据库操作语句,若为查询则返回一个查询结果 id赋于 $result */

$maxrows=mysql_num_nows($result);/* 取得结果集中的记录数 */

Page 94: 第 五 章  SQL 编程 数据库接口技术

www.themegallery.com

利用 PHP 数据库函数连接 MySQL

for($i=0; $i<$maxrows; $i++){ $value=mysql_result($result , $i ,’fieldname’);

echo $value.”<br>”;}/*for循环将结果集中每一条记录的 fieldname字段的值存于变量 value 中并且将其输出到网上*/mysql_close($con);/* 关门数据库的连接 */?>

Page 95: 第 五 章  SQL 编程 数据库接口技术

www.themegallery.com

利用 PHP 数据库函数连接 MySQL

补充: PHP脚本语言在网页中要放在 <?和 ?> 或 <?php 和 ?> 之间。其中的变量必须以 $ 开头。

从代码的分析看出 PHP 主要是通过 mysql函数来实现对 MySQL 数据库的操作。

通过修改字符串 query 的值,利用函数ysql_query 可以实现对数据库的不同操作。

同理,用户可以通过其它类型数据库函数来实现对相应数据库的操作。

Page 96: 第 五 章  SQL 编程 数据库接口技术

www.themegallery.com

PHP 通过 ODBC 连接 MySQL

ODBC( 开放式数据库连接 ) 是微软推出的一种工业标准,一种开放的独立于厂商的 API 应用程序接口,可以跨平台访问各种个人计算机、小型机以及主机系统。

作为一个工业标准,绝大多数数据库厂商、大多数应用软件和工具软件厂商都为自己的产品提供了 ODBC接口,或提供了 ODBC支持。

数据库驱动程序使用 DSN(Data Source Name)定位和标识特定的 ODBC兼容数据库,将信息从Web 应用程序传递给数据库。

PHP 有内部的 ODBC函数,采用 SQL 语言可以很容易地对各种数据库进行操作。

Page 97: 第 五 章  SQL 编程 数据库接口技术

www.themegallery.com

PHP 通过 ODBC 连接 MySQL

PHP 通过 ODBC连接MySQL 数据库主要用到四个函数:

odbc_connect () :用来同 ODBC 数据源建立连接。

odbc_do () :用来在建立连接之后执行数据库查询。

odbc_result() :用于取得当前记录行中某个字段的值。

odbc_fetch_row () :用来把查询结果保存到数组,每个数组元素对应一条记录。

Page 98: 第 五 章  SQL 编程 数据库接口技术

www.themegallery.com

PHP 通过 ODBC 连接 MySQL

例程:<?php$con=odbc_connect(“ODBC 数据源”,” username” ,” password”);$query=“select * from table”;$result=odbc_do($con , $query);/* 执行查询语句,返回一个 ID赋予 result*/$maxrows=odbc_num_rows($result);/* 取得结果集 result 中的记录数 */

Page 99: 第 五 章  SQL 编程 数据库接口技术

www.themegallery.com

PHP 通过 ODBC 连接 MySQL

for($i=0; $i<$maxrows;$i++){ odbc_fetch_row($result , $i);

/* 将指针定位到第 i条记录上 */

$value=odbc_result($result ,’ fieldname’);

/* 将结果集中第 i条记录的字段’ fieldname’ 值赋予 value*/

echo $value.”<br>” /*输出 value 值 */}odbc_close($con); /* 关门连接 */?>

Page 100: 第 五 章  SQL 编程 数据库接口技术

www.themegallery.com

两种方法的对比

上述两种方法在与数据库建立连接的语法上,并没有太大差别。

相比较之下,通过 ODBC 方式存取数据库比 PHP利用数据库函数直接存取 MySQL更耗时间。

通过 ODBC接口存取数据库不必担心使用何种数据库,如Oracle , Informix , Sybase 等。它们都支持 ODBC接口,这样可减少更换数据库时需要更改程序的问题。