1、第第9章章 数据库互连方法数据库互连方法v 数据库互连的目的 为了方便用户的应用程序能访问不同的数据库系统。v 数据库互连 连接不同的RDBMS的方法、技术和软件。v 两个影响比较大的互连方法v ODBCv JDBC第第9章章 数据库互连方法数据库互连方法9.1 学习目标学习目标9.2 数据库互连原理数据库互连原理 9.3 ODBC简介简介 9.4 ODBC的工作流程的工作流程9.5 JDBC简介简介9.6 JDBC的工作流程的工作流程9.7 小结小结9.1 学习目标学习目标 v学完本章后,读者应具备以下能力:了解数据库互连的目的和原理。了解ODBC的组成结构。能在Windows环境下建立数据
2、源。了解JDBC的组成结构。理解不同类型JDBC驱动程序对应用程序结构的影响。掌握JDBC常用类和接口,并会进行查询和更新处理。第第9章章 数据库互连方法数据库互连方法9.1 学习目标学习目标9.2 数据库互连原理数据库互连原理 9.3 ODBC简介简介 9.4 ODBC的工作流程的工作流程9.5 JDBC简介简介9.6 JDBC的工作流程的工作流程9.7 小结小结9.2 数据库互连原理数据库互连原理 v 关系数据库管理系统(RDBMS)国外 Oracle(Oracle公司的产品)Sybase(Sybase公司的产品)DB2、Informix(IBM公司的产品)SQL Server、Visua
3、l FoxPro、Access(Microsoft公司的产品)TeraData(NCR公司的产品)国内 OpenBase(东软公司的产品)DM2(达梦公司的产品)Kingbase ES(人大金仓公司的产品)v 不同系统之间的差异 支持和实现SQL语句的程度不同;有的支持SQL-89,有的支持SQL-92的基本集。SQL语句实现的策略和细节有许多不同。支持的数据类型和精度常常不同。提供的应用编程接口(Application Programming Interface,API)不同。嵌入式SQL语言语法细节会有差别。存储过程不同等。v 导致的问题 应用程序只能在特定的RDBMS环境下运行,适应性和
4、可移植性较差。9.2 数据库互连原理数据库互连原理(续续)v 解决方案 在应用系统和不同的RDBMS之间加一层中间件。v 中间件=数据库调用转换接口 把应用系统中对数据库的标准调用转换成对某一个特定的RDBMS的调用。v 目标 应用程序与具体的RDBMS平台相隔离。当应用程序连接的RDBMS平台改变时,不必改写应用程序。提高了应用系统与RDBMS的独立性。使应用系统具有良好的可移植性。9.2 数据库互连原理数据库互连原理(续续)数据库调用转换接口OracleDB2SQL Server数据库A数据库B数据库C应用系统1应用系统n客户端网络服务器图9.1 数据库互连原理 9.2 数据库互连原理数据
5、库互连原理第第9章章 数据库互连方法数据库互连方法9.1 学习目标学习目标9.2 数据库互连原理数据库互连原理 9.3 ODBC简介简介 9.4 ODBC的工作流程的工作流程9.5 JDBC简介简介9.6 JDBC的工作流程的工作流程9.7 小结小结9.3 ODBC简介简介 9.3.1 ODBC原理概述原理概述 9.3.2 ODBC驱动程序的分类驱动程序的分类 9.3.1 ODBC原理概述原理概述v ODBC:提供了一套数据库应用程序接口规范。规范包括:为应用程序提供的一套调用层接口函数(call-level interface,为CLI)基于动态链接库的运行支持环境v 使用ODBC开发数据库
6、应用程序时,应用程序调用的是ODBC函数和SQL标准语句。v ODBC已经成为数据库之间互连的事实标准。用户应用程序ODBC APIODBC Driver ManagerDriver 1Driver 2Driver nEasybase标准接口微软提供网络.Sybase SQL ServerOracle图9.2 ODBC的构成 9.3.1 ODBC原理概述原理概述v ODBC的组成 ODBC API标准接口 一组驱动程序v 数据库调用转换接口的组成 ODBC驱动程序管理器(ODBC Driver Manager)一组RDBMS驱动程序(ODBC Driver)v ODBC的功能 ODBC通过使用
7、驱动程序(driver)来提供数据库独立性。进行数据库操作的数据源对应用程序是透明的。所有的数据库操作由对应的DBMS的ODBC Driver完成。9.3.1 ODBC原理概述原理概述v 驱动程序是一个用以支持ODBC函数调用的模块(通常是一个DLL)。v 驱动程序的特点 一种RDBMS平台提供一种RDBMS驱动程序。不同的驱动程序一般由不同的RDBMS厂商开发和提供,例如Oracle公司提供Oracle驱动程序,Sybase公司提供Sybase驱动程序。9.3.1 ODBC原理概述原理概述v 驱动程序的作用 应用程序通过调用驱动程序所支持的函数来操作数据库。若想使应用程序操作不同类型的数据库
8、,就要动态地链接到不同的驱动程序上。v 驱动程序管理器 驱动程序管理器由微软公司提供。驱动程序管理器包含在ODBC.DLL(或在32位版的ODBC的ODBC32.DLL中),可链接到所有的ODBC应用程序中。负责管理应用程序中ODBC函数与DLL中函数的绑定。9.3.1 ODBC原理概述原理概述v 不同人员的作用:作为一个应用程序开发人员要了解如何使用ODBC提供的调用接口和运行支持环境来编写、调试和运行应用程序。作为一个系统管理人员要了解如何安装ODBC驱动程序管理器和不同RDBMS的驱动程序。作为RDBMS厂商则要了解如何开发自己的ODBC驱动程序,使自己的产品更加开放。9.3.1 ODB
9、C原理概述原理概述(续续)v应用程序应该包括的内容 请求连接数据库。向数据源发送SQL语句。为SQL语句执行结果分配存储空间,定义所读取的数据格式。获取数据库操作结果或处理错误。进行数据处理并向用户提交处理结果。请求事务的提交和回滚操作。断开与数据源的连接。1.应用程序应用程序9.3.1 ODBC原理概述原理概述(续续)v 驱动程序管理器用来管理系统中存在的各种驱动程序。v 驱动程序管理器的主要功能装载ODBC驱动程序选择和连接正确的驱动程序管理数据源检查ODBC调用参数的合法性记录ODBC函数的调用等当应用层需要时提供驱动程序信息v ODBC驱动程序管理器的功能建立、配置或删除数据源查看系统
10、当前所安装的数据库ODBC驱动程序9.3.1 ODBC原理概述原理概述(续续)2.驱动程序管理器驱动程序管理器v ODBC与驱动程序的关系 ODBC通过驱动程序提供应用系统与数据库平台的独立性。v 驱动程序与DBMS的关系 驱动程序与具体的DBMS有关。例如,若要对Oracle数据库操作就要用Oracle的驱动程序,若要对Sybase数据库操作就要用Sybase的驱动程序。v 驱动程序的具体形式 驱动程序是一个支持ODBC函数调用的模块,通常是一个动态连接库DLL。v 驱动程序的工作流程n ODBC应用程序的各种操作请求由驱动程序管理器提交给某个RDBMS的ODBC驱动程序。n 调用驱动程序所
11、支持的函数来存取数据库。n 数据库的操作结果也通过驱动程序返回给应用程序。9.3.1 ODBC原理概述原理概述(续续)3.数据库驱动程序数据库驱动程序9.3.1 ODBC原理概述(续)原理概述(续)v驱动程序的功能 建立与相应RDBMS的连接。向连接的RDBMS提交用户的SQL语句。根据应用程序的要求,将发送给该RDBMS的请求以及从RDBMS返回的数据进行数据格式和类型的转换。向应用程序返回处理结果。将执行过程中RDBMS返回的错误代码转换为ODBC定义的标准错误代码,返回给应用程序。根据需要说明和使用游标。vODBC与驱动程序的关系 ODBC的主要部分是驱动程序。某一个RDBMS的驱动程序
12、了解它所对应的RDBMS并与该数据库进行通信。不要求驱动程序支持ODBC规范中的所有功能。ODBC为驱动程序定义了API和SQL语法的不同级别。ODBC对驱动程序的唯一要求是,当驱动程序符合某一级别时,它应该支持在该级别上ODBC所定义的所有功能,而不管底层数据库是否支持这些功能。9.3.1 ODBC原理概述(续)原理概述(续)v 数据源名(Data Source Name,DSN)应用程序与数据库系统连接的桥梁,它为ODBC驱动程序管理器指出数据库服务器名称以及用户的默认连接参数等。v 在连接中,用数据源名来代表用户名、服务器名、所连接的数据库名等。v 数据源名可被看成是与一个具体数据库建立
13、的连接。9.3.1 ODBC原理概述(续)原理概述(续)4.ODBC数据源管理数据源管理例如,假设某个学校在MS SQL Server 数据库管理系统上建立了两个数据库:学校人事数据库 教学科研数据库。u 两个数据源名 为学校人事数据库创建一个数据源名PERSON,PERSON就称为一个DSN。为教学科研数据库创建一个名为EDU的数据源。u 当要访问每一个数据库时,只要与PERSON和EDU连接即可,不需要记住使用的驱动程序、服务器名称、数据库名等。9.3.1 ODBC原理概述(续)原理概述(续)9.3.1 ODBC原理概述(续)原理概述(续)v例例 9.1 建立数据源SExample,连接到
14、SQL Server的事例数据库S_C_SC。选择“开始”“控制面板”“管理工具”“数据源(ODBC)”,打开“ODBC数据源管理器”对话框;从该对话框中选择“系统DSN”选项卡,如图9.3所示。单击“添加”按钮,打开“创建新数据源”对话框,如图9.4所示;在此对话框的“名称”列表框中选择“SQL Server”。图9.3 添加DSN 图9.4 选择驱动程序 单击“完成”按钮,在打开的“创建到SQL Server 的新数据源”对话框中,将数据源命名为SExample,选择本机的一个SQL Server实例,服务器名为LSNMOBILE,实例名是MYSQL,如图9.5所示。图9.5 选择服务器9
15、.3.1 ODBC原理概述(续)原理概述(续)录入登录名和密码。输入数据库S_C_SC的用户名“Manager”,密码为空,如图9.6所示。图9.6 录入登录名和密码 9.3.1 ODBC原理概述(续)原理概述(续)选择数据库。设置数据库为S_C_SC,如图9.7所示。选择日志文件等参数。所有的参数选择默认值,如图9.8所示。图9.7 选择数据库 图9.8 选择日志文件等 9.3.1 ODBC原理概述(续)原理概述(续)9.3 ODBC简介简介 9.3.1 ODBC原理概述原理概述 9.3.2 ODBC驱动程序的分类驱动程序的分类 9.3.2 ODBC驱动程序的分类(续)驱动程序的分类(续)v
16、ODBC驱动程序的分类(三个方面)驱动程序的分类(三个方面)API一致性级别SQL语法一致性级别驱动程序类型1.API一致性级别一致性级别 驱动程序的开发者一般不能实现所有的ODBC函数。API一致性级别决定了应用程序所能调用的函数的种类。API一致性分为三个级别:核心级扩展1级扩展2级 这三个级别只是驱动程序开发者的一种指导性原则。(1)核心级)核心级API 基本的功能:n 分配n 释放环境句柄n 连接句柄n 执行SQL语句 核心级的驱动程序的基本功能:n 向语句中传入参数n 存取执行结果n 目录操作n 错误跟踪(2)扩展)扩展1级级APIn 扩展1级在核心级的基础上增加了部分函数,通过这些
17、函数就可以在应用程序中动态地了解表的模式,可用的数据类型等。n 大多数的驱动程序支持扩展1级API。n 在编写应用程序时即使不清楚数据库中表的模式,依然能够在运行时动态地对表进行操作,这就是扩展1级API最大的优点。9.3.2 ODBC驱动程序的分类(续)驱动程序的分类(续)2.SQL语法一致性级别语法一致性级别 ODBC的SQL语句一致性分为三个级别:最低限(Minimum)的SQL语法核心(Core)SQL语法扩展(Extended)SQL语法(1)最低限)最低限SQL语法语法n最低限SQL语法包括:CREAT、DROP表,SELECT、INSERTE、UPDATE、DELETE记录。n支
18、持常用的数据类型和若干字符类型及其变形,如CHAR、VARCHAR、LONGVARCHAR等。9.3.2 ODBC驱动程序的分类(续)驱动程序的分类(续)9.3.2 ODBC驱动程序的分类(续)驱动程序的分类(续)(2)核心)核心SQL语法语法 核心SQL语法增加的功能n 包括ALTER表,CREATE和DROP索引。n GRANT和REVOKE各种权限给不同的用户。n 在SQL语句中嵌套子查询,还增加了一些数据类型,如短整数和长整数、单精度浮点数和双精度浮点数等。(3)扩展)扩展SQL语法语法n 引进了更复杂的语法,例如游标控制语句。n 增加了日期、时间、二进制数据类型和时间戳(TIMEST
19、AMP)等其他复杂数据类型。3.驱动程序类型驱动程序类型 n 单层驱动程序(SINGLE-TIER DRIVER)n 多层驱动程序(MULTI-TIER DRIVER)9.3.2 ODBC驱动程序的分类(续)驱动程序的分类(续)v 单层驱动程序既具有ODBC功能,也能处理SQL语句,它实际上就是一个DBMS。v 单层驱动程序的系统结构如图9.9所示。应用程序驱动程序管理器(单层)驱动程序(包含数据库引擎)数据库文件图9.9 基于单层驱动程序的系统结构 ODBC API调用 返回数据 ODBC 驱动程序调用 返回数据 命令 返回数据 9.3.2 ODBC驱动程序的分类(续)驱动程序的分类(续)v
20、 单层驱动程序不仅要处理ODBC函数调用,还要解释执行SQL语句,即执行RDBMS的功能。v 单层驱动程序实际上具备一个RDBMS的功能。9.3.2 ODBC驱动程序的分类(续)驱动程序的分类(续)v多层驱动程序中ODBC功能与DBMS功能相分离。驱动程序负责处理ODBC应用程序中的函数调用。处理SQL语句的任务由DBMS完成。v多层驱动程序与数据库管理系统的功能是分离的。多层驱动程序只处理应用程序的ODBC函数调用和数据转换。SQL语句则由驱动程序传递给相应的数据库引擎,数据库引擎解释执行SQL语句,实现用户的各种操作请求。9.3.2 ODBC驱动程序的分类(续)驱动程序的分类(续)v基于多
21、层ODBC驱动程序的数据库应用程序适合于客户/服务器结构,如图9.10所示。v客户端 应用程序 驱动程序管理器 数据库驱动程序 网络支撑软件服务器端 数据库引擎 数据库文件 网络软件9.3.2 ODBC驱动程序的分类(续)驱动程序的分类(续)ODBC数据库应用程序驱动程序管理器(多层)驱动程序客户端网络支撑软件服务器端网络支撑软件数据库引擎(RDBMS)数据库 ODBC API调用 返回数据 ODBC 驱动程序调用 返回数据 数据库接口调用 返回数据 数据库引擎调用 返回数据 客户端 服务器端 图 9.10 基于多层驱动程序的系统结构 9.3.2 ODBC驱动程序的分类(续)驱动程序的分类(续
22、)v多层驱动程序与单层驱动程序的差别 驱动程序是否具有数据库引擎功能。效率的差异也很大。基于单层驱动程序的应用程序把存放数据库的服务器作为文件服务器使用,在网络中传输的是整个数据库文件,所以网络的数据通信量很大。采用多层驱动程序的应用程序使用客户/服务器结构,在数据库服务器上实现对数据库的各种操作,在网络中传输的只是用户请求和数据库处理的结果,从而使网络的通信量大大减少,提高了应用程序的运行效率。9.3.2 ODBC驱动程序的分类(续)驱动程序的分类(续)第第9章章 数据库互连方法数据库互连方法9.1 学习目标学习目标9.2 数据库互连原理数据库互连原理 9.3 ODBC简介简介 9.4 OD
23、BC的工作流程的工作流程9.5 JDBC简介简介9.6 JDBC的工作流程的工作流程9.7 小结小结9.4 ODBC的工作流程的工作流程v 使用ODBC的应用系统的大致工作流程 建立ODBC环境。建立ODBC连接。由应用程序自动建立ODBC连接 由驱动程序管理器建立ODBC连接 让用户登录并提供数据源名 应用程序把数据源名传送给ODBC驱动程序管理器 由驱动程序管理器建立ODBC连接,包括与相应的驱动程序、数据库服务器、数据库等建立连接。ODBC确认连接成功后才继续执行应用程序。否则,向应用程序返回出错信息。建立语句句柄。执行SQL语句。u 对于单层驱动程序 由该单层驱动程序完成对数据库的存取
24、操作并把结果返回给应用程序。u 对于多层驱动程序l 由该驱动程序把应用程序的这些请求转换为数据库引擎RDBMS所接受的格式l 传送给RDBMS去处理l 数据库操作结果将由RDBMS首先发回给驱动程序l 驱动程序再将这些数据按照标准的格式传送给应用程序l 前端应用程序处理结果 9.4 ODBC的工作流程(续)的工作流程(续)终止。l 应用程序终止前首先要释放语句句柄。l 释放数据库连接。l 与数据库服务器断开。l 释放ODBC环境。vODBC函数 ODBC为应用程序提供的一套接口调用函数。可以分为以下几组:分配和释放环境句柄、连接句柄、语句句柄连接执行SQL语句接受结果事务控制错误处理和其他9.
25、4 ODBC的工作流程(续)的工作流程(续)9.4 ODBC的工作流程的工作流程 9.4.1 建立和释放建立和释放ODBC环境环境 9.4.2 建立和释放建立和释放ODBC连接连接 9.4.3 连接和断开数据源连接和断开数据源 9.4.4 分配和释放语句句柄分配和释放语句句柄 9.4.5 执行执行SQL语句语句 9.4.6 结果集处理结果集处理9.4.1 建立和释放建立和释放ODBC环境环境1.创建创建ODBC环境环境 v 应用系统在调用任何ODBC函数之前,首先初始化ODBC,建立一个ODBC环境,分配一个环境句柄(Environment Handle)。v 每个应用只建立一个环境,在这个环
26、境中可以建立多个连接。v 完成这个环境设置的函数是:SQLRETURN SQLAllocHandle(SQLSMALLINT HandleType,SQLHANDLE InputHandle,SQLHANDLE*OutputHandlePtr);v 参数OutputHandlePtr将返回环境句柄的内存地址指针。函数的返回值是SQL_SUCCESS时,表示环境句柄分配成功。如果返回值是SQL_ERROR,则表示分配不成功。ODBC环境一经创建就具有与应用程序相同的生存周期。v 例如:SQLHENV henv1;SQLAllocHandle(SQL_HANDLE_ENV,SQL_NULL_HAN
27、DLE,&henv1);2、释放、释放ODBC环境环境v 在结束应用系统之前,必须释放为该应用系统所保留的所有资源。完成这一过程的ODBC函数是:SQLRETURN SQLFreeHandle(SQLSMALLINT HandleType,SQLHANDLE Handle);v 当返回值是SQL_SUCCESS时,表示环境句柄已经被释放。在使用这个函数之前切断与所有数据源的连接,否则SQLFreeHandle将返回SQL_ERROR,表示不能释放环境句柄。v 例如:SQLAllocHandle(SQL_HANDLE_ENV,henv1);9.4.1 建立和释放建立和释放ODBC环境环境(续续)
28、9.4 ODBC的工作流程的工作流程 9.4.1 建立和释放建立和释放ODBC环境环境 9.4.2 建立和释放建立和释放ODBC连接连接 9.4.3 连接和断开数据源连接和断开数据源 9.4.4 分配和释放语句句柄分配和释放语句句柄 9.4.5 执行执行SQL语句语句 9.4.6 结果集处理结果集处理9.4.2 建立和释放建立和释放ODBC连接连接1.建立建立ODBC连接连接v应用系统对每一个要连接的数据源都必须建立一个ODBC连接,分配一个连接句柄(Connection Handle)。v完成这一分配过程的ODBC函数:SQLRETURN SQLAllocHandle(SQLSMALLINT
29、 HandleType,SQLHANDLE InputHandle,SQLHANDLE*OutputHandlePtr);其中,参数InputHandle是应用系统的环境句柄指针。执行这个函数,驱动程序管理器将为连接分配内存,并通过OutputHandlePtr返回指向连接句柄的内存地址的指针。如果函数的返回值是SQL_SUCCESS,则表示连接成功,该连接句柄有效。如果返回值是SQL_ERROR,表示用户选择了一个数据源,但是发生了某种错误连接没有成功,所以这个连接句柄也无效。例如:SQLHDBC hdbc1;SQLAllocHandle(SQL_HANDLE_DBC,henv1,&hdbc
30、1);2.释放释放ODBC连接连接v 当一个应用系统不再需要一个连接句柄时,应该释放该句柄所分配的所有资源。实现这一功能的函数如下:SQLRETURN SQLFreeHandle(SQLSMALLINT HandleType,SQLHANDLE Handle);其中,参数Handle是连接句柄。例如:SQLAllocHandle(SQL_HANDLE_DBC,hdbc1);9.4.2 建立和释放建立和释放ODBC连接(续)连接(续)9.4 ODBC的工作流程的工作流程 9.4.1 建立和释放建立和释放ODBC环境环境 9.4.2 建立和释放建立和释放ODBC连接连接 9.4.3 连接和断开数据
31、源连接和断开数据源 9.4.4 分配和释放语句句柄分配和释放语句句柄 9.4.5 执行执行SQL语句语句 9.4.6 结果集处理结果集处理9.4.3 连接和断开数据源连接和断开数据源1.连接数据源连接数据源v 连接数据源的函数有多种,但最有效的、最通用的是SQLConnect函数。SQLConnect函数将加载一个RDBMS的驱动程序,并建立与该数据库的连接。v SQLConnect函数的格式:SQLRETURN SQLConnect(SQLHDBC ConnectionHandle,SQLCHAR*ServerName,SQLSMALLINT NameLength1,SQLCHAR*User
32、Name,SQL SMALLINT NameLength2,SQLCHAR*Authentication,SQLSMALLINT NameLength3);ConnectionHandle:一个已经分配的连接句柄;ServerName:一个字符串,表示应用系统所要连接的数据源名称;NameLength1:数据源字符串的长度;UserName:用户标识符;NameLength2:用户标识符的长度;Authentication:权限字符串,一般是口令;NameLength3:权限字符串的长度。v 在大多数程序中并不编写固定用户名和口令,而是由系统向用户询问这些信息,这种方法可以防止他人获取对数据库
33、的存取权,并允许用户按一定规律修改口令。v 例如:SQLConnect(hdbc1,sademo,SQL_NTS,dba,SQL_NTS,sql,SQL_NTS);该例以用户名“dba”和口令“sql”连接数据源“sademo”。9.4.3 连接和断开数据源(续)连接和断开数据源(续)2、断开数据源、断开数据源 当有关的数据库存取任务完成之后,应该断开与数据源的连接,关闭与指定连接句柄相关的数据源。这个操作可由SQLDisconnect函数完成。SQLRETURN SQLDisconnect(SQLHDBC ConnectionHandle);参数ConnectionHandle是要断开的连接
34、句柄。函数的返回值略。例如:SQLDisconnect(hdbc1);9.4 ODBC的工作流程的工作流程 9.4.1 建立和释放建立和释放ODBC环境环境 9.4.2 建立和释放建立和释放ODBC连接连接 9.4.3 连接和断开数据源连接和断开数据源 9.4.4 分配和释放语句句柄分配和释放语句句柄 9.4.5 执行执行SQL语句语句 9.4.6 结果集处理结果集处理9.4.4 分配和释放语句句柄分配和释放语句句柄1.分配语句句柄分配语句句柄vSQL的执行函数用于处理和传递SQL语句,这类函数都要求一个有效的语句句柄作为参数,就像创建ODBC环境和连接那样要分配一个环境句柄和连接句柄。vSQ
35、LAllocHandle函数可以为语句句柄分配内存空间,并将此句柄与指定的连接句柄建立关联。应用系统必须先用SQLAllocHandle函数为SQL语句分配内存空间,然后才能利用语句句柄引用SQL语句。vSQLAllocHandle函数的格式是:SQLRETURN SQLAllocHandle(SQLSMALLINT HandleType,SQLHANDLE InputHandle,SQLHANDLE*OutputHandlePtr);其中,HandleType是句柄的类型,这里是SQL_HANDLE_STMT,InputHandle是一个有效的、且已经与某一个数据源连接的连接句柄,Outpu
36、tHandlePtr是一个指向语句句柄存储区的指针。例如:SQLHSTMT hstmt1;SQLAllocHandle(SQL_HANDLE_STMT,hdbc1,&hstmt1);9.4.4 分配和释放语句句柄(续)分配和释放语句句柄(续)2.释放语句句柄释放语句句柄v SQLFreeStmt函数的功能是解除某一个语句句柄与相应的SQL语句的关联(停止指定与语句句柄相关的SQL语句),关闭与该句柄相关的游标,撤销所有未完成的操作结果,有选择地释放与该句柄相关的所有资源。v SQLRETURN SQLFreeStmt(SQLHSTMT StatementHandle,SQLUSMALLINT
37、Option);StatementHandle是一个有效的语句句柄;Option通过传递如下4个值中的一个,指定释放这个句柄的哪些资源。Option参数的含义如下:SQL_CLOSE:用于撤销所有未完成的操作结果,并关闭任何与句柄相关的游标。利用这个选项,必要时可以重复使用这个句柄。SQL_DROP:用于释放所有与该句柄相关的资源。如果SQLFreeStmt的执行成功,则该句柄将不再有效。SQL_UNBIND:用于释放所有连编(Bind)的列,这个参数仅当执行了SQLBindCol函数时才有效。SQL_RESET_PARAAMS:用于释放所有联编的参数,这个参数仅当执行了SQLBindPara
38、meter函数时才有效。v应用系统可以连续调用SQLFreeStmt函数,每次选用不同的参数,达到有选择地释放某些资源的效果。例如:SQLFreeStmt(hstmt1,SQL_DROP);9.4.4 分配和释放语句句柄(续)分配和释放语句句柄(续)v在一个ODBC应用程序中,环境句柄、连接句柄、语句句柄之间存在以下关系(图9.11):ODBC应用程序 环境句柄 连接句柄 数据源 语句句柄 1 1 1 n 1 1 1 n 图9.11应用程序句柄之间的关系 9.4.4 分配和释放语句句柄(续)分配和释放语句句柄(续)v 一个ODBC应用程序只能建立一个ODBC环境,分配一个环境句柄(图9.11中
39、用连线旁的1:1表示)。v 一个环境句柄可以建立多个连接句柄(图9.11中用连线旁的1:n表示)。v 每一个连接句柄实现与一个数据源之间的连接。v 在一个连接中可以建立多个语句句柄,每一个语句句柄引用一个SQL语句。9.4.4 分配和释放语句句柄(续)分配和释放语句句柄(续)9.4 ODBC的工作流程的工作流程 9.4.1 建立和释放建立和释放ODBC环境环境 9.4.2 建立和释放建立和释放ODBC连接连接 9.4.3 连接和断开数据源连接和断开数据源 9.4.4 分配和释放语句句柄分配和释放语句句柄 9.4.5 执行执行SQL语句语句 9.4.6 结果集处理结果集处理9.4.5 执行执行S
40、QL 语句语句v当应用系统通过ODBC执行SQL语句时,ODBC提供了两种不同的执行方法:直接执行以快捷的方式执行SQL语句。有准备的执行提供更大的灵活性。1.直接执行直接执行v SQLExecDirect函数能够直接执行一条准备好的SQL语句,如果语句有参数,则由函数带参调用,将参数传递给语句。v SQLExecDirect是将SQL语句最快执行的方法。函数的格式如下:SQLRETURN SQLExecDirect(SQLHSTMT StatementHandle,SQLCHAR*StatementText,SQLINTEGER TextLength);StatementHandle 是一个
41、有效的语句句柄。StatementText 是一个表示将要执行的SQL语句的字符串。TextLength是StatementText字符串的长度。例如,要查询“学生表”中的所有信息,若以直接执行的方法,则调用SQLExecDirect的格式是:SQLExecDirect(hstmt1,”SELECT*FROM 学生”,SQL_NTS)其中,SQL_NTS是ODBC的一个常数;如果将要执行的SQL语句的字符串是以NULL为结尾的字符串,SQL_NTS表示字符串的长度。9.4.5 执行执行SQL 语句(续)语句(续)2、有准备的执行、有准备的执行v 如果SQL语句需要执行几次或者在执行之前需要有关
42、的结果集合准备信息,最好采用有准备的执行函数。v 有准备的执行SQL语句需要两个函数:SQLPrepare SQLExecutev 应用系统首先执行SQLPrepare,为重复执行SQL语句做好准备。然后,调用SQLExecute函数来执行SQL语句。v SQLPrepare函数的格式:SQLRETURN SQLPrepare(SQLHSTMT StatementHandle,SQLCHAR*StatementText,SQLINTEGER TextLength);StatementHandle 是一个有效的语句句柄。StatementText 是一个表示将要执行的一连串SQL语句的字符串。T
43、extLength 是StatementText字符串的长度。9.4.5 执行执行SQL 语句(续)语句(续)v SQLExecute函数的格式:SQLRETURN SQLExecute(SQLHSTMT StatementHandle);参数StatementHandle:是一个有效的语句句柄。例如,要查询“学生”表中的所有信息,若以有准备执行的方法,则函数调用格式如下:SQLPrepare(hstmt1,”SELECT*FROM 学生”,SQL_NTS);SQLExecute(hstmt1);9.4.5 执行执行SQL 语句(续)语句(续)9.4 ODBC的工作流程的工作流程 9.4.1
44、建立和释放建立和释放ODBC环境环境 9.4.2 建立和释放建立和释放ODBC连接连接 9.4.3 连接和断开数据源连接和断开数据源 9.4.4 分配和释放语句句柄分配和释放语句句柄 9.4.5 执行执行SQL语句语句 9.4.6 结果集处理结果集处理9.4.6 结果集处理结果集处理1、增、删、改操作、增、删、改操作对于增、删、改操作,可以使用SQLRowCount函数返回UPDATE、INSERT、DELETE语句所影响的行数。SQLRowCount函数的格式:SQLRETURN SQLRowCount(SQLHSTMT StatementHandle,SQLINTEGER*RowCount
45、Ptr);StatementHandle是一个有效的语句句柄 RowCountPtr是指向存放结果行数变量的指针。2、查询操作、查询操作查询语句要返回一个结果集。使用ODBC函数SQLNumResultCols()和SQLRowCount()可以获得结果集的行数和列数。SQLNumResultCols函数的格式如下:SQLRETURN SQLNumResultCols(SQLHSTMT StatementHandle,SQLSMALLINT*ColumnCountPtr);StatementHandle是一个有效的语句句柄 ColumnCountPtr是指向存放结果列数变量的指针。v结果集数据
46、的处理 ODBC中使用游标来处理结果集数据。ODBC中的游标与嵌入式SQL中的游标模型相同,它们的不同之处在于游标的打开方式。ODBC中有多种类型的游标,不同类型的游标有不同的特点。最常用的游标类型是forward-only游标,它只能在结果集中向前滚动,是ODBC的默认游标类型。返回给应用程序的结果集数据存放在应用程序的变量中。9.4.6 结果集处理结果集处理(续续)v SQLBindCol函数的格式如下:SQLRETURN SQLBindCol(SQLHSTMT StatementHandle,SQLUSMALLINT ColumnNumber,SQLSMALLINT TargetType
47、,SQLPOINTER TargetValuePtr,SQLINTEGER BufferLength,SQLLEN*StrLen_or_Ind);其中,StatementHandle 是一个有效的语句句柄。ColumnNumber 是要绑定的结果数据的列号。TargetType 是存放结果数据的变量类型。TargetValuePtr 是指向存放结果数据的变量指针。BufferLength 是存放结果数据的变量的缓冲区大小。StrLen_or_Ind 是输出真正返回的数据的长度。9.4.6 结果集处理结果集处理(续续)v 应用程序使用SQLFetch函数移动游标,并返回所有由SQLBindCol
48、函数绑定的列的结果数据。v SQLFetch函数的格式是:SQLRETURN SQLFetch(SQLHSTMT StatementHandle);参数StatementHandle是一个有效的语句句柄。v SQLFetch函数每次返回一行数据,并把游标向前滚动一行。当游标位于结果集的末尾时,SQLFetch函数返回SQL_NO_DATA_FOUND。例如:SQLCHAR Sno11,Sname10;SQLINTEGER SnoInd,SnameInd;SQLRETURN rc;SQLHSTMT hstmt;9.4.6 结果集处理结果集处理(续续)v SQLGetData函数的格式如下:SQL
49、RETURN SQLGetData(SQLHSTMT StatementHandle,SQLUSMALLINT ColumnNumber,SQLSMALLINT TargetType,SQLPOINTER TargetValuePtr,SQLINTEGER BufferLength,SQLINTEGER*StrLen_or_IndPtr);StatementHandle 是一个有效的语句句柄。ColumnNumber 是结果数据的列号。TargetType 是存放结果数据的变量的类型。TargetValuePtr 是数据存储区的指针。BufferLength 是缓冲区的最大长度。StrLen_
50、or_IndPtr 是本次调用之前rgbValue中可以返回的字节总数。9.4.6 结果集处理结果集处理(续续)第第9章章 数据库互连方法数据库互连方法9.1 学习目标学习目标9.2 数据库互连原理数据库互连原理 9.3 ODBC简介简介 9.4 ODBC的工作流程的工作流程9.5 JDBC简介简介9.6 JDBC的工作流程的工作流程9.7 小结小结9.5 JDBC简介简介 9.5.1 JDBC原理概述原理概述 9.5.2 JDBC驱动程序的分类驱动程序的分类 9.5.1 JDBC原理概述原理概述v Sun公司为了解决程序的跨平台性,推出了Java语言独有的JDBC(Java Database