您好,欢迎访问三七文档
当前位置:首页 > 商业/管理/HR > 销售管理 > 第9章 数据库访问与系统建模要点
9.1数据库访问概述9.2嵌入式SQL第9章数据库访问与系统建模9.3数据库接口技术9.4数据库系统建模方法9.1数据库访问概述应用程序与SQL数据库联系的基本方式有:(1)嵌入式SQL或者动态SQL(2)数据库接口(3)SQL模块借助高级语言的功能实现过程化控制与高级计算。通过应用程序编程接口(API)函数中的参数--SQL语句,来使用数据库。利用SQL扩展过程包的功能编程,调用程序模块,来操作数据库。SQL模块是对SQL语句的过程化扩展,常用于数据库服务器的编程。9.2嵌入式SQL一、概述SQL分:交互式嵌入式为何引入嵌入式:过程化应用复杂数据处理主语言作用:负责控制流程及处理操纵结果。嵌入式SQL作用:负责操纵DB。两种实现方法:预编译扩充、修改主语言编译程序使之能处理SQL预编译方法:预处理程序宿主语言语句+函数调用宿主语言编译程序目标程序连接程序可执行程序OS运行结果宿主语言语句+嵌入式SQL语句9.2嵌入式SQL二、嵌入式SQL的工作原理1.嵌入式SQL与主语言的接口SQL语句:面向集合主语言语句:过程性、记录式(1)状态变量SQLSTATE描述系统当前状态和运行情况\0×××××一般类别特殊子类SQLSTATE的格式在每一个SQL语句执行之后,DBMS将描述当前工作状态和运行环境的一个状态值放入SQLSTATE中。(2)主变量SQL语句中使用的主语言程序变量称为主变量。输入主变量由应用程序对其赋值,SQL语句引用。输出主变量由SQL语句对其赋值或置状态,返应用程序。9.2嵌入式SQL(3)游标(Cursor)游标是系统开设的一个数据缓冲区,存放SQL语句的执行结果。作用:用户可以通过游标获取纪录,并赋给主变量,交主语言处理。游标名……………...…………….……………..一条纪录主变量游标指针SQL查询结果9.2嵌入式SQL2、嵌入式SQL需解决的问题:(1)如何区分SQL与主语言语句?前缀加EXECSQL,结束处用END—EXEC(或用分号)例:嵌入到C程序中:EXECSQLSQL语句;嵌入到Java程序中:#SQL{SQL语句};(2)如何区分主变量与SQL的列变量?主变量前加冒号。如::Cname(3)主变量与SQL的列变量如何交互、转换?需要有一种机制:能将SQL中的集合量逐个送入主变量内,供主程序使用。方法:用一组游标语句。9.2嵌入式SQL3、SQL语句与主语言间的通信:1)主语言向SQL语句提供参数;2)向主语言传递SQL的执行状态;3)将SQL操作结果交主语言进一步处理嵌入式SQL工作原理:主语言程序SQL语句……游标…主变量SQL状态①执行参数②执行状态结果状态③9.2嵌入式SQL三、嵌入式SQL的程序组成嵌入式SQL语句可分为:可执行语句(数据定义、控制、操纵)说明性语句(说明变量、游标)程序的主要部分(1)DECLARE段(用于定义主变量)格式:EXECSQLBEGINDECLARESECTION;……//主变量说明EXECSQLENDDECLARESECTION;(2)CONNECT语句(建立SQL连接)格式:EXECSQLCONNECTTOSQL服务器或数据库名USER用户名;9.2嵌入式SQL(3)WHENEVER语句使用WHENEVER语句可以简化每条嵌入式SQL语句后编写检查SQLSTATE值的程序。WHENEVER语句通知预编译程序如何处理三种异常:WHENEVERSQLERROR:通知预编译程序产生处理错误的代码(SQLSTATE0).WHENEVERSQLWARNING:通知预编译程序产生处理警报的代码(SQLSTATE=1).WHENEVERNOTFOUND:通知预编译程序产生没有查到内容的代码(SQLSTATE=100).9.2嵌入式SQL用户可指定预编译程序采取以下行为:WHENEVER…GOTO:通知预编译程序产生一条转移语句。WHENEVER…CONTINUE:通知预编译程序让程序控制流转入到下一个主语言语句。WHENEVER…CALL:通知预编译程序调用函数。其完整语法如下:WHENEVER{SQLWARNING|SQLERROR|NOTFOUND}{CONTINUE|GOTOstmt_label|CALLfunction()}(4)应用程序体若干可执行SQL语句及主语言语句。提交和退出数据库:COMMITWORKRELEASE;9.2嵌入式SQL四、嵌入式SQL的使用技术1.无游标的操作说明性语句数据定义语句数据控制语句数据插入语句非当前形式的UPDATE、DELETE语句语句查询结果为单记录的SELECT2.带游标的查询操作查询结果为多记录。当前形式的UPDATE、DELETE语句9.2嵌入式SQL游标语句作用:把对集合的操作转换为对单个记录的处理。使用游标的步骤为:(1)定义游标分配缓冲区并对应查询语句。格式:EXECSQLDECLARE游标名CURSORFORSELECT语句;9.2嵌入式SQL(2)打开游标执行相应的语句,把查询结果取到缓冲区中。格式:EXECSQLOPEN游标名;(3)推进游标推进游标指针并取当前记录。格式:EXECSQLFETCH游标名INTO:主变量1,:主变量2,…(4)关闭游标释放缓冲区及其他资源。格式:EXECSQLCLOSE游标名;查询语句游标名SELECT结果12…n主变量9.2嵌入式SQL[例9.6]使用游标的示例。#includestdio.hEXECSQLBEGINDECLARESECTIONVARCHARuid[20];INTst_no;CHARc_no[4];FLOATsc_grade;EXECSQLENDDECLARESECTION;/*SQL中使用的主变量说明*/voidmain(){strcpy(uid,”YIN”);EXECSQLWHENEVERSQLEXCEPTIONGOTOerror_abort;EXECSQLCONNECTTOstudent_dbUSER:uid;/*建立与DB的连接*/printf(“connectedtostudent_dbbyUser%s\n”,uid);EXECSQLDECLAREcu1CURSORFOR/*定义游标*/SELECTsno,cno,gradeFROMscWHEREsno=:st_no;scanf(“pleaseenterthestudentno:%d”,st_no);EXECSQLOPENcu1;/*打开游标*/9.2嵌入式SQLEXECSQLWHENEVERNOTFOUNDDOBREAK;printf(“snocourse_nograde\n”);for(;;){EXECSQLFETCHcu1INTO:st_no,:c_no,:sc_grade;/*推进游标*/printf(“%-10d,%-4s,%-8.2f\n”,st_no,c_no,sc_grade);}EXECSQLCLOSEcu1;/*关闭游标*/EXECSQLWHENEVERSQLEXCEPTIONCONTINUE;EXECSQLCOMMITWORKRELEASE;/*提交并退出DB*/EXECSQLDISCONNECTCURRENT;/*撤消当前连接*/exit(0);}五、动态SQL动态SQL:程序运行时动态指定SQL语句。有3种基本形式:(1)条件可变(2)数据库对象、查询条件均可变(3)语句可变实现方式:1.直接执行的动态SQL方法:定义一个串主变量,程序在执行时提示输入SQL语句。2.带动态参数的动态SQL方法:在SQL语句中含有临时占位变量,在此语句执行前,程序提示输入相应参数以取代这些变量。3.查询类的动态SQL(用于查询结果为集合且需返回的情况)方法:定义一个串主变量,程序在执行时动态设置或提示输入SQL语句。一般需用游标。五、动态SQL动态SQL执行过程:(1)执行PREPARE语句要求DBMS分析、确认和优化语句,并为其生成执行计划。语句格式:PREPARE语句名FROM:主变量功能:接收含有SQL语句的主变量,并把该语句送到DBMS。DBMS编译该语句并生成执行计划。(2)用EXECUTE语句执行”执行计划”。[P.269例9.7]注意以下几句:strcpy(select_st,”SELECTsno,sname,ageFROMstudentWHERE”);scanf(“pleaseenterthequerycondition:%s\n”,query_f);strcat(select_st,query_f);/*将SQL查询语句保存在变量select_st中*/EXECSQLPREPAREsql_stFROM:select_st/*生成执行计划*/EXECSQLDECLAREst_cursorCURSORFORsql_st五、动态SQL补充例:在sc表中插入一条记录,记录的值由程序决定。#includestring.h#includestdio.hmain(){EXECSQLBEGINDECLARESECTION;charperp[]=“INSERTINTOscVALUES(?,?,?)”;charsno[6];charcno[4];intgrade;EXECSQLENDDECLARESECTION;EXECSQLCONNECTTOstudentUSERsa.;参数标志五、动态SQLEXECSQLPREPAREprep_statFROM:prep;if(SQLSTATE==0)/*SQL语句执行成功*/{strcpy(sno,”995201”);strcpy(cno,”c601”);grade=76;EXECSQLEXECUTEprep_statUSING:sno,:cno,:grade;}}代替准备语句中的参数标志“?”9.3数据库接口技术指为支持DB应用开发而提供的各种标准应用程序编程接口。1.典型的数据库应用接口(1)ODBC(开放式数据库互联)提供了一组对数据库访问的标准应用程序编程接口,使用户通过SQL可访问不同的关系数据库。(2)OLE(对象连接与嵌入数据库)建立于ODBC之上,并将此技术扩展为提供更高级数据访问接口的组件结构。(3)SQL/CLI(SQL调用级接口)是SQL的应用编程接口,它等于核心ODBCAPI。它定义了一套公共函数,从一个主语言应用程序可以调用这些函数,连接到数据库。(4)JDBC(Java数据库连接)是基于Java语言的数据访问接口,具有平台无关性。适合于Internet上异构环境的数据库应用。(5)ADO.NET是在微软.NET编程环境中优先使用的数据访问接口。提供了平台互用性和可伸缩的数据访问,功能强、易用、高效。(6)OTL是一个C++编译中操控关系数据库的模板库。2.开放式接口--ODBCODBCAPISQLServer数据源Oracle数据源DB2数据源DBDBDBSQLServer驱动程序Oracle驱动程序…DB2驱动程序驱动程序管理器应用程序1应用程序2应用程序n…ODBC应用程序层接口:供DB应用程序开发人员使用。由各个DB厂商提供。它提供对具体DB操作接口,是应用程序对各数据源发出操作的实际执行者(1)ODBC应用系统的体系结构:2.开放式接口--ODBC(2)连接过程:常用:MFC的ODBC类ODBC3.0CBBCBDB特定的ODBC驱动A特定的DBMSA客户应用程序驱动管理器A要求与数据源连接确定合适的ODBC驱动服务器处理请求,查询提交查询操作网络3.调用级接口---JDBC应用程序1应用程序2应用程序n…JDBCAPIJDBC驱动程序APIJDBC驱动程序管理器JDBC-MiddlewarePureJDBCDriverJDBC-NativeAPIBridgeJDBC-ODB
本文标题:第9章 数据库访问与系统建模要点
链接地址:https://www.777doc.com/doc-3152896 .html