数据库 01-第一章7节_第1页
数据库 01-第一章7节_第2页
数据库 01-第一章7节_第3页
数据库 01-第一章7节_第4页
数据库 01-第一章7节_第5页
已阅读5页,还剩34页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

1.7嵌入式SQL

1.7.1嵌入式SQL的介绍1.7.2嵌入式SQL与主语言间的通信1.7.1嵌入式SQL的介绍1、嵌入式SQL:能够嵌入到高级语言(C,C++,VB,PowerBuilder)中进行混合编程的SQL语言叫嵌入式SQL,而被SQL嵌入的高级语言叫宿主语言或主语言。2、为什么需要嵌入式SQL

(1)SQL不能表达所有查询要求;(2)SQL不能完成非声明性动作;如:打印查询结果,或将查询结果送到图形用户界面中;1.7.1嵌入式SQL的介绍3、PowerBuilder中的简单例子—一段PB程序:StringXno,Kno

INTCgrade

SELECTSno,Cno,GradeINTO:Xno,:Kno,:Cgrade

FROMReportsWHERESno=’S01’ANDCno=’C01’;

在SQLServer2008SSMS中使用SELECTSno,Cno,GradeFROMReportsWHERESno=’S01’ANDCno=’C01’嵌入式SQL与自含式有差别?1.7.1嵌入式SQL的介绍4、在高级语言中使用嵌入式SQL需要解决如下关键问题:⑴主语言编译器如何识别和接受SQL,并将其编译成可执行代码?(2)主语言和DBMS之间如何传递数据和信息?(3)SQL查询结果通常是元组的集合,如何将这些元组逐个交给主语言处理?(4)当两者之间的数据类型不完全对应,如何进行数据类型转换。1.7.1嵌入式SQL的介绍5、嵌入式SQL使用场合

任何允许出现高级语言语句的地方,都可以写可执行的SQL语句,任何允许出现说明性高级语言语句的地方,都可以写说明性SQL语句。1.7.1嵌入式SQL的介绍⑴主语言识别嵌入式SQL的方法:添加区分标志区分主语言语句与SQL语句的标志一般随主语言的不同而不同。主要有以下方式:①

在嵌入的SQL语句前加前缀EXECSQL;②

在嵌入的SQL语句后面加结束标志END-EXEC或者分号“;”。③在嵌入的SQL语句分别加前缀和结束标志。4、在高级语言中使用嵌入式SQL需要解决如下关键问题:1.7.1嵌入式SQL的介绍例1.751)在C中使用嵌入式SQL语言,以EXECSQL开始,以分号“;”结束。删除表Students的命令为:EXECSQLDROPTABLEStudents;

2)在PowerBuilder中使用嵌入式SQL在其后面加分号。删除表Students的命令:DROPTABLEStudents;

1.7.1嵌入式SQL的介绍⑴主语言将嵌入式SQL编译成可执行代码①

预编译的方法:DBMS供应商提供的预编译器(如:SQLServer的预处理程序nsqlprep.exe)对源程序进行扫描,识别出SQL语句,并把它转换成主语言对DB-LibraryAPI函数的调用语句(主语言编译程序能识别的源代码),最后由主语言的编译程序将整个源程序编译成目标代码。

修改和扩充主语言使嵌入式SQL成为主语言的一部分,主语言就可直接处理SQL。1.7.2嵌入式SQL语句与主语言间的通信(2)主语言和DBMS之间如何传递数据和信息

嵌入式SQL与主语言的分工方式:SQL语句负责操纵数据库,高级语言语句负责控制程序流程和处理数据。

SQLCA(SQLCommunicationArea):嵌入式SQL与主语言之间协调工作的通信区数据库工作单元DU通信区源程序工作单元PU应用程序的执行SQLCA为一个数据结构执行SQL访问DB1.7.2嵌入式SQL语句与主语言间的通信②SQL通信区——SQLCASQLCA(SQLCommunicationArea):一个数据结构,存放SQL语句执行后要反馈给应用程序若干信息,主要包括描述系统当前工作状态和运行环境的各种数据。高级语言编写的应用程序从SQLCA中取出这些状态信息,就可以据此决定接下来执行的语句。比如,其中的SQLCode就存有SQL命令执行是否成功的信息,主语言可以直接读取这个变量的值,据此信息控制程序流程。1.7.2嵌入式SQL语句与主语言间的通信例如,在执行删除语句DELETE后,不同的执行情况SQLCA中有下列不同的信息:

成功删除,并有删除的行数(SQLCODE=0);

无条件删除警告信息;

违反数据保护规则,拒绝操作;

没有满足条件的行,一行也没有删除;

由于各种原因,执行出错;

当执行DELETE命令后,就可写一个分支结构语句来控制流程:

IFSQLCA.SQLCode=0THEN{……}ELSE{……}ENDIF1.7.2嵌入式SQL语句与主语言间的通信

嵌入式SQL与主语言之间通信的三种情况:1)PU的主语言向SQL语句提供参数:用主语言中声明的变量

主变量(HostVariable)来实现;2)DU向PU提供SQL语句执行的状态信息:用通信区SQLCA来完成。

3)DU向PU传送SQL查询结果:结果为单行数据时直接存入主变量;结果为多行时,先存入游标(Cursor),然后通过主语言的程序将其逐行存入主变量;1.7.2嵌入式SQL语句与主语言间的通信④主变量——主语言中声明的变量

输入主变量:由应用程序赋值,SQL语句引用;输出主变量:由SQL语句对其赋值或设置状态信息,返回给应用程序引用。主变量既可作输入主变量又可作输出主变量。一个主变量可以附带一个任选的指示变量(IndicatorVariable)。指示变量为整型变量,用来“指示”对应主变量值的状况。在检索数据库后可以使用指示变量来判断返回给主变量的数据是否为空值或者发生了转换错误。1.7.2嵌入式SQL语句与主语言间的通信⑤

游标 游标是计算机系统为用户开设的一个数据缓冲区,存放嵌入式SQL语句的查询结果数据集,每个游标区都有一个名字。游标能实现把SQL查询结果集中的元组逐个交给主语言处理用户可以通过游标逐一读取数据记录,然后赋值给主变量,再交给主语言程序作进一步地处理。游标Report_Cur计算机系统开设一个数据缓冲区1.7.2嵌入式SQL语句与主语言间的通信

游标的典型使用过程用DECLARE声明游标;用OPEN语句打开游标;用FETCH语句读取一条记录;处理读出的记录数据;循环处理:判断游标中数据是否读取完毕,若未完则重复执行⑶~⑸步,否则执行⑹步;用CLOSE语句关闭游标。1.7.3PowerBuilder中使用嵌入式SQL1、PowerBuilder使用游标的命令 1)DECLARECursorNameCURSORFORSelectStatement;

2)OPENCursorName;

3)FETCHCursorNameINTOHostVariableList

;4)PowerBuilder命令处理读出的记录数据;5)IF游标中数据没有读取完,THEN重复执行⑶~⑸步,ELSE

执行⑹步;6)CLOSECursorName;1.7.3PowerBuilder中使用嵌入式SQL

例1.80逐一读取关系Reports中的Grade信息,如果Grade的值小于85,则将其在原来基础上增加5,否则将该记录删除。这个更新操作可以通过使用游标的以下程序实现。1.7.3PowerBuilder中使用嵌入式SQL7、PowerBuilder使用游标例子:INTCgrade//声明一个整型变量:主变量DECLAREReport_CurCURSORFORSELECTGrade

FROMReports;OPENReport_Cur;//打开游标Report_CurFETCHReport_CurINTO:Cgrade;

1.7.3PowerBuilder中使用嵌入式SQL

DOWHILESQLCA.SQLCode=0

//读取成功进入循环

IFCgrade<85THEN

UPDATEReports

SETGrade=Grade+5WHERECURRENTOFReport_Cur;

ELSE

//否则删除该记录

DELETEFROMReportsWHERECURRENTOFReport_Cur;

ENDIF

FETCHReport_CurINTO:Cgrade;

LOOP

CLOSEReport_Cur;

1.7.3PowerBuilder中使用嵌入式SQL2、检索单行数据的SELECT语句格式SELECTFieldsList//字段列表INTOVarList//变量列表FROMTableName//表名WHERECriteria//查询条件[USINGTransactionObject];//事务对象其默认事务对象为SQLCA,可以不写,否则必须指明事务对象。1.7.3PowerBuilder中使用嵌入式SQL例1.76查询“S01”选修课程“C01”的成绩。StringXno,Kno//PB声明两个字符串主变量Int

Cgrage//PB声明一个整型主变量SELECTSno,Cno,Grade//开始嵌入式SQL语句INTO:Xno,:Kno,:Cgrage//SQL引用PB主变量

FROMReportsWHERESno=’S01’ANDCno=’C01’;1.7.3PowerBuilder中使用嵌入式SQL3、INSERT语句语法格式为:INSERTINTOTableName//表名(FieldName[,…])//属性名VALUES(ValueOfField[,…])//值[USINGTransactionObject];//事务1.7.3PowerBuilder中使用嵌入式SQL例1.77向Reports中添一记录(’S12’,’C05’,87)。

INSERTINTOReports(Sno,Cno,Grade)VALUES(’S12’,’C05’,87);或者StringXno,Kno//PB声明两个字符串变量

Int

Cgrage//PB声明一个整型变量

Xno=’S12’//将值赋给主变量

Kno=’C05’

Cgrage=87INSERTINTOReports(Sno,Cno,Grade)VALUES(:Xno,:Kno,:Cgrage);

//主变量值插入表中1.7.3PowerBuilder中使用嵌入式SQL4、UPDATE语句语法格式为:UPDATETableNameSETFieldName1=Value1[,SETFieldName2=Value2,…]WHERECriteria[USINGTransactionObject];例1.78

将“Reports”中所有低于90的学生加5分。UPDATEReportsSETGrade=Grade+5WHEREGrade<90;1.7.3PowerBuilder中使用嵌入式SQL5、DELETE语句语法格式为:DELETEFROMTableName

WHERECriteria[USINGTransactionObject];例1.79删除“Reports”表中所有选“C03”课程的学生信息。DELETEFROMReports

WHERECno=’C03’;1.7.4Delphi中使用嵌入式SQLSQL语句的具体使用方法通常需要5步:⑴定义一个TQuery类的对象HuangdcQuery(在Delphi中称为一个控件,它的名字由用户确定);⑵指定HuangdcQuery控件所要访问的数据库别名;⑶指定HuangdcQuery控件使用的SQL语句;⑷执行HuangdcQuery控件中的SQL语句;⑸对查询结果数据进行处理。

1.7.4Delphi中使用嵌入式SQL1、检索单行数据的SELECT语句例查询学号“S01”学生选修“C01”的考试成绩.

HuangdcQuery:=TQuery.Create(Application);

HuangdcQuery.DatabaseName:='student';

Var

Xno:AnsiString;Kno:AnsiString;

Cgrage:Integer

1.7.4Delphi中使用嵌入式SQLHuangdcQuery.SQL.Add(‘SELECT

Sno,Cno,Grade

FROMReportsWHERESno=’’S01’’ANDCno=’’C01’’’);HuangdcQuery.Open;Xno:=HuangdcQuery.FieldByName('Sno').AsString;Kno:=HuangdcQuery.FieldByName('Cno').AsString;Cgrage:=HuangdcQuery.FieldByName('Grade');1.7.5在VB中使用嵌入式SQLVB程序通过ADO对象(ActiveXDataObjects,比如Connection对象和Recordset对象)来使用嵌入式SQL语句,具体方法如下:1)创建一个Connection对象;2)打开Connection对象;3)创建一个Recordset对象;4)通过Connection对象和Recordset对象来执行SQL语句。1.7.5在VB中使用嵌入式SQL例查询学号“S01”学生选修“C01”的考试成绩.PubliccnnAsADODB.Connection//声明对象cnnSetcnn=NewADODB.Connection//初始化cnncnn.ConnectionString="Provider=;DataSource=;InitialCatalog=;uid=;pwd=;"//cnn连接字符串cnn.CursorLocation=adUseClient//指定cnn的游标cnn.Open//打开对象cnnPublicrstAsADODB.Recordset//声明对象rstSetrst=NewADODB.Recordset//初始化rstrst.Open"select*fromReportswheresno=’S01’andcno=’C01’",cnn,adOpenStatic,adLockOptimistic

1.7.6在C#中使用嵌入式SQL

MirosoftVisualstudio2008.NET框架下的C#通常使用ADO.NET来使用嵌入式SQL语句。ADO.NET中最重要概念之一是DataSet:数据的一种内存驻留表示形式-游标。DataSet是一种不依赖于数据库的独立数据集合,在断开数据库链路或者关闭数据库的情况下依然可用。1.7.6在C#中使用嵌入式SQLADO.NET访问数据库的步骤为:1)创建一个数据库链路SqlConnection;2)创建一个数据库访问命令SqlCommand;3)执行嵌入式SQL语句。4)如果执行的是查询语句,则把记录集合暂存到DataSet;5)对DataSet中的数据做各种需要的操作6)关闭数据库链路;。ADO.NET是微软新一代.NET数据库的访问架构,ADO是ActiveXDataObjects的缩写ADO.NET对象模型ADO.NET趣味理解图1.7.6在C#中使用嵌入式SQL后面每个例子都需要的1)、2)和4)步的总共7行语句定义如下:StringstrDataBase=“server=.;database=student;uid=sa;pwd=123456;”;//定义连接数据库参数字符串SqlConnection

conn=newSqlConnection(strDataBase);//创建数据库连接链路conn.Open();//打开数据库连接链路SqlCommand

sqlcom=newSqlCommand();//创建数据库执行命令sqlcom.Connection=conn;//设置sqlcom的连接属性...…

//例1.81或1.82或1.83或1.84中程序的插入位置。conn.Close();//关闭数据库链路1.7.6在C#中使用嵌入式SQL1、检索单行数据的SELECT语句例1.81

查询学号为“S01”的学生选修课程号“C01”课程的考试成绩。实现以上查询需求的C#程序及其嵌入式语句如下:sql="SELECT*FROMReportsWHERESno='S01'ANDCno=

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论