欢迎来到三一办公! | 帮助中心 三一办公31ppt.com(应用文档模板下载平台)
三一办公
全部分类
  • 办公文档>
  • PPT模板>
  • 建筑/施工/环境>
  • 毕业设计>
  • 工程图纸>
  • 教育教学>
  • 素材源码>
  • 生活休闲>
  • 临时分类>
  • ImageVerifierCode 换一换
    首页 三一办公 > 资源分类 > PPT文档下载  

    数据库基础与应用第09章开放数据库互连.ppt

    • 资源ID:6296412       资源大小:283.50KB        全文页数:77页
    • 资源格式: PPT        下载积分:15金币
    快捷下载 游客一键下载
    会员登录下载
    三方登录下载: 微信开放平台登录 QQ登录  
    下载资源需要15金币
    邮箱/手机:
    温馨提示:
    用户名和密码都是您填写的邮箱或者手机号,方便查询和重复下载(系统自动生成)
    支付方式: 支付宝    微信支付   
    验证码:   换一换

    加入VIP免费专享
     
    账号:
    密码:
    验证码:   换一换
      忘记密码?
        
    友情提示
    2、PDF文件下载后,可能会被浏览器默认打开,此种情况可以点击浏览器菜单,保存网页到桌面,就可以正常下载了。
    3、本站不支持迅雷下载,请使用电脑自带的IE浏览器,或者360浏览器、谷歌浏览器下载即可。
    4、本站资源下载后的文档和图纸-无水印,预览文档经过压缩,下载后原文更清晰。
    5、试题试卷类文档,如果标题没有明确说明有答案则都视为没有答案,请知晓。

    数据库基础与应用第09章开放数据库互连.ppt

    第9章 开放数据库互连(ODBC),9.1 数据库互连概述9.2 ODBC的工作原理概述9.3 使用ODBC的系统结构9.4 ODBC驱动程序的分类9.5 ODBC的工作流程,退出,9.1 数据库互连概述,提出和产生ODBC的根本原因是不同的数据库管理系统的存在。目前,广泛使用的关系数据库管理系统(RDBMS)有几十种,最常用的也有十几种。,它们之间有许多差异。例如:支持和实现SQL语句的程度不同(有的支持SQL89的基本集,有的支持SQL92的基本集);SQL语句实现的策略和细节有许多不同;支持的数据类型和精度常常不同;,提供的应用编程接口(Application Programming Interface,简记为API)不同;嵌入式SQL语言语法细节不同;存储过程不同。因此,在某个RDBMS下开发的应用系统就不能在另一个RDBMS下运行。,使数据库系统“开放”,能够彼此相互通信、相互操作、相互访问,简言之能够“数据库互连”。其中开放数据库互连(Open DataBase Connecting,简记为ODBC),是Microsoft公司推出的产品。由于Microsoft公司的地位,ODBC成为数据库之间互连的事实标准。,9.2 ODBC的工作原理概述,开放数据库互连(ODBC)接口是Microsoft公司开放的服务结构(WOSA)中有关数据库的一个组成部分,用于访问数据库的标准调用接口。使用ODBC接口的应用程序可以访问多种不同的数据库系统,同时应用程序对数据库的操作不依赖于任何数据库管理系统,实现应用程序对不同DBMS资源的共享。,为了使一个应用程序能访问不同的数据库系统,人们设想如果应用程序使用标准的数据库调用接口来与数据库互操作,在应用系统和不同的RDBMS之间加一层中间件数据库调用转换接口,由该中间件把应用系统中对数据库的标准调用转换成对某一个特定的RDBMS的调用,如图9.1所示。这样,应用程序与具体的RDBMS平台相隔离,当应用程序连接的RDBMS平台改变时不必改写应用程序,提高了应用系统与RDBMS的独立性,从而使应用系统具有良好的可移植性。这就是ODBC的基本思想。,ODBC提供了一套数据库应用程序接口规范。这套规范包括:为应用程序提供的一套调用层接口函数(Call-Level Interface,简写为CLI)和基于动态连接库的运行支持环境。图9.1中数据库调用转换接口则由ODBC驱动程序管理器(ODBC Driver Manager)和一组RDBMS驱动程序(ODBC Driver)构成,如图9.2所示。ODBC通过使用驱动程序(driver)来提供数据库独立性,进行数据库操作的数据源对应用程序是透明的,所有的数据库操作由对应的DBMS 的ODBC Driver完成。,驱动程序是一个用以支持ODBC函数调用的模块(通常是一个DLL)。ODBC的另一个组件是驱动程序管理器(driver manager)。驱动程序管理器由Microsoft公司提供。驱动程序管理器包含在ODBC.DLL(或在32位版的ODBC的ODBC32.DLL中),可链接到所有ODBC应用程序中。,9.3 使用ODBC的系统结构,使用ODBC开发应用系统时,系统的体系结构如图9.2所示,它由四部分构成:(1)应用程序。(2)驱动程序管理器(ODBC Driver Manager)。(3)数据库驱动程序(ODBC Driver)。(4)数据库平台,包括某一个RDBMS和数据库。,9.3.1 应用程序应用层的应用程序提供用户界面、应用逻辑和事务逻辑。使用ODBC开发数据库应用程序时,应用程序调用标准的ODBC函数和SQL语句。应用层使用ODBC调用接口与数据库进行交互。使用ODBC的接口规范来编写应用程序时,应用程序应该包括的内容有:,(1)请求连接数据库。(2)向数据源发送SQL语句。(3)为SQL语句执行结果分配存储空间,定义所读取的数据格式。(4)获取数据库操作结果;或处理错误。(5)进行数据处理并向用户提交处理结果。(6)请求事务的提交和回滚操作。(7)断开与数据源的连接。下面将使用ODBC开发应用系统的应用程序简称为ODBC应用程序。,9.3.2 驱动程序管理器驱动程序管理器是Microsoft公司ODBC的一部分。顾名思义,驱动程序管理器是用来管理系统中存在的各种驱动程序的。驱动程序管理器的主要功能包括装载ODBC驱动程序、选择和连接正确的驱动程序、管理数据源、检查ODBC调用参数的合法性和记录ODBC函数的调用等,以及当应用层需要时提供驱动程序信息。,9.3.3 数据库驱动程序ODBC是通过驱动程序来提供应用系统与数据库平台的独立性的。驱动程序与具体的RDBMS有关。驱动程序的功能包括以下几个方面:(1)建立与相应RDBMS的连接。(2)向连接的RDBMS提交用户的SQL语句。,(3)根据应用程序的要求,将发送给该RDBMS的数据以及从RDBMS返回的数据进行数据格式和类型转换。(4)向应用程序返回处理结果。(5)将执行过程中RDBMS返回的错误代码转换为ODBC定义的标准错误代码,返回给应用程序。(6)根据需要说明和使用游标。,9.3.4 ODBC数据源管理数据源名(Data Source Name,简称DSN)是应用程序与数据库系统连接的桥梁,它为ODBC驱动程序管理器指出数据库服务器名称,以及用户的默认连接参数等。注意,这里的数据源并不是指某一个数据库,而是用于表达ODBC驱动程序和一个RDBMS特殊连接的命名。,9.4 ODBC驱动程序的分类,因此根据功能和运行模式的不同,驱动程序可以分为多种级别,具体可以从API一致性级别、SQL语法一致性级别和驱动程序类型三个方面来分类。,9.4.1 API一致性级别驱动程序的开发者一般不能实现所有的ODBC函数。API一致性级别决定了应用程序所能调用的函数的种类。API一致性分为三个级别:核心级API;扩展1级API;扩展2级API。,1核心级API核心级API包括最基本的功能,它们构成了驱动程序的核心。核心级API包括分配、释放环境句柄、连接句柄和执行SQL语句等。核心级的驱动程序还能完成其他一些基本的功能,如向语句中传入参数、存取执行结果、目录操作和错误跟踪等。2扩展1级API扩展1级API在核心级API的基础上增加了部分函数,通过这些函数就可以在应用程序中动态地了解表的模式和可用的数据类型等。大多数驱动程序支持扩展1级API。,3扩展2级API扩展2级API在扩展1级API的基础上又增加了部分函数,通过它们可以了解关于主码和外码的信息,表和列的权限信息,以及数据库存储过程的信息等。扩展2级API还提供了强有力的游标和并发控制功能,这是它受欢迎的最主要的原因。,9.4.2 SQL语法一致性级别SQL语法一致性分为三个级别:最低限的SQL语法;核心SQL语法;扩展SQL语法。,1最低限SQL语法最低限SQL语法可以满足大多数应用程序对数据库的操作要求,包括CREATE和DROP表,SELECT、INSERTE、UPDATE和DELETE记录,支持常用的数据类型和若干字符类型及其变形,如CHAR、VARCHAR和LONGVARCHAR等。,2核心SQL语法核心SQL语法在最低限SQL语法的基础上增加了很多必要的功能,包括ALTER表,CREATE和DROP索引,GRANT和REVOKE各种权限给不同的用户。此外,可以在SQL语法中嵌套子查询,还增加了一些数据类型,如短整数和长整数、单精度浮点数和双精度浮点数等。,3扩展SQL语法 扩展SQL语法引进了更复杂的语法,如游标控制语句。增加了日期、时间、二进制数据类型和时间戳(TIMESTAMP)等其他复杂数据类型。,9.4.3 驱动程序类型ODBC驱动程序可以分为单层驱动程序(SINGLETIER DRIVER)和多层驱动程序(MULTITIER DRIVER)。单层驱动程序既具有ODBC功能也处理SQL语句,它实际上就是一个DBMS。多层驱动程序中ODBC功能与DBMS功能相分离,驱动程序负责处理ODBC应用程序中的函数调用,而处理SQL语句的任务由DBMS完成。单层驱动程序的系统结构如图9.3所示。,单层驱动程序不仅要处理ODBC函数调用,还要解释执行SQL语句,即执行RDBMS的功能。多层驱动程序只处理应用程序的ODBC函数调用和数据转换。SQL语句则由驱动程序传递给相应的数据库引擎,由数据库引擎解释执行SQL语句,实现用户的各种操作请求。,9.5 ODBC的工作流程,本节讲解使用ODBC的应用系统大致的工作流程,使读者对一个ODBC会话过程中,应用程序如何通过ODBC进行通信,执行对数据库的操作有一个概要了解。1建立ODBC环境2建立ODBC连接3建立语句句柄4执行SQL语句5终止,例如:SQLHENV henv1;SQLAllocHandle(SQL_HANDLE_ENV,SQL_NULL_HANDLE,&henv1);,2释放ODBC环境在结束应用系统之前,必须释放为该应用系统保留的所有资源。完成这一过程的ODBC函数是:SQLRETURN SQLFreeHandle(SQLSMALLINT HandleType,SQLHANDLE Handle);例如:SQLAllocHandle(SQL_HANDLE_ENV,henv1);,9.5.2 建立和释放ODBC连接1建立ODBC连接应用系统对每一个要连接的数据源都必须建立一个ODBC连接,分配一个连接句柄(Connection Handle)。SQLRETURN SQLAllocHandle(SQLSMALLINT HandleType,SQLHANDLE InputHandle,SQLHANDLE*OutputHandlePtr);,其中,参数InputHandle是应用系统的环境句柄指针。例如:SQLHDBC hdbc1;SQLAllocHandle(SQL_HANDLE_DBC,henv1,&hdbc1);,2释放ODBC连接当一个应用系统不再需要一个连接句柄时,应该释放该句柄所分配的所有资源。实现这一功能的函数是:SQLRETURN SQLFreeHandle(SQLSMALLINT HandleType,SQLHANDLE Handle);其中,参数Handle是连接句柄。例如:SQLAllocHandle(SQL_HANDLE_DBC,hdbc1);,9.5.3 连接和断开数据源1连接数据源分配了环境句柄和连接句柄之后,就可以连接ODBC的数据源了。连接数据源的函数有多种,但最有效的、最通用的是SQLConnect函数。SQLConnect函数将加载一个RDBMS的驱动程序,并建立与该数据库的连接。,SQLConnect函数的格式是:SQLRETURN SQLConnect(SQLHDBC ConnectionHandle,SQLCHAR*ServerName,SQLSMALLINT NameLength1,SQLCHAR*UserName,SQLSMALLINT NameLength2,SQLCHAR*Authentication,SQLSMALLINT NameLength3);,其中,参数ConnectionHandle 是一个已经分配的连接句柄;ServerName是一个字符串,表示应用系统所要连接的数据源名称;NameLength1是数据源字符串的长度。,例如:SQLConnect(hdbc1,sademo,SQL_NTS,dba,SQL_NTS,sql,SQL_NTS);该例以用户名“dba”和口令“sql”连接数据源“sademo”。,2断开数据源当有关的数据库存取任务完成之后,应该断开与数据源的连接,关闭与指定连接句柄相关的数据源。这个操作可由SQLDisconnect函数完成。SQLRETURN SQLDisconnect(SQLHDBC ConnectionHandle);,其中,参数ConnectionHandle是要断开的连接句柄。函数的返回值略。例如:SQLDisconnect(hdbc1);,9.5.4 分配和释放语句句柄1分配语句句柄SQL的执行函数用于处理和传递SQL语句,这类函数都要求一个有效的语句句柄作为参数,就像创建ODBC环境和连接一样要分配一个环境句柄和连接句柄。,SQLAllocHandle函数可以为语句句柄分配内存存储区,并将此句柄与指定的连接句柄建立关联。SQLAllocHandle函数的格式是:SQLRETURN SQLAllocHandle(SQLSMALLINT HandleType,SQLHANDLE InputHandle,SQLHANDLE*OutputHandlePtr);,其中,参数HandleType是句柄的类型,这里是SQL_HANDLE_STMT;参数InputHandle是一个有效的、且已经与某一个数据源连接的连接句柄;参数OutputHandlePtr是一个指向语句句柄存储区的指针。,例如:SQLHSTMT hstmt1;SQLAllocHandle(SQL_HANDLE_STMT,hdbc1,&hstmt1);,2释放语句句柄SQLFreeStmt函数的功能是解除某一个语句句柄与相应的SQL语句的关联(停止指定与语句句柄相关的SQL语句),关闭与该句柄相关的游标,撤消所有未完成的操作结果,有选择地释放与该句柄相关的所有资源。SQLRETURN SQLFreeStmt(SQLHSTMT StatementHandle,SQLUSMALLINT Option);,其中,参数StatementHandle是一个有效的语句句柄;Option通过传递如下4个值中的一个,指定释放这个句柄的哪些资源。Option参数的含义如下:SQL_CLOSE用于撤消所有未完成的操作结果,并关闭任何与句柄相关的游标。利用这个选项,必要时可以重复使用这个句柄。,SQL_DROP用于释放所有与该句柄相关的资源。如果SQLFreeStmt的执行成功,则该句柄将不再有效。SQL_UNBIND 用于释放所有联编(Bind)的列,这个参数仅当执行了SQLBindCol函数时才有效。SQL_RESET_PARAAMS 用于释放所有联编的参数,这个参数仅当执行了SQLBindParameter函数时才有效。,例如:SQLFreeStmt(hstmt1,SQL_DROP);我们可以小结一下在一个ODBC应用程序中,环境句柄、连接句柄和语句句柄之间有以下关系(见图9.5):,9.5.5 执行SQL语句当应用系统通过ODBC执行SQL语句时,ODBC提供了两种不同的执行方法:直接执行和有准备的执行。1直接执行SQLExecDirect函数能够直接执行一条准备好的SQL语句,如果语句有参数,则由函数带参调用,将参数传递给语句。,SQLRETURN SQLExecDirect(SQLHSTMT StatementHandle,SQLCHAR*StatementText,SQLINTEGER TextLength);其中,参数StatementHandle是一个有效的语句句柄;StatementText是一个表示将要执行的SQL语句的字符串;TextLength是StatementText字符串的长度。,SQLExecDirect(hstmt1,SELECT*FROM 学生,SQL_NTS)其中,SQL_NTS是ODBC的一个常数,如果将要执行的SQL语句的字符串是以NULL为结尾的字符串,则SQL_NTS表示字符串的长度。,2有准备的执行如果SQL语句需要执行几次或者在执行之前需要有关的结果集合准备信息,则采用有准备的执行函数更佳。有准备的执行SQL语句需要两个函数:SQLPrepare和SQLExecute。应用系统首先执行SQLPrepare,为重复执行SQL语句作好准备。然后,调用SQLExecute函数来执行SQL语句。SQLPrepare函数的格式是:,SQLRETURN SQLPrepare(SQLHSTMT StatementHandle,SQLCHAR*StatementText,SQLINTEGER TextLength);其中,参数StatementHandle 是一个有效的语句句柄;StatementText 是一个表示将要执行的一连串SQL语句的字符串;TextLength 是StatementText字符串的长度。函数的返回值略。,SQLExecute函数的格式是:SQLRETURN SQLExecute(SQLHSTMT StatementHandle);其中,参数StatementHandle是一个有效的语句句柄。函数的返回值略。,例如,“查询学生表中的所有信息”,若以有准备执行的方法,则函数调用格式是:SQLPrepare(hstmt1,SELECT*FROM 学生,SQL_NTS);SQLExecute(hstmt1);SQL语句的有准备执行方式通常用于复杂的带有参数的SQL语句。这时,在执行该语句之前,需要使用SQLBindParameter函数把参数值绑定到SQL语句上。,SQLBindParameter函数的格式是:SQLRETURN SQLBindParameter(SQLHSTMT StatementHandle,/*一个有效的语句句柄*/SQLUSMALLINT ParameterNumber,/*要绑定的参数号*/SQLSMALLINT InputOutputType,/*参数类型*/SQLSMALLINT ValueType,/*参数变量的C语言类型*/,SQLSMALLINT ParameterType,/*参数的SQL类型*/SQLUINTEGER ColumnSize,/*参数对应的列的宽度*/SQLSMALLINT DecimalDigits,/*参数对应的列的标度*/SQLPOINTER ParameterValuePtr,/*指向参数变量的指针*/SQLINTEGER BufferLength,/*参数变量缓冲区的长度*/SQLINTEGER*StrLen_or_IndPtr);/*参数指示变量的指针*/,例如,根据输入的商品号修改该商品的价格信息:SQLREAL Price;SQLUINTEGER PartID;SQLINTEGER PartIDInd=0,PriceInd=0;,/*准备SQL语句,以便以后多次执行SQLPrepare(hstmt,UPDATE Parts SET Price=?WHERE PartID=?,SQL_NTS);,/*把变量绑定到SQL语句上SQLBindParameter(hstmt,1,SQL_PARAM_INPUT,SQL_C_FLOAT,SQL_REAL,7,0,&Price,0,&PriceInd);SQLBindParameter(hstmt,2,SQL_PARAM_INPUT,SQL_C_ULONG,SQL_INTEGER,10,0,&PartID,0,&PartIDInd);,/*重复执行SQL语句while(GetPrice(&PartID,&Price)SQLExecute(hstmt);9.5.6 结果集的处理对数据库的增、删、改操作(SQL的INSERT、DELETE、UPDATE等语句)一般返回操作所影响的行数,如将更新的行数。对数据库的查询操作一般会得到一个结果集合,用户如何使用ODBC函数来处理这些结果集呢?,1增、删、改操作对于增、删、改操作,可以使用SQLRowCount函数返回INSERT、DELETE、UPDATE语句所影响的行数。SQLRowCount函数的格式是:SQLRETURN SQLRowCount(SQLHSTMT StatementHandle,SQLINTEGER*RowCountPtr);其中,StatementHandle是一个有效的语句句柄;RowCountPtr是指向存放结果行数变量的指针。,2查询操作查询(SELECT)语句要返回一个结果集。使用ODBC函数SQLNumResultCols()和SQLRowCount()可以获得结果集的行数和列数。SQLNumResultCols函数的格式是:SQLRETURN SQLNumResultCols(SQLHSTMT StatementHandle,SQLSMALLINT*ColumnCountPtr);,其中,StatementHandle是一个有效的语句句柄;ColumnCountPtr是指向存放结果列数变量的指针。ODBC中使用游标来处理结果集数据。ODBC对于每一个存储在一个临时的存储区里集合,系统都自动产生一个游标(Cursor),当结果集合刚刚产生时,游标指向第一行数据。,ODBC中有多种类型的游标,不同类型的游标有不同的特点。最常用的游标类型是forward-only游标,它只能在结果集中向前滚动,它是ODBC的默认游标类型。返回给应用程序的结果集数据存放在应用程序的变量中,因此,在从数据库中取回数据之前,必须绑定存放结果集数据的变量缓冲区。这通过SQLBindCol函数实现。,SQLBindCol函数的格式如下:SQLRETURN SQLBindCol(SQLHSTMT StatementHandle,SQLUSMALLINT ColumnNumber,SQLSMALLINT TargetType,SQLPOINTER TargetValuePtr,SQLINTEGER BufferLength,SQLLEN*StrLen_or_Ind);,其中,StatementHandle 是一个有效的语句句柄;ColumnNumber 是要绑定的结果数据的列号;TargetType 是存放结果数据的变量类型;TargetValuePtr 是指向存放结果数据的变量指针;BufferLength 是存放结果数据的变量的缓冲区大小;StrLen_or_Ind 是输出真正返回的数据的长度。,应用程序使用SQLFetch函数移动游标,并返回所有由SQLBindCol函数绑定的列的结果数据。SQLFetch函数的格式是:SQLRETURN SQLFetch(SQLHSTMT StatementHandle);其中,参数StatementHandle是一个有效的语句句柄。SQLFetch函数每次返回一行数据,并把游标向前滚动一行。当游标位于结果集的末尾时,SQLFetch函数返回SQL_NO_DATA_FOUND。,例如:SQLCHAR Sno11,Sname10;SQLINTEGER SnoInd,SnameInd;SQLRETURN rc;SQLHSTMT hstmt;,/*执行SQL语句,得到所需要的男学生的学号和姓名SQLExecDirect(hstmt,SELECT 学号,姓名 FROM 学生 WHERE 性别=男;,SQL_NTS);/*把变量Sno和Sname分别绑定到学号和姓名列SQLBindCol(hstmt,1,SQL_C_CHAR,Sno,sizeof(Sno),&SnoInd);SQLBindCol(hstmt,2,SQL_C_CHAR,Sname,sizeof(Sname),&SnameInd);,/*取回并打印数据while(rc=SQLFetch(hstmt)!=SQL_NO_DATA)if(SnoInd=SQL_NULL_DATA)printf(NULL);else printf(%10s,Sno);if(SnameInd=SQL_NULL_DATA)printf(NULLn);else printf(%10s n,Sname);,如果没有使用SQLBindCol给列绑定缓冲区,则SQLFetch只向前推动游标,并不返回结果数据。用SQLGetData函数可以获取游标所指向的数据。SQLGetData函数的格式如下:,SQLRETURN SQLGetData(SQLHSTMT StatementHandle,SQLUSMALLINT ColumnNumber,SQLSMALLINT TargetType,SQLPOINTER TargetValuePtr,SQLINTEGER BufferLength,SQLINTEGER*StrLen_or_IndPtr);,其中,参数StatementHandle 是一个有效的语句句柄;ColumnNumber 是结果数据的列号;TargetType 是存放结果数据的变量的类型;TargetValuePtr 是数据存储区的指针;BufferLength 是缓冲区的最大长度;StrLen_or_IndPtr 是本次调用之前rgbValue中可以返回的字节总数。,

    注意事项

    本文(数据库基础与应用第09章开放数据库互连.ppt)为本站会员(牧羊曲112)主动上传,三一办公仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对上载内容本身不做任何修改或编辑。 若此文所含内容侵犯了您的版权或隐私,请立即通知三一办公(点击联系客服),我们立即给予删除!

    温馨提示:如果因为网速或其他原因下载失败请重新下载,重复下载不扣分。




    备案号:宁ICP备20000045号-2

    经营许可证:宁B2-20210002

    宁公网安备 64010402000987号

    三一办公
    收起
    展开