1k likes | 1.16k Views
第 五 章 SQL 编程 数据库接口技术. 提纲. 嵌入式 SQL ODBC JDBC PHP. 嵌入式 SQL. 为什么使用嵌入式 SQL ? 嵌入式 SQL 执行过程 需要解决的几个问题. 为什么使用嵌入式 SQL ?. 有些操作对于交互式 SQL 是 不可能的任务 SQL 的表达能力相比高级语言有一定的限制,有些数据访问要求单纯使用 SQL 无法完成。一方面, SQL 在逐渐增强自己的表达能力(参见习题 4.10 ),另一方面,太多的扩展会导致优化能力及执行效率的降低 非声明性动作
E N D
第五章 SQL编程 数据库接口技术
提纲 • 嵌入式SQL • ODBC • JDBC • PHP
嵌入式SQL • 为什么使用嵌入式SQL? • 嵌入式SQL执行过程 • 需要解决的几个问题
为什么使用嵌入式SQL? • 有些操作对于交互式SQL是不可能的任务 • SQL的表达能力相比高级语言有一定的限制,有些数据访问要求单纯使用SQL无法完成。一方面,SQL在逐渐增强自己的表达能力(参见习题4.10),另一方面,太多的扩展会导致优化能力及执行效率的降低 • 非声明性动作 • 实际的应用系统是非常复杂的,数据库访问只是其中一个部件。有些动作如与用户交互、图形化显示数据等只能用高级语言实现
主语言 + 嵌入SQL 预处理 主语言 + 函数调用 主语言编译器 主语言执行程序 嵌入式SQL执行过程
需要解决的几个问题 • 区分SQL语句与C语言语句 • 嵌入SQL语句与C语言之间的数据传递 • SQL与主语言之间操作方式的协调 • SQL语句执行信息反馈
区分SQL语句与C语言语句 嵌入的SQL语句以EXEC SQL开始,以分号(;) 或END_EXEX结束 EXEC SQLdelete from PROF where DNO = 10;
嵌入SQL与C语言之间的数据传递 • 宿主变量 • C变量,既可以用在C语句中,也可用在SQL语句中,用来在两者之间传递数据 • 宿主变量的声明 • 声明为通常的C变量,并将其放在下列标识语句之间 EXEC SQL BEGIN DECLARE SECTION EXEC SQL END DECLARE SECTION
嵌入SQL与C语言之间的数据传递 EXEC SQL BEGIN DECLARE SECTION int prof_no; char prof_name[30]; int salary; EXEC SQL END DECLARE SECTION
嵌入SQL与C语言之间的数据传递 注:宿主变量出现于SQL语句中时,前面加(:)以区别列名 宿主变量可出现的地方:SQL的数据操纵语句中可出现常数的任何地方,select,fetch等语句的into字句中 示例:EXEC SQL selectPNAME , SAL into:prof_name , :salary fromPROF wherePNO = :prof_no;
嵌入SQL与C语言之间的数据传递 • 指示变量 • C变量,用来指示返回给宿主变量的值是否为null值,以及返回给宿主变量的字符串是否发生了截断 • 指示变量应用场合 • 如果一个宿主变量所对应的数据库字段允许空值,或字符串类型的宿主变量的长度可能小于所对应的数据库字段的长度,则需要一个指示变量来指明数据库访问的返回状态 • 指示变量的返回值 • = 0:取到主变量的值不空,没有发生截断 • = 1:取到主变量的值为空值 • > 0:取到主变量的值发生了截断,指示变量的值是截断前的字符串的实际长度
嵌入SQL与C语言之间的数据传递 • 指示变量的用法 • 声明与宿主变量的声明方式一样,在数据操纵语句中,在宿主变量和指示变量之间加(:)或关键字indicator EXEC SQL BEGIN DECLARE SECTION intprof_no; char prof_name[30]; int salary; short name_id; short sal_id; EXEC SQL END DECLARE SECTION EXEC SQL select PNAME , SAL into:prof_name: name_id , :salary: sal_id fromPROF wherePNO = :prof_no;
SQL与主语言之间操作方式的协调 • 执行方式的差别 • SQL:一次一集合 • C语言:一次一记录 • 游标 • 在查询结果的记录集合中移动的指针 • 若一个SQL语句返回单个元组,则不用游标 • 若一个SQL语句返回多个元组,则使用游标
SQL语句执行信息反馈 • 良好的应用程序必须提供对错误的处理,应用程序需要知道SQL语句是否正确执行了,发生错误时的错误代码,执行时遇到特殊情况时的警告信息 • SQL通讯域SQLCA是一结构,每一嵌入SQL语句的执行情况在其执行完成后写入SQLCA结构中的各变量中, 根据SQLCA中的内容可以获得每一嵌入SQL语句执行后的信息,应用程序就可以做相应的处理 • 为了说明 (USERCA),必须在应用程序中包括: EXEC SQL INCLUDE SQLCA;
JDBC ADO ODBC 是执行SQL语句的Java API ,由一组用Java语言编写的类与接口组成。 微软最新的数据访问技术 ,用以实现访问关系或非关系数据库中的数据。 Microsoft推出的最早的整合异质数据库的数据库接口,现在已成为一种事实上的标准。 数据库接口技术的分类
ODBC ODBC : Open DataBase Connectivity 开放式数据库联接 Microsoft引进这种技术的一个主要目的是,以非语言专用的方式,提供给程序员一种访问数据库内容的简单方法。
ODBC的产生背景 • 关系型数据库产生后很快就成为数据库系统的主流产品,由于每个DBMS厂商都有自己的一套标准,人们很早就产生了标准化的想法,于是产生了SQL,由于其语法规范逐渐为人所接受,成为RDBMS上的主导语言。最初,各数据库厂商为了解决互连的问题,往往提供嵌入式SQLAPI,用户在客户机端要操作系统中的RDBMS时,往往要在程序中嵌入SQL语句进行预编译。由于不同厂商在数据格式、数据操作、具体实现甚至语法方面都具有不同程度的差异,所以彼此不能兼容。
ODBC的产生 • 1991年11月,微软宣布了ODBC,次年推出可用版本。 • 1992年2月,推出了ODBCSDK2.0版。 • ODBC基于SAG的SQLCAE草案所规定的语法,共分为Core、Level1、Level2三种定义,分别规范了22、16、13共51条命令,其中29条命令甚至超越了SAGCLI中原有的定义,功能强大而灵活。它还包括标准的错误代码集、标准的连接和登录DBMS方法、标准的数据类型表示等。
ODBC的发展 • 由于当时ODBC思想上的先进性,且没有同类的标准或产品与之竞争,它一枝独秀,推出后仅仅两三年就受到了众多厂家与用户的青睐,成为一种广为接受的标准。目前,已经有130多家独立厂商宣布了对ODBC的支持,常见的DBMS都提供了ODBC的驱动接口,这些厂商包括Oracle、Sybase、Informix、Ingres、IBM(DB/2)、DEC(RDB)、HP(ALLBASE/SQL)、Gupta、Borland(Paradox)等。目前,ODBC已经成为客户机/服务器系统中的一个重要支持技术。
ODBC的基本思想 ODBC 基本思想 为用户提供简单、标准、透明的数据库连接的公共编程接口 。 开发厂商根据ODBC的标准去实现底层的驱动程序 。
ODBC与传统方式的比较 ODBC 传统方式
1 2 3 使用户程序有很高的互操作性,相同的目标代码适用于不同的DBMS 由于ODBC的开放性,它为程序集成提供了便利,为客户机/服务器结构提供了技术支持 由于应用与底层网络环境和DBMS分开,简化了开发维护上的困难 ODBC的特点
ODBC的体系结构和实现 • ODBC是依靠分层结构来实现的 • 具体分为四层: • 应用程序 • 驱动程序管理器 • 驱动程序 • 数据源
Application Drive manager Drive Data sourse 体系结构 应用程序 驱动程序管理器 驱动程序 数据源
应用程序层 • 使用ODBC接口的应用程序可执行以下任务: • 请求与数据源的连接和会话(SQLConnect) • 向数据源发送SQL请求(SQLExecDirct或SQLExecute) • 对SQL请求的结果定义存储区和数据格式 • 请求结果 • 处理错误 • 如果需要,把结果返回给用户 • 对事务进行控制,请求执行或回退操作(SQLTransact) • 终止对数据源的连接(SQLDisconnect)。
驱动程序管理程序功能 处理几个ODBC的初始化调用 为每一个驱动程序提供ODBC函数入口地点 为ODBC提供提供参数和次数验证
驱动程序功能 • 建立与数据源的连接 • 向数据源提交请求 • 在应用程序需求时,转换数据格式 • 返回结果给应用程序 • 将运行错误格式化为标准代码返回 • 在需要时说明和处理光标。
DBMS 操作系统 数据源的组成 数据源 网络环境 数据
ODBC的接口函数 • I.连接数据源(Connecting to a Data Source) • SQLAllocEnv • SQLAllocConnect • SQLConnect • SQLPriverConnect • SQLBrowseConnect • II.取得驱动程序及数据源的相关讯息 • SQLDataSource • SQLGetInfo • SQLGetFunctions • SQLGetTypeInfo. • III.设定及取得驱动程序的选项 • SQLSetConnectOption • SQLGetConnectOption • SQLSetStmtOption • SQLGetStmtOption.
ODBC的接口函数 • IV.准备SOL指令之需求 • SQLAllocStmt • SQLPrepare • SQLSetParam • SQLParamOptions • SQLGetCursorName • SQLSetCursorName • SQLSetScrollOptions. • V.传送及执行需求 • SQLExecute • SQLExecDirect • SQLNativeSql • SQLDescribeParanl • SQLNumParams • SQLParamData • SQLPutData.
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
ODBC的接口函数 • VIII.结束 SQL 指令需求 • SQLFreeStmt • SQLCancel • SQLTransact • IX.结束与数据源的连接 • SQLDisconnect • SQLFreeConnect • SQLFreeEnv
ODBC程序流程 • 为ODBC分配环境句柄 • 分配一个连接句柄 • 连接到数据库 • 用SQL命令分配一个语句句柄 • 传送该命令 • 关闭连接 • 解除连接和环境句柄
ODBC实例 • 应用程序要访问一个数据库,首先必须用ODBC管理器注册一个数据源,管理器根据数据源提供的数据库位置、数据库类型及ODBC驱动程序等信息,建立起ODBC与具体数据库的联系。这样,只要应用程序将数据源名提供给ODBC,ODBC就能建立起与相应数据库的连接。 • 在ODBC中,ODBC API不能直接访问数据库,必须通过驱动程序管理器与数据库交换信息。驱动程序管理器负责将应用程序对ODBC API的调用传递给正确的驱动程序,而驱动程序在执行完相应的操作后,将结果通过驱动程序管理器返回给应用程序。
ODBC实例(续1) • 实现步骤: • 1. 设置ODBC数据源 • 步骤是控制面板->管理工具->数据源(ODBC)。这里将加入一个本用户的数据源local,连接到本地的SQL Server 2000服务器上。 • 选择添加数据源,选择SQL Server的驱动。完成相关的设置之后就可以看到本地的DSN中多了一个名为local的数据源。如图所示:
ODBC实例(续2) 设置完之后就可以在程序中使用ODBC的API来连接到数据库了。
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); • }
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); • }
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); • }
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; • }
执行结果 ODBC实例(续7)
JDBC简介 • JDBC概述 • JDBC技术特点 • JDBC编程框架 • 实例介绍
JDBC概述 • JDBC的诞生 • SUN公司开发的一个以Java语言为接口的数据库应用程序开发的接口。 • 在JDK1.x版本中,JDBC只是一个可选部件,到了JDK1.1公布时,SQL类包(也就是JDBCAPI)就成Java语言的标准部件。 • 在JDBC2.0中,JDBC中的一系列可选的扩展对连接过程进行了改进。 • JDBC重要性 • JDBC扩展了Java的能力。 • 随着越来越多的程序开发人员使用Java语言,对Java访问数据库易操作性的需求越来越强烈。
JDBC概述 • JDBC和ODBC及其他API的比较 • 正如Java被设计成与硬件平台无关那样,JDBC也被设计成向开发者提供某种程度的数据库无关性。 • ODBC并不适合在Java中直接使用。ODBC是一个C语言实现的API,从Java程序调用本地的C程序会带来一系列类似安全性、完整性、健壮性的缺点。 • 完全精确地实现从C代码ODBC到JavaAPI写的ODBC的翻译也并不令人满意。 • JDBC这样的JavaAPI对于纯Java方案来说是必须的。
JDBC技术特点 • JDBC 是一种用于执行 SQL 语句的 Java API,它由一组用 Java 编程语言编写的类和接口组成,可以使用它来访问数据库和执行SQL 语句。 • JDBC 为工具/数据库开发人员提供了一个标准的 API,使他们能够用纯Java API 来编写数据库应用程序。 • JDBC对Java程序员而言是API,对实现与数据库连接的服务提供商而言是接口模型。作为API,JDBC为程序开发提供标准的接口,并为数据库厂商及第三方中间件厂商实现与数据库的连接提供了标准方法。
JDBC技术特点 JDBC 的结构
JDBC技术特点 • JDBC规范提供了数据库厂商必须实现的接口集合。目前有四种不同类型的实现。
JDBC编程框架 • JDBC能完成下列三件事: • 同一个数据库建立连接; • 向数据库发送SQL语句; • 处理数据库返回的结果。 • JDBC的接口 • 一个是面向程序开发人员的JDBC API • 一个是底层的JDBC Driver API。