SQLServer和嵌入式SQL
- 格式:doc
- 大小:21.50 KB
- 文档页数:2
2022年华东师范大学计算机科学与技术专业《数据库原理》科目期末试卷B(有答案)一、填空题1、SQL语言的数据定义功能包括______、______、______和______。
2、SQL Server中数据完整性包括______、______和______。
3、数据库系统在运行过程中,可能会发生各种故障,其故障对数据库的影响总结起来有两类:______和______。
4、数据库内的数据是______的,只要有业务发生,数据就会更新,而数据仓库则是______的历史数据,只能定期添加和刷新。
5、数据管理技术经历了______________、______________和______________3个阶段。
6、已知系(系编号,系名称,系主任,电话,地点)和学生(学号,姓名,性别,入学日期,专业,系编号)两个关系,系关系的主码是______________,系关系的外码是______________,学生关系的主码是______________,外码是______________。
7、在SELECT命令中进行查询,若希望查询的结果不出现重复元组,应在SEL ECT语句中使用______保留字。
8、在VB 6.0中,已经用Adobel连接到数据库,并已绑定到数据库中的某个关系表,现要通过此控件向表中插入数据,需要用到Adobel.Recordset的_____方法和Update方法,使用Adobel.Recordset的_____方法可以使当前行指针在结果集中向前移动一行。
9、“为哪些表,在哪些字段上,建立什么样的索引”这一设计内容应该属于数据库设计中的______阶段。
10、设在SQL Server 2000环境下,对“销售数据库”进行的备份操作序列如下图所示。
①出现故障后,为尽可能减少数据丢失,需要利用备份数据进行恢复。
首先应该进行的恢复操作是恢复_____,第二个应该进行的恢复操作是恢复_____。
第1章SQL Server 初步§1.1 SQL Server的简介1.1.1 什么是SQL ServerSQL:Structured Query LanguageSQL SERVER是一个以客户/服务器(c/s)模式访问、使用Transact-SQL语言的关系型数据库管理子统(RDBMS)。
SQL Server是一种基于网络的大型数据库软件。
主要是用SQL语言来管理、修改、和修改数据库。
主要运算在WINNT、WIN2000、也可运行在WIN9X上的一种DBMS。
1.1.2 SQL Server 2000的主要版本及发布时间1.1.2.1 主要版本有个人(Personal)版、企业版(EnterPrise)、标准版和开发版等。
个人版:最多连接5个用户,可安装在WINDOWS 98、XP、WIN2000。
企业版:可连接1000个用户,需安装在WIN2000服务版上。
1.1.2.2 SQL Server 2000的发布时间1988年 MICROSOFT&SYBASE合作开发1993年平台上的SQL SERVER 4.21994年中止合作独自开发1995年 SQL SERVER 6.01996年 SQL SERVER 6.51998年 SQL SERVER 7.02000年 SQL SERVER 2000v1.0 可编辑可修改2005年 SQL SERVER 2005SQL SERVER 2008将于2008年初上市1.1.3 SQL Server的安装运行安装盘上的。
1.1.4 SQL语言的特点1、SQL具有自含式与嵌入式两种形式交互式SQL:一般DBMS都提供联机交互工具,用户可直接键入SQL命令对数据库进行操作由DBMS来进行解释嵌入式SQL:能将SQL语句嵌入到高级语言(宿主语言),使应用程序充分利用SQL访问数据库的能力、宿主语言的过程处理能力,一般需要预编译,将嵌入的SQL 语句转化为宿主语言编译器能处理的语句SQL的语法结构基本一致2、SQL具有语言简洁、易学易用的特点3、SQL支持三级模式结构一个SQL数据库的总体逻辑结构是基本表(Table)的集合,对应于概念模式SQL数据库的底层存储结构采用文件,一个或几个表对应一个存储文件,以及索引文件,对应内模式用户所见的数据结构是视图(View),用户可直接操作的表,可为视图或部分基本表。
2022年吉林工程技术师范学院计算机科学与技术专业《数据库原理》科目期末试卷B(有答案)一、填空题1、关系系统的查询优化既是关系数据库管理系统实现的关键技术,又是关系系统的优点。
因为,用户只要提出______,不必指出 ______。
2、____________和____________一起组成了安全性子系统。
3、数据库内的数据是______的,只要有业务发生,数据就会更新,而数据仓库则是______的历史数据,只能定期添加和刷新。
4、以子模式为框架的数据库是______________;以模式为框架的数据库是______________;以物理模式为框架的数据库是______________。
5、某事务从账户A转出资金并向账户B转入资金,此操作要么全做,要么全不做,为了保证该操作的完整,需要利用到事务性质中的_____性。
6、在SQL Server 2000中,新建了一个SQL Server身份验证模式的登录账户LOG,现希望LOG在数据库服务器上具有全部的操作权限,下述语句是为LOG授权的语句,请补全该语句。
EXEC sp_addsrvrolemember‘LOG’,_____;7、事务故障、系统故障的恢复是由______完成的,介质故障是由______完成的。
8、关系规范化的目的是______。
9、DBMS的完整性控制机制应具备三个功能:定义功能,即______;检查功能,即______;最后若发现用户的操作请求使数据违背了完整性约束条件,则采取一定的动作来保证数据的完整性。
10、如果多个事务依次执行,则称事务是执行______;如果利用分时的方法,同时处理多个事务,则称事务是执行______。
二、判断题11、SQLServer有两种安全性认证模式:WindowsNT和SQLServer。
()12、视图是观察数据的一种方法,只能基于基本表建立。
()13、在一个关系模型中,不同关系模式之间的联系是通过公共属性来实现的。
嵌入式sql 简单名词解释-回复
嵌入式SQL是指在高级语言的源程序中嵌入SQL语句,实现高级语言与SQL语言的混合编程。
这种方式可以使程序员用熟悉的高级语言来编写应用程序的控制部分,而用SQL来处理数据定义和数据操作等与数据库有关的操作。
嵌入式SQL的使用步骤一般如下:
1. 预编译:将包含嵌入式SQL的高级语言源程序进行预编译,生成一个新的源程序。
2. 编译:对预编译后的源程序进行编译,生成目标代码。
3. 连接:将目标代码和数据库管理系统提供的函数库进行连接,生成可执行文件。
嵌入式SQL的优点包括可以充分利用高级语言的功能,提高程序的效率和可读性,同时又能利用SQL的强大功能进行数据库操作。
数据库复习题库⼀、判断题1、SQLServer2000规定基本表的⼀⾏不能跨“页”存储。
2、SQLServer2000规定每个数据库的⽂件组个数不能超过256。
3、在对关系代数表达式进⾏优化时,应尽可能早地执⾏选择操作。
4、可以通过视图来查询、更新数据库中的数据。
5、封锁的粒度越⼤,系统的并发性就越低。
6、不要⽤更新频度⾼的字段创建聚集索引。
7、SQLServer2000规定:如果事务使⽤Serializable隔离级别,那么,该事务不会凡发⽣“丢失更新”、“读脏数据”、“不可重复读”等问题。
8、数据分⽚时,⼀个⽚段可以分配到多个场地上。
9、关系运算理论是关系数据库查询语⾔的基础。
( )10、数据库的概念结构与⽀持其的DB的DBMS有关。
( )11、下列式⼦R∩S=R—(R—S)成⽴。
( )12、有了外模式/模式映象,可以保证数据和应⽤程序之间的物理独⽴性。
()13、数据库系统的三级模式结构中,外模式、模式、内模式都只有⼀个。
()14、分布式数据库可以从逻辑上看成⼀个整体。
( )15、关系模型中的关系模式⾄少应该满⾜1NF的要求。
( )16、不包含在任何⼀个候选码中的属性叫做⾮主属性。
( )17、在视图中插⼊⼀个元组,该元组会同时插⼊到基本表中。
( )18、封锁粒度越⼤,可以同时进⾏的并发操作越⼤,系统的并发程度越⾼。
()19.在数据库的三级模式结构中,内模式有任意多个。
()20.层次模型⽤树型结构表⽰实体及实体间的联系。
21.在关系数据库表中外键只有⼀个,但候选码可以有多个。
22.遵守两段锁协议的并发事务⼀定是可串⾏化的。
23.登记⽇志⽂件时,必须先写数据库,后写⽇志⽂件。
24.嵌⼊式SQL语句中,可以使⽤主语⾔的程序变量来输⼊或输出数据。
25.锁的粒度越⼩,系统的开销越⼩,并发度越⼤。
()26.关系中各列可出⾃同⼀个域。
()27.在关系数据库表中主属性只有⼀个,但候选码可以有多个。
()28.视图可由多个视图导出。
习题13、简述数据库系统的组成。
答:数据库系统一般由数据库、数据库管理系统(及其开发工具)、数据库管理员(DataBase Administrator ,DBA )和用户组成。
4、试述数据库系统的三级模式结构。
这种结构的优点是什么?答:数据库系统的三级模式结构是指数据库系统是由外模式、模式和内模式三级构成,同时包含了二级映像,即外模式/模式映像、模式/内模式映像,如下图所示。
数据库应用1……外模式A 外模式B 模式应用2应用3应用4应用5……模式外模式/模式映像模式/内模式映像数据库系统的这种结构具有以下优点:(1)保证数据独立性。
将外模式与模式分开,保证了数据的逻辑独立性;将内模式与模式分开,保证了数据的物理独立性。
(2)有利于数据共享,减少了数据冗余。
(3)有利于数据的安全性。
不同的用户在各自的外模式下根据要求操作数据,只能对限定的数据进行操作。
(4)简化了用户接口。
按照外模式编写应用程序或输入命令,而不需了解数据库全局逻辑结构和内部存储结构,方便用户系统。
5、什么是数据的物理独立性与逻辑独立性?并说明其重要性。
答:(1)数据的物理独立性是指数据的物理结构(包括存储结构、存取方式等)的改变,存储设备的更换,物理存储的更换,存取方式改变等都不影响数据库的逻辑结构,从而不致引起应用程序的变化。
(2)数据的逻辑独立性是指数据库总体逻辑结构的改变,如修改数据模式,增加新的数据类型、改变数据间联系等,不需要相应修改应用程序。
(3)数据的独立性使得数据库中数据独立于应用程序而不依赖于应用程序,也就是说数据的逻辑结构、存储结构与存取方式的改变不影响应用程序。
相应的,数据的独立性也使得应用程序的编制不再依赖于数据的物理和逻辑结构,提高了应用程序的可移植性与鲁棒性。
从理论上说,数据的独立性可以使数据的组织和应用程序的编制完全分离。
8、什么是数据模型?答:数据模型(Data Model )是一种抽象模型,是对现实世界数据特征的抽象。
嵌入式SQL与动态SQL语句SQL语言有两种使用方式:一种是在终端交互方式下使用,称为交互式SQL;另一种是嵌入在高级语言的程序中使用,称为嵌入式SQL,而这些高级语言可以是C、ADA、PASCAL、COBOL或PL/I等,称为宿主语言。
本章主要讲解以下4点知识:1 SQL的运行环境2 嵌入式SQL的使用规定3 嵌入式SQL的使用技术4 动态SQL语句SQL的运行环境宿主语言十嵌入式SQL↓预处理程序↓宿主语言十函数调用↓SQL函数定义库↓宿主语言编译程序↓目标程序嵌入式SQL的使用规定在程序中要区分SQL语句与宿主语言语句允许嵌入的SQL语句引用宿主语言的程序变量(称为共享变量),但有两条规定:(1) 引用时,这些变量前必须加冒号“:”作为前缀标识,以示与数据库中变量有区别。
(2) 这些变量由宿主语言的程序定义,并用SQL的DECLARE语句说明。
SQL的集合处理方式与宿主语言单记录处理方式之间的协调。
(1) 游标定义语句(DECLARE)。
(2) 游标打开语句(OPEN)。
(3) 游标推进语句( FETCH )。
(4) 游标关闭语句(CLOSE)。
嵌入式SQL的使用技术1,不涉及游标的SQL DML语句2,涉及游标的SQL DML语句3,卷游标的定义和推进涉及游标的SQL DML语句(1)SELECT语句的使用方式当SELECT语句查询结果是多个元组时,此时宿主语言程序无法使用,一定要用游标机制把多个元组一次一个地传送给宿主语言程序处理。
(2)对游标指向元组的修改或删除操作在游标处于活动状况时,可以修改或删除游标指向的元组。
动态SQL语句1,动态SQL预备语句EXEC SQL PREPARE〈动态SQL语句名〉FROM〈共享变量或字符串〉这里共享变量或字符串的值应是一个完整的SQL语句。
这个语句可以在程序运行时由用户输入才组合起来。
此时,这个语句并不执行。
2,动态SQL执行语句EXEC SQL EXECUTE〈动态SQL语句名〉动态SQL语句使用时,还可以有两点改进:(1)当预备语句中组合而成的SQL语句只需执行一次时,那么预备语句和执行语句可合并成一个语句:EXEC SQL EXECUTE IMMEDIATE〈共享变量或字符串〉(2)当预备语句中组合而成的SQL语句的条件值尚缺时,可以在执行语句中用USING短语补上:EXEC SQL EXECUTE < 动态SQL语句名 > USING <共享变量>例3.33 下面两个C语言的程序段说明了动态SQL语句的使用技术。
Sql Server系统数据库的作用一、系统数据库Sql Server的系统数据库分为:master、model、msdb和tempdb,这四个数据库在SQL Server中各司其职,作为研发人员,很有必要了解这几个数据库的职责,下面我们来看看这几个数据库的作用。
1. Master 数据库Master 数据库记录SQLServer 系统的所有系统级别信息(表sysobjects)。
它记录所有的登录账号(表sysusers)和系统配置。
Master数据库是这样一个数据库,记录所有其他的数据库(表sysdatabases),包括数据库文件的位置。
Master 数据库记录SQLServer的初始化信息,他始终指向一个可用的最新Master 数据库备份。
2. Model 数据库Model 数据库是作为在系统上创建数据库的模板。
当系统收到“Create DATABASE”命令时,新创建的数据库的第一部分内容从Model 数据库复制过来,剩余部分由空页填充,所以SQL Server数据中必须有Mode 数据库。
3. Msdb 数据库Msdb 数据库供SQLServer 代理程序调度警报和作业以及记录操作员时使用。
比如,我们备份了一个数据库,会在表backupfile中插入一条记录,以记录相关的备份信息。
4. Tempdb 数据库Tempdb 数据库保存系统运行过程中产生的临时表和存储过程。
当然,它还满足其他的临时存储要求,比如保存SQL Server生成的存储表等。
Tempdb 数据库是一个全局咨询,任何连接到系统的用户都可以在该数据库中产生临时表和存储过程。
Tempdb 数据库在每次SQL Server启动的时候,都会清空该数据库中的内容,所以每次启动SQL Server后,该表都是干净的。
临时表和存储过程在连接断开后会自动除去,而且当系统关闭后不会有任何活动连接,因此,tempdb 数据库中没有任何内容会从SQL Server的一个会话保存到另外一个会话中。
ESQL(内嵌式SQL)简述12.1 何谓Embedded SQLSQL(Structure Query Language)是一种双重模式(dual-mode)的语言,您可以将它当成是一种交谈式的数据库语言(通常称为交谈式SQL),透过交谈式工具来直接跟数据库沟通,也可以把它当成一般的程序语言,透过它来对数据库进行存取的动作。
在第一种模式下,通常每一厂商的数据库管理系统会提供专属的交谈界面工具,如DBMaker 中的dmSQL,使用者可以藉由这些工具输入正式的SQL语法来对数据库做存取及维护的动作。
而在第二种模式下,数据库管理系统提供二种基本的技术供使用者在程序中使用,分别是:-应用程序界面(Application program interface,API)在这个方法之下,使用者撰写的程序需要透过一组称为应用程序界面(API)的函数呼叫来跟数据库管理系统进行沟通。
在程序中,使用者都是经由这一组API所提供的函数来对数据库进行SELECT、INSERT、UPDATE、DELETE等操作。
在DBMaker中,我们提供的是一组符合工业标准的API-ODBC(Open DataBase Connectivity)界面。
-内嵌式SQL(Embedded SQL,ESQL)在这种方式中,使用者要存取数据库,不再是透过API函数,而是直接在程序中输入要查询的叙述,因此SQL被当成是程序中的部分语法,而不是函数的参数而已,所以我们称这种方式为内嵌式SQL。
由于大部份的程序语言无法直接辨识SQL的语法,因此在编译之前,需要透过前置编译器(Precompiler)先将SQL转成程序可辨认的语法。
DBMaker提供的是C 的前置编译器,您可以在任何C的程序中直接撰写SQL,然后使用前置编译器将这些SQL 转成C的函数,最后利用C编译器来编译成执行档。
上一节--------------------------------------------------------------------------------12.2 ESQL概述在本手册中,我们仅简单介绍内嵌式SQL的语法型态及概念。
sql-server-2008-数据库应用与开发教程--课后习题参考答案DServer的组成部分和这些组成部分之间的描述。
Microsoft SQL Server 2008系统由4个组件组成,这4个组件被称为4个服务,分别是数据库引擎、Analysis Services、Reporting Services和Integration Services。
数据库引擎是Microsoft SQL Server 2008系统的核心服务,负责完成数据的存储、处理、查询和安全管理等操作。
分析服务(SQL Server Analysis Services,简称为SSAS)的主要作用是提供多维分析和数据挖掘功能。
报表服务(SQL Server Reporting Services,简称为SSRS)为用户提供了支持Web方式的企业级报表功能。
集成服务(SQL Server Integration Services,简称SSIS)是一个数据集成平台,负责完成有关数据的提取、转换和加载等操作。
1.安装SQL Server 2008之前应该做什么准备工作?答:(1) 增强物理安全性(2) 使用防火墙(3) 隔离服务(4) 禁用NetBIOS和服务器消息块2.SQL Server 2008支持哪两种身份验证?答:Windows 身份验证或混合模式身份验证。
3.如何注册和启动SQL Server 服务器?答:1. 注册服务器使用Microsoft SQL Server Management Studio工具注册服务器的步骤如下:(1) 启动Microsoft SQL Server Management Studio工具,选择“视图”|“已注册”命令或者按下快捷键Ctrl+Alt+G,在打开的“已注册的服务器”窗口中选中“数据库引擎”图标。
(2) 在“数据库引擎”上单击鼠标右键,从弹出的快捷菜单中选择“新建”|“服务器注册”命令,即可打开如图1-20所示的“新建服务器注册”对话框。
数据库原理A知到章节测试答案智慧树2023年最新南华大学第一章测试1.数据库系统的体系结构是()。
参考答案:三级模式结构和二级映像2.下列四项中,不属于数据库特点的是()。
参考答案:数据不丢失3.D BS中,内外存数据交换最终是通过()。
参考答案:OS完成4.逻辑数据独立性是指()。
参考答案:模式变,应用程序不变5.子模式是()。
参考答案:模式的逻辑子集6.应用数据库的主要目的是为了()。
参考答案:解决数据共享问题7.数据库管理系统是数据库系统的核心,它负责有效地组织、存储、获取和管理数据,属于一种(),是位于用户与操作系统之间的一层数据管理软件。
参考答案:系统软件8.数据库系统的数据独立性是指()。
参考答案:不会因为系统数据存储结构与数据逻辑结构的变化而影响应用程序9.在D BS中,D BM S和OS之问的关系是()。
参考答案:D BM S调用OS10.单个用户使用的数据视图的描述称为()。
参考答案:外模式第二章测试1. 在数据建模过程中,独立于计算机系统的模型是()。
参考答案:E-R模型2. 下列数据模型中,数据独立性最高的是()参考答案:关系数据模型3.在关系数据库中,模式对应的是()。
参考答案:基本表4. 当前应用最广泛的组织层数据模型是()。
参考答案:关系模型5.数据模式是()参考答案:记录类型及其联系的集合6. 概念模型独立于()。
参考答案:硬件设备和DBMS7.下列关于概念层数据模型的说法,错误的是()。
参考答案:在进行概念层数据模型设计时,需要考虑具体的DBMS的特点8. 下列关于E-R模型中联系的说法,错误的是()。
参考答案:一个联系最多只能关联2个实体9. 数据库中的数据模型三要素是指()。
参考答案:数据结构、数据操作和数据完整性约束10. 层次模型和网状模型是联系是通过指针实现的,关系数据库在物理层也使用指针。
()参考答案:对第三章测试1.对于关系数据库来讲,下面()的说法是错误的。
SQL⼊门(4):嵌⼊式SQL语⾔本节讲述内容:1.嵌⼊式SQL 语⾔概述2.变量声明与数据库连接3.数据集与游标4.可滚动游标与数据库的增删改5.状态捕捉以及错误处理机制(⼀)嵌⼊式SQL语⾔之前我们所学的都是交互式SQL 语⾔: select .. from .. where..嵌⼊式SQL语⾔表⽰将SQL语⾔嵌⼊到某⼀种⾼级语⾔中使⽤, ⽐如C++ ,Java, powerbuilder等它们也称为宿主语⾔(host language).复杂的检索不能⽤⼀条SQL语句完成, 需要结合⾼级语⾔中的顺序\分⽀\循环结构帮助处理.if [conditon] then SQL_query else SQL_query end ifdo while [condition] SQL_query end do还有在SQL语句的检索结果基础上,再进⾏处理的SQL_query1for ... doprocess the recordnextSQL_query 2if .. thenelseend if交互式SQL: select sname, sage from student where sname='xy';嵌⼊式SQL: 以宿主语⾔C语⾔为例,exec sql select sname, sage into :vsname, :vsage from student where sname='xy';主要区别:(1) exex sql 是⼀个引导词, 它引导sql 语句, 将SQL语句预编译成C编译器可识别的语句.(2) 增加 into ⼦句, ⽤于把SQL 语句的检索结果赋给⾼级语⾔的程序变量(3) ⽤冒号开头表⽰⾼级语⾔的程序变量 :vsname , :vsage冒号很重要, ⽤于区分是程序变量还是表的字段!! .... 还有很多特点之后在详细介绍为啥要学嵌⼊式SQL , ⽤来解决啥问题?下⾯逐个解决上述8个问题(⼀) 数据库的连接(问题1)在嵌⼊式SQL 操作之前, ⾸先需要与数据库进⾏连接不同的DMBS 的语句是有差别的,在嵌⼊式SQL程序执⾏之后, 需要断开数据库SQL 执⾏的提交与撤销SQL语句在执⾏过程中, 必须要有提交, 撤销语句提交: exec sql commit work;撤销: exec sql rollback work;很多DBMS 都设计了捆绑提交\撤销与断开连接在⼀起的语句, 以保证在断开连接之前使⽤户确认提交或撤销先前的⼯作, Oracle 中就是这样:exec sql commit release;exec sql rollback release;为什么需要提交和撤销呢? 这个设计到数据库中的'' 事务 ''处理什么是事务? 从应⽤程序员⾓度来看, 事物是⼀个存取或者改变数据库内容的程序的⼀次执⾏,或者说是⼀条或者多条SQL 语句的⼀次执⾏被看做是⼀个事务事务⼀般由应⽤程序员提出, 因此有开始和结束, 结束前需要提交或者撤销begin transactionexec sql...exec sql...exec sql commit work|exec sql rollback work --提交或者撤销end transaction注意: 提交表⽰这⼀系列操作对数据库的更新是有效的, 撤销则表⽰⽆效其实从任何⼀个SQL语句执⾏就表⽰了⼀个事务的开始, 到了 commit 或 rollback 则结束⼀个事务,因此上述的 begin end 可以省略.事务的ACID 特性A : atomicity 原⼦性, DBMS保证表⽰事务中的⼀组操作是不可分的,要么全做,要么⼀条也不做C : consistency ⼀致性,例如两个⼈同时在买车票,会不会买到同⼀张车票I: isolation 隔离性两个事务操作互不⼲扰D: durability 已提交事务的影响是持久的, 被撤销的事务影响可以恢复事务处理技术是DBMS的核⼼处理技术!!(⼆) 变量声明(问题2)exec sql select sname, sage into :vsname, :vsage from student where sname=:specname;加了冒号表⽰⾼级语⾔的程序变量, 这些变量需要声明exec sql begin declare section; --开始声明char vsname[10], specname[10]='xy' ;int vsage;exec sql end declare section; -- 结束声明注: 宿主程序的字符串变量长度要⽐字符型字段多1, 因为宿主程序的字符串尾部多⼀个终⽌符'\0' . -- 变量的声明与使⽤exec sql begin declare section;char vsname[10], specname[10]='xy' ;int vsage;exec sql end declare section;-- ⽤户在此处可以基于键盘输⼊给specname 赋值exec sql select sname, sage into :vsname, :vsage from student where sname=:specname;实例: 数据库连接+变量定义#include<stdio.h>#include"prompt.h"exec sql include sqlca; --sqlca 表⽰SQL的通信区, communication areachar cid_prompt[]="please enter customer id:";int main(){exec sql begin declare section; --下⾯声明变量char cust_id[5], cust_name[14];float cust_discnt;exec sql end declare section;exec sql whenever sqlerror goto report_error;-- 错误捕获exec sql whenever not found goto notfound; -- 记录没有找到strcpy(user_name,"poneilsql");-- 字符串赋值strcpy(user_pwd,"123456");exec sql connect :user_name identified by :user_pwd; -- 连接数据库while((prompt(cid_prompt,1,cust_id,4))>=0){exec sql select cname,discnt into :cust_name,:cust_discntfrom customers where cid=:cust_id; -- 根据输⼊的客户id 找到名字和折扣exec sql commit work;-- 提交printf("customer's name is %s and discountis %.1f\n",cust_name, cust_discnt);continue; -- 接着循环,再输⼊客户idnotfound:printf("can't find customer %s, continuing\n", cust_id);}exec sql commit release; -- 断开数据库的连接return0;report_error: -- 前⾯报错的执⾏print_dberror();exec sql rollback release; -- 断开连接return1;}(三) 数据集与游标(问题3 4 5)问题3: SQL 语句如何执⾏?问题4: 如何将SQL 检索到的结果传递回宿主程序进⾏处理?问题5: 如何将静态SQL , SQL语句中的常量更换为变量?如何读取单⾏数据和多⾏数据, 单⾏结果处理与多⾏结果处理的差异: into ⼦句和游标 cursor 1. 检索单⾏结果, 可以将结果直接传送到宿主主程序的变量中, select ... into ...exec sql select sname, sage into :vsname, :vsage from studentwhere sname=:specname;2. 如果是多⾏结果, 则需要使⽤游标cursor游标是指向某个检索记录的指针, 通过这个指针, 每次读⼀⾏, 处理⼀⾏,接着再读⼀⾏...,直到全部处理完毕 fetch..into... (⼀次⼀⾏)需要先定义⼀个cursor-->再打开-->接着⼀条⼀条处理-->最后关闭exec sql delcare cur_student cursor for--游标名select sno, sname, sclass from studentwhere sclass='0315'; -- 定义游标exec sql open cur_student; --打开游标exec sql fetch cur_student into :vsno, :vsname, :vsclass; --取数据...exec sql close cur_student; --关闭游标具体实例:已知表orders(cid, aid, product, dollars) 客户id, 代理⼈id, 产品, ⾦额游标: 给定⼀个客户id, 选出该客户下的所有代理商和⾦额(多⾏数据)#define True 1#include<stdio.h>#include"prompt.h"exec sql include sqlca; --sqlca 表⽰SQL的通信区, communication areaexec sql begin declare section; --声明变量char cust_id[5], agent_id[14];double dollar_sum;exec sql end declare section;int main(){char cid_prompt[]="please enter customer id:"; -- 定义提⽰字符串exec sql declare agent_dollars cursor for-- 定义游标select aid,sum(dollars) from orderswhere cid=:cust_id group by aid;exec sql whenever sqlerror goto report_error;-- 错误捕获exec sql connect to testdbl; --连接数据库exec sql whenever not found goto finish; -- 记录没有找到while((prompt(cid_prompt,1,cust_id,4))>=0){exec sql open agent_dollars; -- 打开游标while(True){ -- 打印每⼀条记录exec sql fetch agent_dollars into :agent_id,:dollar_sum;printf("%s %11.2f\n",agent_id, dollar_sum)};finish:exec sql close agent_dollars; -- 关闭游标exec sql commit work; -- 提交exec sql disconnect current;--断开连接return0;report_error: -- 前⾯报错的执⾏print_dberror();exec sql rollback;-- 撤销exec sql disconnect current; --断开连接return1;}总结游标:exec sql delcare cur_student cursor for--游标名select sno, sname, sclass from studentwhere sclass=:vclass; -- 定义游标order by snofor read only; --只读, 不可更新cursor 数据读取 fetch : exec sql fetch cursor_name into host_variableexec sql delcare cur_student cursor for--游标名select sno, sname, sclass from studentwhere sclass=:vclass; -- 定义游标order by snofor read only; --只读, 不可更新exec sql open cur_student; -- 打开exec sql fetch cur_student into :vsno, :vsname, :vsage; -- 使⽤exec sql close cur_student; -- 关闭可滚动游标与数据库的增删改标注的游标始终是⾃开始到结束⽅向移动的, 每fetch ⼀次,向结束⽅向移动⼀次,每⼀条记录只能被访问⼀次, 再次访问该记录只能关闭游标后重新打开可不可以实现游标的向上移动呢? ODBC (open database connectivity) 是⼀种跨DBMS 的DB 操作平台, 它在应⽤程序与实际的DBMS之间提供了⼀种通⽤的接⼝,很多DBMS不⽀持可滚动游标, 但是通过ODBC 可实现该功能定义中增加了 scroll使⽤如下:可滚动游标移动时需要判断是否到了结束位置, 或者到了起始位置,EOF表⽰最后⼀条记录的后⾯位置BOF表⽰起始位置的前⾯如果不需要区分最上最下, 则可以⽤whenever not found 进⾏检测⽤游标进⾏数据库的增删改1. 查找删除(与交互式delete 语句相同)exec sql delete from customers c where c.city='harbin'andnot exists (select*from orders o where o.cid=c.cid)-- 删除城市是哈尔滨且在订单 orders表⾥⾯没有记录的.2. 定位删除exec sql declare delcust cursor forselect cid from customers c where c.city='harbin'andnot exists (select*from orders o where o.cid=c.cid)for update of cid;exec sql open delcustwhile(True){exec sql fetch delcust into :cust_id;exec sql delete from customers where current of delcust;}1. 查找更新exec sql update student sset scalss='0315'where s.sclass='0314';2.定位更新exec sql declare stud cursor forselect*from student s where s.sclass='0314'andfor update of sclass;exec sql open studwhile(True){exec sql fetch stud into :vsno, :vsname,:vsclass;exec sql update studentset sclass='0315'where current of stud;}插⼊语句exec sql insert into student(sno,sname,sclass)values ('031501','xy','0315');exec sql insert into master_stud(sno,sname,sclass)select sno,sname,sclass from student;综合实例: 求数据库中某⼀列位于中值的那⼀⾏--已知表 orders(cid,aid,product,dollars)-- 寻找数据库中某⼀列位于中值的那⼀⾏#include<stdio.h>#include"prompt.h"exec sql include sqlca; --sqlca 表⽰SQL的通信区, communication areachar cid_prompt[]="please enter customer id:"; -- 定义提⽰字符串int main(){exec sql begin declare section; --声明变量char cid[5], user_name[20], user_pwd[10];double dollars; int ocount;exec sql end declare section;exec sql declare dollars_cursor cursor for-- 定义游标select dollars from orderswhere cid=:cid and dollars is not null order by dollars;exec sql whenever sqlerror goto report_error;-- 错误捕获strcpy(user_name,"poneilsql");-- 字符串赋值strcpy(user_pwd,"123456");exec sql connect :user_name identified by :user_pwd; -- 连接数据库--exec sql whenever not found goto finish; -- 记录没有找到while((prompt(cid_prompt,1,cust_id,4))>=0){exec sql select count(dollars) into :ocount from orderswhere cid=:cid;if(ocount==0){printf("no record reviewed for cid value %s\n",cid);continue;}exec sql open dollars_cursor;for (i=0;i<(ocount+1)/2;i++)exec sql fetch dollars_cursor into :dollars ;exec sql close dollars_cursor;exec sql commit work; -- 提交printf("median dollar amount=%f\n",dollars); }。
1、环境初始化(1) SQL Server2000为其嵌入式SQL提供了一此特殊的接口;默认的安装方式没有安装这此接口;因此,需要把\SQL Server 2000\SQL2000_PER\devtools 解压到C:\Program Files\Microsoft SQL Server\80\Tools\DevTools目录下(即文件夹devtools中的所有文件)这里假设SQL Server安装在C盘(或在安装Microsoft SQL Server 2000时选择安装Development Tools,为使用嵌入式SQL 语言准备必要的头文件和库文件。
)(2) 初始化Visual C++ 6.0编译器环境。
在命令行方式下运行文件\Microsoft Visual Studio\VC98\Bin\vcvars32.bat。
或(\VC98\Bin)(3) 初始化SQL Server的预编译环境。
在命令行方式下运行文件:\devtools\samples\esqlc\setenv.bat。
(需要先解压unzip_esqlc.exe)(4) VC++6.0环境配置。
具体配置分为如下三步:①Tools->options->directories->Include Files:添加 C:\ProgramFiles\Microsoft SQL Server\80\Tools\DevTools\include。
将SQLserver自带的用于数据库开发的头文件包含到工程环境中。
②Tools->options->directories->Lib Files:添加C:\ProgramFiles\Microsoft SQL Server\80\Tools\DevTools\x861ib。
将开发用到的包含到工程中。
③要在编译之前做的:project->Settings->Link->Object/Library Modules,添加库文件:SQLakw32.lib Caw32.lib。
SQLServer和嵌入式SQL
嵌入式SQL (ESQL) 是用于SQL 数据库访问的
SQL-92 标准应用程序接口(API)。
ESQL 的编译需要分两步进行:预编译器将嵌入式SQL 语句翻译成编写该应用程序所使用的编程语言中的命令。
生成的语句专供提供预编译器的数据库使用,因此,虽然原始源程序与ESQL 同类,但生成的语句和最后的可执行文件专门用于某个数据库供应商。
然后,用应用程序编程语言的编译器编译由预编译器生成的源程序。
与OLE DB 这类COM API 或ODBC 这类调用级接口相比,嵌入式SQL 的语法更简单,因此更易于学习和编程。
但嵌入式SQL 不如OLE DB 或ODBC 灵活,在用OLE DB 或ODBC 精心编写的应用程序中,只需切换驱动程序或提供程序,即可从一个DBMS 切换到另一个。
在编译应用程序(例如开发按需查询工具时)时不识别SQL 语句的环境中,更适合使用OLE DB 和ODBC。
Microsoft SQL Server&S482; 2000 提供用于C 应用程序的嵌入式SQL 预编译器。
这个SQL Server 预编译器将嵌入式SQL语句翻译成对适当DB-Library API 函数的调用。
Microsoft 实现的ESQL 与DB-Library 应用程序有相同的
限制。
SQL Server 旨在支持用与Microsoft SQL Server 兼容的第三方嵌入式SQL 预编译器编译的COBOL 嵌入式SQL
应用程序。
虽然在Microsoft SQL Server 2000 中仍然支持用于 C 语言的嵌入式SQL API,但在SQL Server 以后的版本中,不再包含在使用此API 的应用程序上进行编程工作所需要的文件。
在SQL Server 的下一版本中,仍然支持使用用于 C 语言的嵌入式SQL 编写的现有应用程序的连接,但在以后的版本中也将不再提供这种支持。
编写新的应用程序时,请不要使用用于C 语言的嵌入式SQL。
修改现有应用程序时,强烈建议删除依赖用于 C 语言的嵌入式SQL 的内容。
可以使用Microsoft ActiveX Data Objects (ADO)、OLE DB 或ODBC 来代替用于C 语言的嵌入式SQL,对SQL Server 中的数据进行访问。
文章引用自:。