• 2.93 MB
  • 2022-04-22 11:51:43 发布

数据库原理与应用课后习题答案李春葆 编.doc

  • 142页
  • 当前文档由用户上传发布,收益归属用户
  1. 1、本文档共5页,可阅读全部内容。
  2. 2、本文档内容版权归属内容提供方,所产生的收益全部归内容提供方所有。如果您对本文有版权争议,可选择认领,认领后既往收益都归您。
  3. 3、本文档由用户上传,本站不保证质量和数量令人满意,可能有诸多瑕疵,付费之前,请仔细先通过免费阅读内容等途径辨别内容交易风险。如存在严重挂羊头卖狗肉之情形,可联系本站下载客服投诉处理。
  4. 文档侵权举报电话:19940600175。
'第1章网站与网页概述3第1章CHAPTER01数据库系统概述练习题1参考答案1.文件系统中的文件与数据库系统中的文件有何本质上的不同?答文件系统中的文件是面向应用的,一个文件基本上对应于一个应用程序,文件之间不存在联系,数据冗余大,数据共享性差,数据独立性差;数据库系统中的文件不再面向特定的某个或多个应用,而是面向整个应用系统,文件之间是相互联系着的,减少了数据冗余,实现了数据共享,数据独立性高。2.对数据库的3种不同数据观是如何划分的?答概念模式体现了数据库的总体观,称为DBA视图;内模式体现了数据库的存储观,称为系统程序员视图;外模式体现了数据库的用户观,称为用户视图。用户视图有多个,而其他视图只有一个。3.什么是数据独立性?数据库系统是如何实现数据独立性的?答数据独立性是指应用程序和数据之间相互独立、不受影响,即数据结构的修改不引起应用程序修改的特性。数据独立性包括物理数据独立性和逻辑数据独立性。物理数据独立性是指数据库物理结构改变时不必修改现有的应用程序。逻辑数据独立性是指数据库逻辑结构改变时应用程序不用改变。数据独立性是由DBMS的二级映象功能来保证的。数据库系统通常采用外模式、模式和内模式三级结构,数据库管理系统在这三级模式之间提供了外模式/概念模式和概念模式/内模式两层映象,当整个系统要求改变模式时(增加记录类型,增加数据项)时,由DBMS对各个外模式/概念模式的映象作相应改变,可以使外模式保持不变,由于应用程序是依据数据的外模式编写的,因而应用程序不必修改,保证了数据的逻辑独立性。当数据的存储结构改变时,由DBMS对概念模式/内模式映象作相应改变,可以使模式不变,从而应用程序也不必改变,保证了数据的物理独立性。 第2章数据模型3第1章网站与网页概述第2章CHAPTER02数据模型练习题2参考答案1.什么是关系?什么是关系框架?关系之间实现联系的手段是什么?什么是关系数据库?答关系是一张二维表,即元组的集合。关系框架是一个关系的属性名表。形式化表示为:R(A1,A2,…,An),其中:R为关系名,Ai为关系的属性名。关系之间实现联系的手段是通过关系之间的公共属性来实现联系。关系数据库是指对应于一个关系模型的所有关系的集合。2.某医院病房计算机管理中需如下信息。科室:科名、科地址、科电话、医生姓名病房:病房号、床位数、所属科室名医生:姓名、职称、所属科室名、年龄、工作证号病人:病历号、姓名、性别、诊断医生、病房号其中,一个科室有多个病房、多个医生;一个病房只能属于一个科室;一个医生只属于一个科室,但可负责多个病人的诊治;一个病人的主治医生只有一个。设计该计算机管理系统的E-R图。答对应的E-R图如图2.1所示。图2.1E-R图 第2章数据模型3第1章网站与网页概述3.学校有若干个系,每个系有若干名教师和学生;每个教师可以教授若干门课程,并参加多个项目;每个学生可以同时选修多门课程。请设计该学校的教学管理的E-R模型,要求给出每个实体、联系的属性。答该学校的教学管理E-R模型有以下实体:系、教师、学生、项目、课程。各实体属性如下:系(系编号,系名,系主任)教师(教师编号,教师姓名,职称)学生(学号,姓名,性别,班号)项目(项目编号,名称,负责人)课程(课程编号,课程名,学分)各实体之间的联系如下:教师担任课程的1:n“任课”联系教师参加项目的n:m“参加”联系学生选修课程的n:m“选修”联系系、教师和学生之间的所属关系的1:m:n“领导”联系对应的E-R模型如图2.2所示。图2.2E-R图 第3章关系数据库5第1章网站与网页概述第3章CHAPTER03关系数据库练习题3参考答案1.简述等值连接与自然连接的区别。答等值连接与自然连接的区别是:自然连接一定是等值连接,但等值连接不一定是自然连接,因为自然连接要求相等的分量必须是公共属性,而等值连接要求相等的分量不一定是公共属性;等值连接不把重复属性去掉,而自然连接要把重复属性去掉。2.设有关系R和S:RSABBCabbccbeadebd计算RS、RS和σA=C(RS)。B(SELECTAVG(degree)FROMscorebWHEREa.cno=b.cno)ORDERBYcnoGO程序执行结果如下:14.创建一个自定义函数maxscore,用于计算给定课程号的最高分,并用相关数据进行测试。解:对应的程序如下:USEschoolGOCREATEFUNCTIONmaxscore(@nochar(5))--建立函数maxscoreRETURNS@stTABLE--返回表@st。下面定义其表结构(snochar(5),cnochar(5),maxsfloat) 第9章T-SQL基础2DreamweaverCS3网页设计教程33第1章网站与网页概述ASBEGININSERT@st(sno,cno,maxs)--向@st中插入满足条件的记录SELECTsno,cno,degreeFROMscoreWHEREcno=@noANDdegree=(SELECTMAX(degree)FROMscoreWHEREcno=@no)RETURNENDGOSELECT*FROMmaxscore("3-105")GO程序执行结果如下:上机实验题4参考答案在上机实验题3建立的factory数据库上,完成如下各题的程序,要求以文本格式显示结果。(1)显示所有职工的年龄,并按职工号递增排序。(2)求出各部门的党员人数。(3)显示所有职工的姓名和2004年1月份的工资。(4)显示所有职工的职工号、姓名和平均工资。(5)显示所有职工的职工号、姓名、部门名和2004年2月份的工资,并按部门名的顺序排列。(6)显示各部门名和该部门的所有职工平均工资。(7)显示所有平均工资高于1200的部门名和对应的平均工资。(8)显示所有职工的职工号、姓名和部门类型,其中财务部和人事部属于管理部门,市场部属于市场部门。(9)若存在职工号为10的职工,则显示其工作部门名称,否则显示相应提示信息。(10)求出男女职工的平均工资,若男职工平均工资高出女职工平均工资50%,则显示“男职工比女职工的工资高多了”的信息;若男职工平均工资与女职工平均工资比率在1.5~0.8之间,则显示“男职工跟女职工的工资差不多”的信息;否则显示“女职工比男职工的工资高多了”的信息。操作过程(1)对应的程序如下:USEfactoryGOSELECT姓名,YEAR(GETDATE())-YEAR(出生日期)AS"年龄"FROMworkerORDERBY职工号GO 第9章T-SQL基础2DreamweaverCS3网页设计教程33第1章网站与网页概述执行结果如下:姓名年龄---------------------孙华56陈涛50刘欣56李涵43王小燕44李艺45魏君38孙天奇43陈明63李华52余慧28欧阳少兵37程西28张旗28刘夫文66(2)对应的程序如下:USEfactoryGOSELECTdepart.部门名,COUNT(*)AS"党员人数"FROMworker,departWHEREworker.党员否="是"ANDworker.部门号=depart.部门号GROUPBYdepart.部门名GO执行结果如下:部门名党员人数---------------------------财务部2人事部1市场部2(3)对应的程序如下:USEfactoryGOSELECTworker.姓名,salary.工资FROMworker,salaryWHEREworker.职工号=salary.职工号ANDYEAR(salary.日期)=2004ANDMONTH(salary.日期)=1GO执行结果如下:姓名工资--------------------------------孙华1201.5陈明1350.6程西750.8孙天奇900刘夫文2006.8刘欣1250余慧725张旗728王小燕1200 第9章T-SQL基础2DreamweaverCS3网页设计教程33第1章网站与网页概述李华1500.5陈涛1249.8李艺1000.6李涵1345魏君1100欧阳少兵1085(4)对应的程序如下:USEfactoryGOSELECTworker.职工号,worker.姓名,AVG(salary.工资)AS"平均工资"FROMworker,salaryWHEREworker.职工号=salary.职工号GROUPBYworker.职工号,worker.姓名GO执行结果如下:职工号姓名平均工资------------------------------------------1孙华120410陈涛1248.311刘欣1252.512李涵1347.513王小燕1202.514李艺1003.115魏君1102.52孙天奇902.53陈明1353.14李华15035余慧727.56欧阳少兵10857程西753.38张旗730.59刘夫文2009.3(5)对应的程序如下:USEfactoryGOSELECTworker.职工号,worker.姓名,depart.部门名,salary.工资AS"2004年2月工资"FROMworker,depart,salaryWHEREworker.部门号=depart.部门号ANDworker.职工号=salary.职工号ANDYEAR(salary.日期)=2004ANDMONTH(salary.日期)=2ORDERBYworker.部门号GO执行结果如下:职工号姓名部门名2004年2月工资----------------------------------------------------------1孙华财务部1206.57程西财务部759.811刘欣财务部125513王小燕财务部12052孙天奇人事部9059刘夫文人事部2011.83陈明人事部1359.610陈涛人事部1250.8 第9章T-SQL基础2DreamweaverCS3网页设计教程33第1章网站与网页概述8张旗人事部73314李艺市场部1009.612李涵市场部135015魏君市场部11056欧阳少兵市场部10854李华市场部1509.55余慧市场部730(6)对应的程序如下:USEfactoryGOSELECTdepart.部门名,AVG(salary.工资)AS"平均工资"FROMworker,depart,salaryWHEREworker.部门号=depart.部门号ANDworker.职工号=salary.职工号GROUPBYdepart.部门名GO执行结果如下:部门名平均工资--------------------------------------财务部1103.075人事部1248.74市场部1128.1(7)对应的程序如下:USEfactoryGOSELECTdepart.部门名,AVG(salary.工资)AS"平均工资"FROMworker,depart,salaryWHEREworker.部门号=depart.部门号ANDworker.职工号=salary.职工号GROUPBYdepart.部门名HAVINGAVG(salary.工资)>1200GO执行结果如下:部门名平均工资--------------------------------------人事部1248.74(8)对应的程序如下:USEfactoryGOSELECTworker.职工号,worker.姓名,CASEdepart.部门名WHEN"财务部"THEN"管理部门"WHEN"人事部"THEN"管理部门"WHEN"市场部"THEN"市场部门"ENDAS"部门类型"FROMworker,departWHEREworker.部门号=depart.部门号GO执行结果如下:职工号姓名部门类型----------------------------1孙华管理部门 第9章T-SQL基础2DreamweaverCS3网页设计教程33第1章网站与网页概述10陈涛管理部门11刘欣管理部门12李涵市场部门13王小燕管理部门14李艺市场部门15魏君市场部门2孙天奇管理部门3陈明管理部门4李华市场部门5余慧市场部门6欧阳少兵市场部门7程西管理部门8张旗管理部门9刘夫文管理部门(9)对应的程序如下:USEfactoryGODECLARE@noint,@depchar(10)SET@no=10IFEXISTS(SELECT*FROMworkerWHERE职工号=@no)BEGINSELECT@dep=depart.部门名FROMworker,departWHEREworker.职工号=@noANDworker.部门号=depart.部门号PRINT"职工号为"+CAST(@noASCHAR(2))+"的职工在"+CAST(@depASchar(6))+"工作"ENDELSEPRINT"不存在该职工号的记录"GO执行结果如下:职工号为10的职工在人事部工作。(10)对应的程序如下:USEfactoryGODECLARE@avg1float,@avg2float,@ratiofloat--计算男职工平均工资SELECT@avg1=AVG(salary.工资)FROMworker,salaryWHEREworker.职工号=salary.职工号ANDworker.性别="男"--计算女职工平均工资SELECT@avg2=AVG(salary.工资)FROMworker,salaryWHEREworker.职工号=salary.职工号ANDworker.性别="女"SET@ratio=@avg1/@avg2IF@ratio>1.5PRINT"男职工比女职工的工资高多了"ELSEIF@ratio>=0.8PRINT"男职工跟女职工的工资差不多"ELSEPRINT"女职工比男职工的工资高多了"GO执行结果如下: 第9章T-SQL基础2DreamweaverCS3网页设计教程33第1章网站与网页概述男职工跟女职工的工资差不多 第10章SQL高级应用49第1章网站与网页概述第10章CHAPTER10SQL高级应用练习题10参考答案1.数据检索时使用COMPUTE和COMPUTEBY产生的结果有何不同?答使用COMPUTE子句和COMPUTEBY子句都能既浏览明细数据,又看到统计的结果。只使用COMPUTE子句时,其查询的结果类似于总计;而使用COMPUTEBY子句时,其查询的结果将为带具体内容的分类进行统计。2.进行连接查询时应注意什么?答连接查询是指以指定表中的某个列或某些列作为连接条件,从两个或更多的表中查询关联数据的查询。进行连接查询时应注意以下几点:一般而言,基于主键和外键指定查询条件,连接条件可使用“主键=外键”。如果一个表有复合关键字,在连接表时,必须引用整个关键字。应尽可能限制连接语句中表的数目,连接的表越多,查询处理的时间越长。对于连接表的两个列应有相同或类似的数据类型。不要使用空值作为连接条件,因为空值计算不会和其他任何值相等。3.什么是交叉连接?答交叉连接是两个表的笛卡尔积,即两个表的记录进行交叉组合。4.内连接、外连接有什么区别?答内连接是从结果中删除与其他被连接表中没有匹配行的所有行,因此内连接可能会丢失信息。外连接会把内连接中删除原表中的一些行保留下来,保留哪些行由外连接的类型决定。5.外连接分为左外连接、右外连接和全外连接,它们有什么区别?答左外连接从结果中保留第一个表的所有行,但只包含第二个表中与第一个表匹配的行,第二个表相应的空行被放入NULL值。 第10章SQL高级应用49第1章网站与网页概述右外连接从结果中保留第二个表的所有行,但只包含第一个表中与第二个表匹配的行,第一个表相应的空行被放入NULL值。全外连接会把两个表所有行都显示在结果中,并尽可能多地匹配数据和连接条件。6.什么是事务?事务的特点是什么?答事务是指一个操作序列,这些操作序列要么都被执行,要么都不被执行,它是一个不可分割的工作单元。事务中任何一个语句执行时出错,系统都会返回到事务开始前的状态。事务是并发控制的基本单元,是数据库维护数据一致性的单位。在每个事务结束时,都能保持数据一致性。7.对事务的管理包括哪几方面?答在SQLServer中,对事务的管理包含3个方面。事务控制语句:控制事务执行的语句。包括将一系列操作定义为一个工作单元来处理。锁机制:封锁正被一个事务修改的数据,防止其他用户访问到“不一致”的数据。事务日志:使事务具有可恢复性。8.事务中能否包含CREATEDATABASE语句?答事务中不能包含CREATEDATABASE语句。9.简述事务保存点的概念。答保存点提供了一种机制,用于回滚部分事务。可以使用SAVETRANSACTIONsavepoint_name语句创建一个保存点,然后再执行ROLLBACKTRANSACTIONsavepoint_name语句回滚到该保存点,从而无须回滚到事务的开始。在不可能发生错误的情况下,保存点很有用。在很少出现错误的情况下使用保存点回滚部分事务,比让每个事务在更新之前测试更新的有效性更为有效。更新和回滚操作代价很大,因此只有在遇到错误的可能性很小,而且预先检查更新的有效性的代价相对很高的情况下,使用保存点才会非常有效。10.在应用程序中如何控制事务?答应用程序主要通过指定事务启动和结束的时间来控制事务。主要使用Transact-SQL语句。系统还必须能够正确处理那些在事务完成之前便终止事务的错误。事务是在连接层进行管理。当事务在一个连接上启动时,在该连接上执行的所有的T-SQL语句在该事务结束之前都是该事务的一部分。(1)启动事务在SQLServer中,可以按显式、自动提交或隐性模式启动事务。显式事务:通过发出BEGINTRANSACTION语句显式启动事务。自动提交事务:这是SQLServer的默认模式。每个单独的T-SQL语句都在其完成后提交,不必指定任何语句控制事务。隐性事务:通过T-SQLSETIMPLICIT_TRANSACTIONSON语句,将隐性事务模式设置为打开,下一个语句自动启动一个新事务,当该事务完成时,再下一个 第10章SQL高级应用49第1章网站与网页概述T-SQL语句又将启动一个新事务。(2)结束事务可以使用COMMIT或ROLLBACK语句结束事务。COMMIT:如果事务成功,则提交。COMMIT语句保证事务的所有修改在数据库中都永久有效。COMMIT语句还释放资源,如事务使用的锁。ROLLBACK:如果事务中出现错误,或者用户决定取消事务,可回滚该事务。ROLLBACK语句通过将数据返回到它在事务开始时所处的状态,来恢复在该事务中所做的所有修改。ROLLBACK还会释放由事务占用的资源。11.什么是锁定?答在SQLServer2005中,锁定就是给数据库对象加锁。使用锁定能确保事务完整性和数据库一致性。锁定可以防止用户读取正在由其他用户更改的数据,并可以防止多个用户同时更改相同数据。如果不使用锁定,则数据库中的数据可能在逻辑上不正确,并且对数据的查询可能会产生意想不到的结果。12.什么是死锁?答死锁是一种条件,不仅仅是在关系数据库管理系统(RDBMS)中发生,在任何多用户系统中都可以发生。当两个用户(或会话)具有不同对象的锁,并且每个用户需要另一个对象的锁时,就会出现死锁。每个用户都等待另一个用户释放他的锁。当两个连接陷入死锁时,SQLServer会进行检测,其中一个连接被选做死锁牺牲品,该连接的事务回滚,同时应用程序收到错误。13.简述游标的概念。答关系数据库中的操作会对整个行集产生影响。由SELECT语句返回的行集包括所有满足该语句WHERE子句中条件的行。由语句所返回的这一完整的行集被称为结果集。应用程序,特别是交互式联机应用程序,并不总能将整个结果集作为一个单元来有效地处理。这些应用程序需要一种机制以便每次处理一行或一部分行。游标就是提供这种机制的结果集扩展。游标通过以下方式扩展结果处理:允许定位在结果集的特定行。从结果集的当前位置检索一行或多行。支持对结果集中当前位置的行进行数据修改。为由其他用户对显示在结果集中的数据库数据所做的更改提供不同级别的可见性支持。提供脚本、存储过程和触发器中使用的访问结果集中的数据的T-SQL语句。14.给出以下程序的执行结果。USEschoolSELECTsno,cno,degreeFROMscoreWHEREsnoIN(103,105)ORDERBYsnoCOMPUTEAVG(degree)BYsnoGO 第10章SQL高级应用49第1章网站与网页概述解:结果如下:15.给出以下程序的执行结果。USEschoolGOSELECTteacher.tnameAS"教师",student.sclassAS"班号",AVG(score.degree)AS"平均分"FROMstudent,course,score,teacherWHEREstudent.sno=score.snoANDcourse.cno=score.cnoANDcourse.tno=teacher.tnoGROUPBYteacher.tname,student.sclassWITHCUBEGO解:结果如下:16.给出以下程序的执行结果。USEschoolGOBEGINTRANSACTIONMytran--启动事务INSERTINTOteacherVALUES(999,"张英","男","1960/03/05","教授","计算机系")--插入一个教师记录SAVETRANSACTIONMytran--保存点INSERTINTOteacherVALUES(888,"胡丽","男","1982/8/04","副教授","电子工程系")--插入一个教师记录ROLLBACKTRANSACTIONMytranCOMMITTRANSACTIONGOSELECT*FROMteacher--查询teacher表的记录GODELETEteacherWHEREtno="999"--删除插入的记录GO 第10章SQL高级应用49第1章网站与网页概述解:结果如下:17.编写一个程序,查询最高分的课程名。解采用子查询方式。程序如下:USEschoolGOSELECTcnameFROMcourseWHEREcno=(SELECTcnoFROMscoreWHEREdegree=(SELECTMAX(degree)FROMscore))GO18.编写一个程序,查询95033班的最高分的学生的学号、姓名、班号、课程号和分数。解:程序如下:USEschoolGOSELECTs.sno,s.sname,s.sclass,sc.cno,sc.degreeFROMstudents,scorescWHEREs.sno=sc.snoANDs.sclass="95033"ANDsc.degree=(SELECTMAX(degree)FROMstudent,scoreWHEREstudent.sno=score.snoANDstudent.sclass="95033")GO19.编写一个程序,查询平均分高于所有平均分的课程号。解:程序如下:USEschoolGOSELECTcno,AVG(degree)FROMscoreGROUPBYcnoHAVINGAVG(degree)>(SELECTAVG(degree)FROMscore)GO20.编写一个程序,创建一个新表stud,包含所有学生的姓名、课程名和分数,并以姓名排序。解:程序如下:USEschoolGOSELECTs.sname,c.cname,sc.degreeINTOstudFROMstudents,coursec,scorescWHEREs.sno=sc.snoANDc.cno=sc.cnoANDsc.degreeISNOTNULLORDERBYs.sname 第10章SQL高级应用49第1章网站与网页概述SELECT*FROMstudGO21.编写一个程序,输出每个班最高分的课程名和分数。解:采用数据来源为SELECT查询结果的方法。程序如下:USEschoolGOSELECTsclass,cname,MAX(degree)degreeFROM(SELECTs.sno,s.sname,s.sclass,c.cname,sc.degreeFROMstudents,coursec,scorescWHEREs.sno=sc.snoANDc.cno=sc.cnoANDdegreeISNOTNULL)TGROUPBYsclass,cnameORDERBYsclassGO执行结果如下:22.编写一个程序,采用游标方式输出所有课程的平均分。解:程序如下:USEschoolGO--声明变量DECLARE@c_namevarchar(8),@s_avgfloat--声明游标DECLAREst_cursorCURSORFORSELECTcourse.cname,AVG(score.degree)FROMcourse,scoreWHEREcourse.cno=score.cnoANDscore.degreeISNOTNULLGROUPBYcourse.cname--打开游标OPENst_cursor--提取第一行数据FETCHNEXTFROMst_cursorINTO@c_name,@s_avg--打印表标题PRINT"课程   平均分"PRINT"-----------------"WHILE@@FETCH_STATUS=0BEGIN--打印一行数据PRINT@c_name+""+CAST(@s_avgASchar(10))--提取下一行数据FETCHNEXTFROMst_cursorINTO@c_name,@s_avgEND--关闭游标CLOSEst_cursor--释放游标DEALLOCATEst_cursorGO其执行结果如下: 第10章SQL高级应用49第1章网站与网页概述23.编写一个程序,采用游标方式输出所有学号、课程号和成绩等级。解:程序如下:USEschoolGO--声明变量DECLARE@no1char(5),@no2char(6),@fschar(2)--声明游标DECLAREfs_cursorCURSORFORSELECTsno,cno,CASEWHENdegree>=90THEN"A"WHENdegree>=80THEN"B"WHENdegree>=70THEN"C"WHENdegree>=60THEN"D"WHENdegree<60THEN"E"ENDFROMscoreWHEREdegreeISNOTNULLORDERBYsno--打开游标OPENfs_cursor--提取第一行数据FETCHNEXTFROMfs_cursorINTO@no1,@no2,@fs--打印表标题PRINT"学号 课程号 等级"PRINT"-----------------"WHILE@@FETCH_STATUS=0BEGIN--打印一行数据PRINT@no1+""+@no2+""+@fs--提取下一行数据FETCHNEXTFROMfs_cursorINTO@no1,@no2,@fsEND--关闭游标CLOSEfs_cursor--释放游标DEALLOCATEfs_cursorGO其执行结果如下:24.编写一个程序,采用游标方式输出各班各课程的平均分。解:程序如下: 第10章SQL高级应用49第1章网站与网页概述USEschoolGO--声明变量DECLARE@bhchar(5),@kcchar(10),@fsfloat--声明游标DECLAREfs_cursorCURSORFORSELECTs.sclass,c.cname,AVG(sc.degree)FROMstudents,coursec,scorescWHEREs.sno=sc.snoANDc.cno=sc.cnoANDsc.degreeISNOTNULLGROUPBYs.sclass,c.cname--打开游标OPENfs_cursor--提取第一行数据FETCHNEXTFROMfs_cursorINTO@bh,@kc,@fs--打印表标题PRINT"班号 课程 平均分"PRINT"---------------------------"WHILE@@FETCH_STATUS=0BEGIN--打印一行数据PRINT@bh+""+@kc+""+CAST(@fsASvarchar(10))--提取下一行数据FETCHNEXTFROMfs_cursorINTO@bh,@kc,@fsEND--关闭游标CLOSEfs_cursor--释放游标DEALLOCATEfs_cursorGO其执行结果如下:上机实验题5参考答案在上机实验题4建立的factory数据库上,完成如下各题(所有SELECT语句的查询结果以文本格式显示)。(1)删除factory数据库上各个表之间建立的关系。(2)显示各职工的工资记录和相应的工资小计。(3)按性别和部门名的所有组合方式列出相应的平均工资。(4)在worker表中使用以下语句插入一个职工记录:INSERTINTOworkerVALUES(20,"陈立","女","55/03/08",1,"75/10/10",4)在depart表中使用以下语句插入一个部门记录:INSERTINTOdepartVALUES(5,"设备处")对worker和depart表进行全外连接显示职工的职工号、姓名和部门名, 第10章SQL高级应用49第1章网站与网页概述然后删除这两个插入的记录。(5)显示最高工资的职工的职工号、姓名、部门名、工资发放日期和工资。(6)显示最高工资的职工所在的部门名。(7)显示所有平均工资低于全部职工平均工资的职工的职工号和姓名。(8)采用游标方式实现(6)小题的功能。(9)采用游标方式实现(7)小题的功能。(10)先显示worker表中的职工人数,开始一个事务,插入一个职工记录,再显示worker表中的职工人数,回滚该事务,最后显示worker表中的职工人数。操作过程(1)删除factory数据库上各个表之间建立的关系的操作步骤如下:①启动SQLServer管理控制器。②在“对象资源管理器”中展开LCB-PC服务器节点。③展开“数据库”节点。④选中school,将其展开。⑤展开“数据库关系图”节点。⑥选中dbo.Diagram_1,右击,在出现的快捷菜单中选择“修改”命令,如图10.1所示。⑦在数据库关系图中,选择表示要从关系图中删除的关系的连接线(对于两条连线均进行⑦~⑨的操作)。⑧右击关系线,从快捷菜单中选择“从数据库中删除关系”命令。⑨出现一个消息框,提示确认删除。单击“是”按钮。⑩在出现的对话框中单击“是”按钮保存所做的修改。这样就将worker表和depart表以及worker表和salary表之间的关系删除了。图10.1factory数据库关系图 第10章SQL高级应用49第1章网站与网页概述(2)对应的程序如下:USEfactoryGOSELECTworker.职工号,worker.姓名,salary.工资FROMworker,salaryWHEREworker.职工号=salary.职工号ORDERBYworker.职工号,worker.姓名COMPUTESUM(salary.工资)BYworker.职工号GO执行结果如下:职工号姓名工资------------------------------------------1孙华1201.51孙华12010.5sum----------------------2408职工号姓名工资------------------------------------------10陈涛1245.810陈涛1250.8sum----------------------24910.6职工号姓名工资------------------------------------------11刘欣125511刘欣1250sum----------------------2505职工号姓名工资------------------------------------------12李涵134512李涵1350sum----------------------2695职工号姓名工资------------------------------------------13王小燕120513王小燕1200sum----------------------2405职工号姓名工资------------------------------------------ 第10章SQL高级应用49第1章网站与网页概述14李艺1000.614李艺1005.6sum----------------------20010.2职工号姓名工资------------------------------------------15魏君110515魏君1100sum----------------------2205职工号姓名工资------------------------------------------2孙天奇9052孙天奇900sum----------------------1805职工号姓名工资------------------------------------------3陈明1350.63陈明1355.6sum----------------------27010.2职工号姓名工资------------------------------------------4李华1500.54李华1505.5sum----------------------3006职工号姓名工资------------------------------------------5余慧7305余慧725sum----------------------1455职工号姓名工资------------------------------------------6欧阳少兵10856欧阳少兵1085sum----------------------2170 第10章SQL高级应用49第1章网站与网页概述职工号姓名工资------------------------------------------7程西755.87程西750.8sum----------------------15010.6职工号姓名工资------------------------------------------8张旗7288张旗733sum----------------------1461职工号姓名工资------------------------------------------9刘夫文20010.89刘夫文2011.8sum----------------------4018.6(3)对应的程序如下:USEfactoryGOSELECTworker.性别,depart.部门名,AVG(salary.工资)AS"平均工资"FROMworker,depart,salaryWHEREworker.职工号=salary.职工号ANDworker.部门号=depart.部门号GROUPBYworker.性别,depart.部门名WITHCUBEGO执行结果如下:性别部门名平均工资------------------------------------------男财务部1228.25男人事部1335.3男市场部1165.75男NULL12410.07女财务部977.9女人事部902.5女市场部1052.8女NULL992.78NULLNULL1161.64NULL财务部1103.075NULL人事部1248.74NULL市场部1128.1(4)对应的程序如下:USEfactoryGOINSERTINTOworkerVALUES("20","陈立","女","55/03/08",1,"75/10/10",4)GO 第10章SQL高级应用49第1章网站与网页概述INSERTINTOdepartVALUES(5,"设备处")GOSELECTworker.职工号,worker.姓名,depart.部门名FROMworkerFULLJOINdepartON(worker.部门号=depart.部门号)ORDERBYworker.职工号GODELETEFROMworkerWHERE职工号="20"GODELETEFROMdepartWHERE部门号=5GO执行结果如下:职工号姓名部门名------------------------------------NULLNULL设备处1孙华财务部10陈涛人事部11刘欣财务部12李涵市场部13王小燕财务部14李艺市场部15魏君市场部2孙天奇人事部20陈立NULL3陈明人事部4李华市场部5余慧市场部6欧阳少兵市场部7程西财务部8张旗人事部9刘夫文人事部(5)对应的程序如下:USEfactoryGOSELECTworker.职工号,worker.姓名,depart.部门名,salary.日期,salary.工资FROMworker,depart,salaryWHEREworker.部门号=depart.部门号ANDworker.职工号=salary.职工号ANDsalary.工资=(SELECTMAX(工资)FROMsalary)GO执行结果如下:职工号姓名部门名日期   工资----------------------------------------------------------------9刘夫文人事部2004-02-0400:00:00.000 2011.8(6)对应的程序如下:USEfactoryGOSELECT部门名FROMdepartWHERE部门号=(SELECT部门号FROMworker 第10章SQL高级应用49第1章网站与网页概述WHERE职工号=(SELECT职工号FROMsalaryWHERE工资=(SELECTMAX(工资)FROMsalary)))GO执行结果如下:部门名----------人事处(7)对应的程序如下:USEfactoryGOSELECT职工号,姓名FROMworkerWHERE职工号IN(SELECT职工号FROMsalaryGROUPBY职工号HAVINGAVG(工资)<(SELECTAVG(工资)FROMsalary))GO执行结果如下:职工号姓名--------------------14李艺15魏君2孙天奇5余慧6欧阳少兵7程西8张旗(8)对应的程序如下:USEfactoryGOSETNOCOUNTON--声明变量DECLARE@dnamechar(10)--声明游标DECLAREd_cursorCURSORFORSELECT部门名FROMdepartWHERE部门号=(SELECT部门号FROMworkerWHERE职工号=(SELECT职工号FROMsalaryWHERE工资=(SELECTMAX(工资)FROMsalary) 第10章SQL高级应用49第1章网站与网页概述))--打开游标OPENd_cursor--提取第一行数据FETCHNEXTFROMd_cursorINTO@dname--打印表标题PRINT"部门名"PRINT"---------"WHILE@@FETCH_STATUS=0BEGIN--打印一行数据PRINT@dname--提取下一行数据FETCHNEXTFROMd_cursorINTO@dnameEND--关闭游标CLOSEd_cursor--释放游标DEALLOCATEd_cursorGO执行结果如下:部门名---------人事部(9)对应的程序如下:USEfactoryGOSETNOCOUNTON--声明变量DECLARE@noint,@namechar(10)--声明游标DECLAREw_cursorCURSORFORSELECT职工号,姓名FROMworkerWHERE职工号IN(SELECT职工号FROMsalaryGROUPBY职工号HAVINGAVG(工资)<(SELECTAVG(工资)FROMsalary))--打开游标OPENw_cursor--提取第一行数据FETCHNEXTFROMw_cursorINTO@no,@name--打印表标题PRINT"职工号姓名"PRINT"-----------------"WHILE@@FETCH_STATUS=0BEGIN--打印一行数据PRINTCAST(@noASchar(8))+@name--提取下一行数据FETCHNEXTFROMw_cursorINTO@no,@nameEND--关闭游标CLOSEw_cursor--释放游标 第10章SQL高级应用49第1章网站与网页概述DEALLOCATEw_cursorGO执行结果如下:职工号姓名-----------------14李艺15魏君2孙天奇5余慧6欧阳少兵7程西8张旗(10)对应的程序如下:USEfactoryGODECLARE@numintSELECT@num=COUNT(*)FROMworkerPRINT"原职工人数:"+CAST(@numASCHAR(3))GODECLARE@numintBEGINTRANSACTION--启动事务--插入一个职工记录INSERTINTOworkerVALUES(20,"陈立","女","55/03/08",1,"75/10/10",4)PRINT"插入一个职工记录"SELECT@num=COUNT(*)FROMworkerPRINT"职工人数:"+CAST(@numASCHAR(3))ROLLBACKTRANSACTION--回滚事务GOPRINT"回滚事务"DECLARE@numintSELECT@num=COUNT(*)FROMworkerPRINT"职工人数:"+CAST(@numASCHAR(3))GO执行结果如下:原职工人数:15插入一个职工记录职工人数:16回滚事务职工人数:15 第11章索引51第1章网站与网页概述第11章CHAPTER11索引练习题11参考答案1.什么是索引?索引分为哪两种?各有什么特点?答索引是为了加速对表中数据行的检索而创建的一种分散的存储结构。根据索引的顺序与数据表的物理顺序是否相同,可以把索引分成两种类型。聚集索引:数据表的物理顺序和索引表的顺序相同,它根据表中的一列或多列值的组合排列记录。非聚集索引:数据表的物理顺序和索引表的顺序不相同,索引表仅仅包含指向数据表的指针,这些指针本身是有序的,用于在表中快速定位数据。2.创建索引有什么优缺点?答创建索引的优点如下:加速数据检索。加快表与表之间的连接。在使用ORDERBY和GROUPBY等子句进行数据检索的时候,可以减少分组和排序的时间。有利于SQLServer对查询进行优化。强制实施行的唯一性。创建索引的缺点如下:创建索引要花费时间和占用存储空间。建立索引可加快数据检索速度,却减慢了数据修改速度。3.哪些列上适合创建索引?哪些列上不适合创建索引?答一般来说,以下的列适合创建索引。主键:通常检索、存取表是通过主键来进行的,因此,应该考虑在主键上建立索引。 第11章索引51第1章网站与网页概述连接中频繁使用的列:用于连接的列若按顺序存放,则系统可以很快地执行连接。如外键,除用于实现参照完整性外,还经常用于进行表的连接。在某一范围内频繁搜索的列和按排序顺序频繁检索的列。以下的列不适合创建索引:很少或从来不在查询中引用的列,因为系统很少或从来不根据这个列的值去查找数据行。只有两个或很少几个值的列(如性别,只有两个值“男”或“女”),以这样的列创建索引并不能得到建立索引的好处。以bit、text、image数据类型定义的列。数据行数很少的小表一般也没有必要创建索引。4.创建索引时须考虑哪些事项?答使用CREATEINDEX语句创建索引。默认情况下,如果未指定聚集选项,将创建非聚集索引。创建索引时须考虑的事项如下:只有表的所有者可以在同一个表中创建索引。每个表中只能创建一个聚集索引。每个表可以创建的非聚集索引最多为249个(包括PRIMARYKEY或UNIQUE约束创建的任何索引)。包含索引的所有长度固定列的最大大小为900字节。例如,不可以在定义为char(300)、char(300)和char(301)的三个列上创建单个索引,因为总宽度超过了900字节。包含同一索引的列的最大数目为16。5.如何创建升序和降序索引?答创建索引时,可以指定每列的数据是按升序还是降序存储。如果不指定,则默认为升序。另外,CREATETABLE、CREATEINDEX和ALTERTABLE语句的语法在索引中的各列上支持关键字ASC(升序)和DESC(降序)。例如:CREATETABLEObjTable--创建表ObjTable(ObjIDintPRIMARYKEY,ObjNamechar(10),ObjWeightdecimal(9,3))CREATENONCLUSTEREDINDEXDescIdxON--创建索引DescIdxObjTable(ObjNameASC,ObjWeightDESC)非聚集索引DescIdx以ObjName列升序、ObjWeight列降序进行索引。6.FILLFACTOR的物理含义是什么?将一个只读表的FILLFACTOR设为合适的值有什么好处?答FILLFACTOR的物理含义是指定在SQLServer创建索引的过程中,各索引页的填满程度。将一个非只读表的FILLFACTOR设为合适的值时,当系统向表中插入或更新数据时,SQLServer不需要花时间拆分该索引页。对于更新频繁的表,系统可以获得更好的更新性能。一个只读表的FILLFACTOR应设为100%。 第11章索引51第1章网站与网页概述上机实验题6参考答案在上机实验题5的factory数据库上,使用T-SQL语句完成如下各题:(1)在worker表中的“部门号”列上创建一个非聚集索引;若该索引已存在,则删除后重建。(2)在salary表的“职工号”和“日期”列创建聚集索引,并且强制唯一性。操作过程(1)对应的程序如下:USEfactoryGO--判断是否存在depno索引;若存在,则删除之IFEXISTS(SELECTnameFROMsysindexesWHEREname="depno")DROPINDEXworker.depnoGO--创建depno索引CREATEINDEXdepnoONworker(部门号)GOEXECsp_helpindexworkerGO执行结果如下:index_nameindex_descriptionindex_keys----------------------------------------------------------------depnononclusteredlocatedonPRIMARY部门号PK_workerclustered,unique,primarykeylocatedonPRIMARY职工号(2)对应的程序如下:USEfactoryGO--判断是否存在no_date索引;若存在,则删除之IFEXISTS(SELECTnameFROMsysindexesWHEREname="no_date")DROPINDEXsalary.no_dateGO--创建no_date索引CREATEUNIQUECLUSTEREDINDEXno_dateONsalary(职工号,日期)GOEXECsp_helpindexsalaryGO执行结果如下:index_nameindex_descriptionindex_keys--------------------------------------------------------------no_dateclustered,uniquelocatedonPRIMARY职工号,日期 第12章视图57第1章网站与网页概述第12章CHAPTER12视图练习题12参考答案1.什么是视图?使用视图的优点和缺点是什么?答视图是一个由SELECT语句指定,用以检索数据库表中某些行或列数据的语句存储定义。从本质上说,视图其实是一种SQL查询。使用视图的优点如下。查询的简单性:将复杂的查询(如多表的连接查询)定义为视图,保留了用户所关心的数据内容,剔除了那些不必要的冗余数据,使其数据环境更加容易控制,从而达到简化用户浏览和操作的目的。安全保护:数据库管理员可以在限制表用户的基础上进一步限制视图用户,可以为各种不同的用户授予或撤销在视图上的操作权限,这样,视图用户只能查询或修改他们各自所能见到的数据,从而保证数据库中数据的安全。掩盖数据库的复杂性:使用视图可以把数据库的设计和用户的使用屏蔽开来,当基本表发生更改或重新组合时,只需要修改视图的定义即可。用户还能够通过视图获得和数据库中的表一致的数据。使用视图的缺点如下。性能的降低:SQLServer必须把对视图的查询转化成对基本表的查询,如果这个视图是由一个复杂的多表查询所定义,即使是对视图的一个简单查询,SQLServer也把它变成一个复杂的对基础表的连接查询,会产生一定的时间开销。修改的限制:当用户要修改视图的某些行时,SQLServer必须把它转化为对基本表行的修改。对于简单的视图来说,这是很方便的,但是,对于比较复杂的视图来说,这可能是不可修改的。2.能从视图上创建视图吗?如何使视图的定义不可见? 第12章视图57第1章网站与网页概述答可以在视图上创建视图。要使视图的定义不可见,只要在创建视图时使用WITHENCRYPTION关键字加密视图的定义,防止其他用户查看最初的源代码即可。3.将创建视图的基础表从数据库中删除,视图也会一并删除吗?答将创建视图的基础表从数据库中删除,视图并不会被删除。4.能在视图上创建索引吗?在视图上创建索引有哪些优点?答可以在视图上创建索引。在视图上创建索引具有以下优点:通过对CREATEINDEX和CREATEVIEW语句进行简单语法扩展即可实现索引视图。索引视图中的数据随基表数据的更新自动更新,其方式与基表索引键的自动更新方式大体相同,无须使索引视图的内容与基表中的数据同步。无须在查询中指定特殊的提示,SQLServer优化器就会考虑索引视图。即使查询未在FROM子句中直接引用索引视图,优化器也将通过尝试匹配为视图生成的查询计划和为查询生成的计划的某些部分来考虑索引视图。若要将索引视图引入现有的数据库,必须只发出相关的CREATEVIEW和CREATEINDEX语句。必须对应用程序代码做少许改动才能使SQLServer利用视图上的任何索引。5.能否从使用聚合函数创建的视图上删除数据行?为什么?答不能从使用聚合函数创建的视图上删除数据行。因为由聚合函数创建的视图上的数据可能来自多行,SQLServer2005规定不允许在由聚合函数创建的视图上进行数据的更新或删除。6.更改视图名称会导致什么问题?答更改视图名称将导致引用该视图的存储过程、视图及触发器无效,要使这些数据库对象重新有效,就必须对这些数据库对象重新定义。7.修改视图中的数据会受到哪些限制?答修改视图中的数据受到的限制如下:无论是视图的创建、修改、删除,还是视图数据的查询、插入、更新、删除,都必须由具有权限的用户进行。对由多个表连接成的视图修改数据时,不能同时影响一个以上的基础表,也不允许删除视图中的数据。对视图上的某些列不能进行修改。这些列是:计算值、内置函数和行集合函数。对具有NOTNULL的列进行修改时可能会出错。在通过视图修改或插入数据时,必须保证未显示的具有NOTNULL属性的列有值,可以是缺省等,否则不能向视图中插入数据行。如果某些列因为规则或者约束的限制而不能接受从视图插入数据的时候,则插入数据操作可能会失败。删除基础表并但不删除视图。建议采用与表明显不同的名称命名视图。 第12章视图57第1章网站与网页概述上机实验题7参考答案在上机实验题6的factory数据库上,使用T-SQL语句完成如下各题:(1)建立视图view1,查询所有职工的职工号、姓名、部门名和2004年2月份工资,并按部门名顺序排列。(2)建立视图view2,查询所有职工的职工号、姓名和平均工资。(3)建立视图view3,查询各部门名和该部门的所有职工平均工资。(4)显示视图view3的定义。操作过程(1)对应的程序如下:USEfactoryGO--如果视图viewl存在,则删除IFEXISTS(SELECT*FROMsysobjectsWHEREname="view1"ANDtype="V")DROPVIEWview1GO--创建视图viewlCREATEVIEWview1ASSELECTTOP15worker.职工号,worker.姓名,depart.部门名,salary.工资AS"2004年月工资"FROMworker,depart,salaryWHEREworker.部门号=depart.部门号ANDworker.职工号=salary.职工号ANDYEAR(salary.日期)=2004ANDMONTH(salary.日期)=2ORDERBYworker.部门号GOSELECT*FROMview1GO执行结果如下:职工号姓名部门名2004年月工资---------------------------------------------1孙华财务部1206.511刘欣财务部125513王小燕财务部12057程西财务部755.810陈涛人事部1250.82孙天奇人事部9053陈明人事部1355.68张旗人事部7339刘夫文人事部2011.812李涵市场部135014李艺市场部1005.615魏君市场部11054李华市场部1505.55余慧市场部7306欧阳少兵市场部1085(2)对应的程序如下:USEfactory 第12章视图57第1章网站与网页概述GO--如果视图view2存在,则删除IFEXISTS(SELECT*FROMsysobjectsWHEREname="view2"ANDtype="V")DROPVIEWview2GO--创建视图view2CREATEVIEWview2ASSELECTworker.职工号,worker.姓名,AVG(salary.工资)AS"平均工资"FROMworker,salaryWHEREworker.职工号=salary.职工号GROUPBYworker.职工号,worker.姓名GOSELECT*FROMview2GO执行结果如下:职工号姓名平均工资-----------------------------1孙华120410陈涛12412.311刘欣1252.512李涵1347.513王小燕1202.514李艺1003.115魏君1102.52孙天奇902.53陈明1353.14李华15035余慧727.56欧阳少兵10857程西753.38张旗730.59刘夫文2009.3(3)对应的程序如下:USEfactoryGO--如果视图view3存在,则删除IFEXISTS(SELECT*FROMsysobjectsWHEREname="view3"ANDtype="V")DROPVIEWview2GO--创建视图view3CREATEVIEWview3ASSELECTdepart.部门名,AVG(salary.工资)AS"平均工资"FROMworker,depart,salaryWHEREworker.部门号=depart.部门号ANDworker.职工号=salary.职工号GROUPBYdepart.部门名GOSELECT*FROMview3GO执行结果如下:部门名平均工资-----------------------财务部1103.075人事部12412.74市场部11212.1 第12章视图57第1章网站与网页概述(4)对应的程序如下:USEfactoryGOEXECsp_helptext"view3"GO执行结果如下:Text---------------------------------------------------------------创建视图view3CREATEVIEWview3ASSELECTdepart.部门名,AVG(salary.工资)AS"平均工资"FROMworker,depart,salaryWHEREworker.部门号=depart.部门号ANDworker.职工号=salary.职工号GROUPBYdepart.部门名 第13章数据库完整性61第1章网站与网页概述第13章CHAPTER13数据库完整性练习题13参考答案1.什么是数据完整性?如果数据库不实施数据完整性会产生什么结果?答数据完整性是指数据的正确性、完备性和一致性,是衡量数据库质量好坏的重要标准。如果数据库不实施数据完整性,在用INSERT、DELETE、UPDATE语句修改数据库内容时,数据的完整性可能会遭到破坏,就可能会存在下列情况:无效的数据被添加到数据库的表中,如将学生考试成绩输入成负数;对数据库的修改不一致,如在一个表中修改了某学生的学号,但该学生的学号在另外一个表中却没有得到修改;将存在的数据修改为无效的数据,如将某学生的班号修改为并不存在的班级号。2.数据完整性有哪几类?如何实施?它们分别在什么级别上实施?答数据完整性分为以下3类。(1)域完整性:是指一个列的输入有效性,是否允许为空值。强制域完整性的方法有:限制类型(通过设定列的数据类型)、格式(通过CHECK约束和规则)或可能值的范围(通过FOREIGNKEY约束、CHECK约束、DEFAULT定义、NOTNULL定义和规则)。如:学生的考试成绩必须在0~100之间,性别只能是“男”或“女”。(2)实体完整性:是指保证表中所有的行唯一。实体完整性要求表中的所有行都有一个唯一标识符。这个唯一标识符可能是一列,也可能是几列的组合,称为主键。也就是说,表中的主键在所有行上必须取唯一值。强制实体完整性的方法有:索引、UNIQUE约束、PRIMARYKEY约束或IDENTITY属性。如:student表中sno(学号)的取值必须唯一,它唯一标识了相应记录所代表的学生,学号重复是非法的。学生的姓名不能作为主键,因为完全可能存在两个学生同名同姓的情况。(3)参照完整性:是指保证主关键字(被引用表) 第13章数据库完整性61第1章网站与网页概述和外部关键字(引用表)之间的参照关系。它涉及两个或两个以上表数据的一致性维护。外键值将引用表中包含此外键的记录和被引用表中主键与外键相匹配的记录关联起来。在输入、更改或删除记录时,参照完整性保持表之间已定义的关系,确保键值在所有表中一致。这样的一致性要求确保不会引用不存在的值,如果键值更改了,那么在整个数据库中,对该键值的所有引用要进行一致的更改。参照完整性是基于外键与主键之间的关系。例如学生学习课程的课程号必须是有效的课程号,score表(成绩表)的外键cno(课程号)将参考course表(课程表)中主键cno(课程号)以实现数据完整性。域完整性、实体完整性及参照完整性分别在列、行、表上实施。数据完整性任何时候都可以实施,但对已有数据的表实施数据完整性时,系统要先检查表中的数据是否满足所实施的完整性,只有表中的数据满足了所实施的完整性,数据完整性才能实施成功。3.什么是主键约束?什么是唯一性约束?两者有什么区别?答主键约束保证某一列或一组列值的组合相对于表中的每一行都是唯一的,这些列就是该表的主键。主键不允许有重复值,也不允许有空值。唯一性约束限制表中指定列上所有的非空值必须唯一,即表中任意两行在指定列上都不允许有相同的值。唯一性约束和主键约束的区别是:(1)唯一性约束与主键约束都为指定的列建立唯一索引,即不允许唯一索引的列上有相同的值。主键约束限制更严格,不但不允许有重复值,而且也不允许有空值。(2)唯一性约束与主键约束产生的索引可以是聚集索引,也可以是非聚集索引,但在默认情况下唯一性约束产生非聚集索引,主键约束产生聚集索引。4.创建PRIMARYKEY约束或UNIQUE约束时,SQLServer创建索引了吗?与创建标准索引相比哪个更好?答创建PRIMARYKEY约束或UNIQUE约束时,SQLServer创建唯一性索引。与创建标准索引相比,通过创建PRIMARYKEY约束或UNIQUE约束来创建索引更好。上机实验题8参考答案在上机实验题7的factory数据库上,使用T-SQL语句完成如下各题:(1)实施worker表的“性别”列默认值为“男”的约束。(2)实施salary表的“工资”列值限定在0~9999的约束。(3)实施depart表的“部门号”列值唯一的非聚集索引的约束。(4)为worker表建立外键“部门号”,参考表depart的“部门号”列。(5)建立一个规则sex:@性别="男"OR@性别="女",将其绑定到worker表的“性别”列上。(6)删除(1)小题所建立的约束。(7)删除(2)小题所建立的约束。(8)删除(3)小题所建立的约束。(9)删除(4)小题所建立的约束。(10)解除(5)小题所建立的绑定并删除规则sex。 第13章数据库完整性61第1章网站与网页概述操作过程(1)对应的程序如下:USEfactoryGOALTERTABLEworkerADDCONSTRAINTdefault_sexDEFAULT"男"FOR性别GO(2)对应的程序如下:USEfactoryGOALTERTABLEsalaryADDCONSTRAINTcheck_salaryCHECK(工资>0AND工资<9999)GO(3)对应的程序如下:USEfactoryGOALTERTABLEdepartADDCONSTRAINTunique_departUNIQUENONCLUSTERED(部门号)GOEXECsp_helpindexdepart--显示depart表上的索引GO执行结果如下:index_nameindex_descriptionindex_keys------------------------------------------------------------------PK_departclustered,unique,primarykeylocatedonPRIMARY部门号unique_departnonclustered,unique,uniquekeylocatedonPRIMARY部门号(4)对应的程序如下:USEfactoryGOALTERTABLEworkerADDCONSTRAINTFK_worker_noFOREIGNKEY(部门号)REFERENCESdepart(部门号)GO(5)对应的程序如下:USEfactoryGOCREATERULEsexAS@性别="男"OR@性别="女"GOEXECsp_bindrule"sex","worker.性别"GO(6)对应的程序如下:USEfactoryGOALTERTABLEworkerDROPCONSTRAINTdefault_sexGO 第13章数据库完整性61第1章网站与网页概述(7)对应的程序如下:USEfactoryGOALTERTABLEsalaryDROPCONSTRAINTcheck_salaryGO(8)对应的程序如下:USEfactoryGOALTERTABLEdepartDROPCONSTRAINTunique_departGO(9)对应的程序如下:USEfactoryGOALTERTABLEworkerDROPCONSTRAINTFK_worker_noGO(10)对应的程序如下:USEfactoryGOEXECsp_unbindrule"worker.性别"GODROPRULEsexGO 第14章存储过程65第1章网站与网页概述第14章CHAPTER14存储过程练习题14参考答案1.什么是存储过程?存储过程分为哪几类?使用存储过程有什么好处?答存储过程是一系列预先编辑好的、能实现特定数据操作功能的SQL代码集,它与特定的数据库相关联,存储在SQLServer服务器上。用户可以像使用函数一样重复调用这些存储过程,实现它所定义的操作。存储过程分为3类:系统提供的存储过程、用户定义的存储过程和扩展存储过程。使用存储过程有如下好处:存储过程提供了处理复杂任务的能力。存储过程提供了许多标准SQL所没有的高级特性,通过传递参数和执行逻辑表达式,能够处理复杂任务。增强代码的重用性和共享性。每一个存储过程可以在系统中重复地调用,可以被多个有访问权限的用户访问。存储过程可以增强代码的重用性和共享性,加快应用系统的开发速度,提高开发的质量和效率。减少网络数据流量。存储过程是存放在服务器中并在服务器上运行的,应用系统调用存储过程时只有触发执行存储过程的命令和执行结束返回的结果在网络中传输。所以,使用存储过程可以减少网络中的数据流量。加快系统运行速度。第一次执行后的存储过程会驻留在内存中,以后可以直接运行,从而加快应用系统的处理速度。加强系统安全性。SQLServer可以不授予用户某些表、视图的访问权限,但授予用户执行存储过程的权限,通过存储过程来对这些表或视图进行访问操作,从而保证表中数据的安全性。2.修改存储过程有哪几种方法?假设有一个存储过程需要修改但又不希望影响现有的权限,应使用哪个语句来进行修改?答 第14章存储过程65第1章网站与网页概述修改存储过程有两种方法:一种方法是把旧的存储过程删除,然后再重新建立该存储过程;另一种方法是用单个的步骤更改该存储过程。使用前一种方法修改存储过程,所有与该存储过程相关联的权限都将丢失。而使用后一种方法可以更改过程或参数定义,但为该存储过程定义的权限将保留。所以要修改一个存储过程但又不希望影响现有的权限时可使用后一种方法,使用的语句为ALTERPROCEDURE。上机实验题9参考答案在上机实验题8的factory数据库上,使用T-SQL语句完成如下各题:(1)创建一个为worker表添加职工记录的存储过程Addworker。(2)创建一个存储过程Delworker删除worker表中指定职工号的记录。(3)显示存储过程Delworker。(4)删除存储过程Addworker和Delworker。操作过程(1)建立存储过程的程序如下:USEfactoryGOCREATEPROCEDUREAddworker@noint=NULL,@namechar(10)=NULL,@sexchar(2)=NULL,@birthdaydatetime=NULL,@nachar(2)=NULL,@wtimedatetime=NULL,@depnoint=NULLASIF@noISNULLOR@nameISNULLOR@sexISNULLOR@birthdayISNULLOR@depnoISNULLBEGINPRINT"请重新输入该职工信息!"PRINT"你必须提供职工号、姓名、性别、出生日期、部门号"RETURNENDBEGINTRANSACTIONINSERTINTOworker   VALUES(@no,@name,@sex,@birthday,@na,@wtime,@depno)IF@@error<>0BEGINROLLBACKTRANRETURNENDCOMMITTRANSACTIONPRINT"职工"+@name+"的信息成功添加到表worker中"执行下列语句,可验证存储过程的正确性:USEfactoryGOAddworker20,"陈立","女","55/03/08","否","75/10/10",4GOSELECT职工号,姓名,性别,党员否FROMworkerGO 第14章存储过程65第1章网站与网页概述执行结果如下:职工陈立的信息成功添加到表worker中职工号姓名性别党员否-------------------------1孙华男是10陈涛男否11刘欣男否12李涵男是13王小燕女否14李艺女否15魏君女否2孙天奇女否20陈立女否3陈明男否4李华男否5余慧男是6欧阳少兵男否7程西女是8张旗男否9刘夫文男是(2)建立存储过程的程序如下:USEfactoryGOCREATEPROCEDUREDelworker@noint=NULLASIF@noISNULLBEGINPRINT"必须输入职工号!"RETURNENDBEGINTRANSACTIONDELETEFROMworkerWHERE职工号=@noIF@@error<>0BEGINROLLBACKTRANRETURNENDCOMMITTRANSACTIONPRINT"成功删除职工号为"+CAST(@noASCHAR(2))+"的职工记录"执行下列语句,可验证存储过程的正确性:USEfactoryGODelworker20GOSELECT职工号,姓名,性别,党员否FROMworkerGO执行结果如下:成功删除职工号为的职工记录职工号姓名性别党员否-------------------------1孙华男是10陈涛男否11刘欣男否 第14章存储过程65第1章网站与网页概述12李涵男是13王小燕女否14李艺女否15魏君女否2孙天奇女否3陈明男否4李华男否5余慧男是6欧阳少兵男否7程西女是8张旗男否9刘夫文男是(3)对应的程序如下:USEfactoryGOEXECsp_helptextDelworkerGO执行结果如下:Text--------------------------------------------------------------------CREATEPROCEDUREDelworker@noint=NULLASIF@noISNULLBEGINPRINT"必须输入职工号!"RETURNENDBEGINTRANSACTIONDELETEFROMworkerWHERE职工号=@noIF@@error<>0BEGINROLLBACKTRANRETURNENDCOMMITTRANSACTIONPRINT"成功删除职工号为"+CAST(@noASCHAR(2))+"的职工记录"(4)对应的程序如下:USEfactoryGOIFEXISTS(SELECTnameFROMsysobjectsWHEREname="Addworker"ANDtype="P")DROPPROCEDUREAddworkerGOIFEXISTS(SELECTnameFROMsysobjectsWHEREname="Delworker"ANDtype="P")DROPPROCEDUREDelworkerGO执行结果如下:命令已成功完成。 第15章触发器69第1章网站与网页概述第15章CHAPTER15触发器练习题15参考答案1.什么是触发器?其主要功能是什么?答触发器是一种实施复杂数据完整性的特殊存储过程,在对表或视图执行UPDATE、INSERT或DELETE语句时自动触发执行,以防止对数据进行不正确、未授权或不一致的修改。触发器主要用于保持数据完整性、检查数据有效性、实现数据库管理任务和一些附加的功能。2.触发器分为哪几种?答触发器分为DML和DDL触发器。DML触发器:是在执行数据操纵语言事件时被调用的触发器。其中数据操纵语言事件包括:INSERT、UPDATE和DELETE语句。触发器中可以包含复杂的T-SQL语句,触发器整体被看做一个事务,可以进行回滚。DDL触发器:它也是一种特殊的存储过程,由相应的事件触发后执行。与DML不同的是,它相应的触发事件是由数据定义语言引起的事件,包括CREATE、ALTER和DROP语句。DDL触发器用于执行数据库管理任务,如调节和审计数据库运转。DDL触发器在触发事件发生后才会调用执行,即它只能是AFTER类型的。3.INSERT触发器、UPDATE触发器和DELETE触发器有什么不同?答它们的主要区别是触发的事件不同,INSERT触发器由INSERT操作所触发执行;UPDATE触发器由UPDATE操作所触发执行;DELETE触发器由DELETE操作所触发执行。4.AFTER触发器和INSTEADOF触发器有什么不同?答两者的区别如下。 第15章触发器69第1章网站与网页概述AFTER触发器:在执行INSERT、UPDATE或DELETE语句操作之后执行AFTER触发器。指定AFTER与指定FOR相同,它是SQLServer早期版本中唯一可用的选项。AFTER触发器只能在表上指定。一个表可以有多个AFTER触发器。INSTEADOF触发器:执行INSTEADOF触发器代替通常的触发动作。还可为带有一个或多个基表的视图定义INSTEADOF触发器,而这些触发器能够扩展视图可支持的更新类型。一个表只能具有一个给定类型的INSTEADOF触发器。5.创建DML触发器时需指定哪些项?答创建DML触发器时需指定的项有:名称。定义触发器时所基于的表。触发器被触发的时间。激活触发器的数据修改语句。有效选项为INSERT、UPDATE或DELETE。多个数据修改语句可激活同一个触发器。例如,触发器可由INSERT或UPDATE语句激活。执行触发器操作的编程语句。上机实验题10参考答案在上机实验题9的factory数据库上,使用T-SQL语句完成如下各题:(1)在表depart上创建一个触发器depart_update,当更改部门号时同步更改worker表中对应的部门号。(2)在表worker上创建一个触发器worker_delete,当删除职工记录时同步删除salary表中对应职工的工资记录。(3)删除触发器depart_update。(4)删除触发器worker_delete。操作过程(1)建立触发器depart_update的程序如下:USEfactoryGOIFEXISTS(SELECTnameFROMsysobjectsWHEREtype="TR"ANDname="depart_update")DROPTRIGGERdepart_updateGOCREATETRIGGERdepart_updateONdepartFORUPDATEASDECLARE@olddepnoint,@newdepnointSELECT@olddepno=部门号FROMdeletedSELECT@newdepno=部门号FROMinsertedUPDATEworker 第15章触发器69第1章网站与网页概述SET部门号=@newdepnoWHERE部门号=@olddepnoGO执行下列语句,可验证存储过程的正确性:USEfactoryGOPRINT"将部门号101改为105"UPDATEdepartSET部门号=105WHERE部门号=101GOSELECT职工号,姓名,部门号FROMworkerGOPRINT"将部门号105改为101"UPDATEdepartSET部门号=101WHERE部门号=105GOSELECT职工号,姓名,部门号FROMworkerGO执行结果如下:将部门号101改为105职工号姓名部门号-------------------------------1孙华10510陈涛10211刘欣10512李涵10313王小燕10514李艺10315魏君1032孙天奇1023陈明1024李华1035余慧1036欧阳少兵1037程西1058张旗1029刘夫文102将部门号105改为101职工号姓名部门号-------------------------------1孙华10110陈涛10211刘欣10112李涵10313王小燕10114李艺10315魏君1032孙天奇1023陈明1024李华1035余慧103 第15章触发器69第1章网站与网页概述6欧阳少兵1037程西1018张旗1029刘夫文102(2)建立触发器worker_delete的程序如下:USEfactoryGOIFEXISTS(SELECTnameFROMsysobjectsWHEREtype="TR"ANDname="worker_delete")DROPTRIGGERworker_deleteGOCREATETRIGGERworker_deleteONworkerFORDELETEASDECLARE@nointSELECT@no=职工号FROMdeletedDELETEFROMsalaryWHERE职工号=@noGO执行下列语句,可验证存储过程的正确性:USEfactoryGOPRINT"删除前的工资记录"SELECT*FROMsalaryGODELETEFROMworkerWHERE职工号=15GOPRINT"删除职工号为15的职工记录后的工资记录"SELECT*FROMsalaryGO执行结果如下:删除前的工资记录职工号姓名日期工资-------------------------------------------------1孙华2004-01-0400:00:00.0001201.51孙华2004-02-0400:00:00.0001206.510陈涛2004-01-0400:00:00.0001245.810陈涛2004-02-0400:00:00.0001250.811刘欣2004-01-0400:00:00.000125011刘欣2004-02-0400:00:00.000125512李涵2004-01-0400:00:00.000134512李涵2004-02-0400:00:00.000135013王小燕2004-01-0400:00:00.000120013王小燕2004-02-0400:00:00.000120514李艺2004-01-0400:00:00.0001000.614李艺2004-02-0400:00:00.0001005.615魏君2004-01-0400:00:00.000110015魏君2004-02-0400:00:00.00011052孙天奇2004-01-0400:00:00.0009002孙天奇2004-02-0400:00:00.0009053陈明2004-01-0400:00:00.0001350.63陈明2004-02-0400:00:00.0001355.64李华2004-01-0400:00:00.0001500.54李华2004-02-0400:00:00.0001505.5 第15章触发器69第1章网站与网页概述5余慧2004-01-0400:00:00.0007255余慧2004-02-0400:00:00.0007306欧阳少兵2004-01-0400:00:00.00010856欧阳少兵2004-02-0400:00:00.00010857程西2004-01-0400:00:00.000750.87程西2004-02-0400:00:00.000755.88张旗2004-01-0400:00:00.0007288张旗2004-02-0400:00:00.0007339刘夫文2004-01-0400:00:00.0002006.89刘夫文2004-02-0400:00:00.0002015.8删除职工号为15的职工记录后的工资记录职工号姓名日期工资-------------------------------------------------1孙华2004-01-0400:00:00.0001201.51孙华2004-02-0400:00:00.0001206.510陈涛2004-01-0400:00:00.0001245.810陈涛2004-02-0400:00:00.0001250.811刘欣2004-01-0400:00:00.000125011刘欣2004-02-0400:00:00.000125512李涵2004-01-0400:00:00.000134512李涵2004-02-0400:00:00.000135013王小燕2004-01-0400:00:00.000120013王小燕2004-02-0400:00:00.000120514李艺2004-01-0400:00:00.0001000.614李艺2004-02-0400:00:00.0001005.62孙天奇2004-01-0400:00:00.0009002孙天奇2004-02-0400:00:00.0009053陈明2004-01-0400:00:00.0001350.63陈明2004-02-0400:00:00.0001355.64李华2004-01-0400:00:00.0001500.54李华2004-02-0400:00:00.0001505.55余慧2004-01-0400:00:00.0007255余慧2004-02-0400:00:00.0007306欧阳少兵2004-01-0400:00:00.00010856欧阳少兵2004-02-0400:00:00.00010857程西2004-01-0400:00:00.000750.87程西2004-02-0400:00:00.000755.88张旗2004-01-0400:00:00.0007288张旗2004-02-0400:00:00.0007339刘夫文2004-01-0400:00:00.0002006.89刘夫文2004-02-0400:00:00.0002015.8(3)删除触发器depart_update的程序如下:USEfactoryGODROPTRIGGERdepart_updateGO(4)删除触发器worker_delete的程序如下:USEfactoryGODROPTRIGGERworker_deleteGO 第16章SQLServer的安全管理75第1章网站与网页概述第16章CHAPTER16SQLServer的安全管理练习题16参考答案1.SQLServer登录账号和用户账号有什么区别?答在SQLServer中有两种类型的账户:一类是登录服务器的登录账号(即服务器登录账号或用户登录账号,其名称就是登录名);另一类是使用数据库的用户账号(即数据库用户账号或用户账号,其名称就是用户名)。登录账号是指能登录到SQLServer的账号,属于服务器的层面,本身并不能让用户访问服务器中的数据库,而登录者要使用服务器中的数据库时,必须有用户账号才能存取数据库。2.简述何为guest用户。答guest用户账户允许在没有用户账户时登录访问数据库。当满足下列所有条件时,登录采用guest用户的标识:登录有访问SQLServer实例的权限,但没有通过自己的用户账户访问数据库的权限。数据库中含有guest用户账户。可以将权限应用到guest用户,就如同它是任何其他用户账户一样。可以在除master和tempdb外(在这两个数据库中它必须始终存在)的所有数据库中添加或删除guest用户。默认情况下,新建的数据库中没有guest用户账户。3.简述何为权限验证。答当验证了用户的身份并允许其登录到SQLServer实例之后,在用户必须访问的每个数据库中都要求单独的用户账户。在每个数据库中都要求用户账户可防止用户连接到SQLServer实例并访问服务器上的所有数据库。例如,如果一个服务器上含有A数据库和B数据库,可以访问B数据库但不能访问A数据库的用户将只有在B数据库中创建的用户账户。每个数据库中的用户账户都用于为该数据库中的对象(表、视图和存储过程等)应用安全权限。可从Windows用户账户、用户所属的Windows用户组或者SQLServer登录账户映射该用户账户。如果没有直接映射的账户,就可以允许用户以guest账 第16章SQLServer的安全管理75第1章网站与网页概述户在数据库中工作,前提是该账户存在。用户所准予的活动由获得数据库访问权限时所使用用户账户的权限控制。用户获得对数据库的访问权限后,SQLServer即接受命令。用户在数据库中所进行的所有活动都通过T-SQL语句传到SQLServer中。当SQLServer实例接收到T-SQL语句时,将确定用户是否有在数据库中执行该语句的权限。如果用户没有执行语句的权限,或者没有访问该语句所使用对象的权限,则SQLServer将返回权限错误。4.简述何为public角色。答public角色是一个特殊的数据库角色,每个数据库用户都属于它。public角色具有如下特点:捕获数据库中用户的所有默认权限。无法将用户、组或角色指派给它,因为默认情况下它们即属于该角色。包含在每个数据库中,包括master、msdb、tempdb、model和所有用户数据库。无法除去。5.简述何为固定数据库角色。答在SQLServer中,每个数据库中都存在预定义的角色,该角色的作用域限于其所定义于的数据库,这些预定义的角色就是固定数据库角色。6.简述何为数据库所有者(dbo)。答dbo是具有在数据库中执行所有活动的暗示性权限的用户。将固定服务器角色sysadmin的任何成员都映射到每个数据库内称为dbo的一个特殊用户上。另外,由固定服务器角色sysadmin的任何成员创建的任何对象都自动属于dbo。例如,如果用户User1是固定服务器角色sysadmin的成员,并创建表T1,则表T1属于dbo,并以dbo.T1而不是User1.T1进行限定;相反,如果User1不是固定服务器角色sysadmin的成员,而只是固定数据库角色db_owner的成员,并创建表T1,则T1属于User1,并限定为User1.T1。该表属于User1,因为该成员没有将表限定为dbo.T1。无法删除dbo用户,且此用户始终出现在每个数据库中。只有由sysadmin固定服务器角色成员(或dbo用户)创建的对象才属于dbo。由任何其他也不是syadmin固定服务器角色成员的用户(包括db_owner固定数据库角色成员)创建的对象:属于创建该对象的用户,而不是dbo。用创建该对象的用户名限定。上机实验题11参考答案在SQLServer管理控制器中完成如下操作:(1)创建一个登录账号XYZ/123(其默认的工作数据库为factory;其“服务器角色”设置为sysadmin;将“映射到此登录名的用户”设置为Factory,使其具有public权限;设置安全对象LCB-PC服务器具有ConnectSQL权限)。 第16章SQLServer的安全管理75第1章网站与网页概述(2)修改(1)中为factory数据库创建的用户账号XYZ的属性,使XYZ登录账号对factory数据库具有db_owner权限。操作过程(1)对应的操作步骤如下:①启动SQLServer管理控制器。②在“对象资源管理器”中展开LCB-PC节点。③展开“安全性”节点。④选中“登录名”,右击,在出现的快捷菜单中选择“新建登录名”命令。⑤出现“登录名-新建”对话框,选择“常规”选项卡,在“登录名”文本框中输入XYZ,在身份验证区中选择“SQLServer身份验证”单选按钮,输入密码和确认密码均为123,不选中“强制实施密码策略”、“强制密码过期”和“用户在下次登录时必须更改密码”复选框。在“默认数据库”下拉列表框中选择Factory数据库,“默认语言”下拉列表框保持默认工作语言,如图16.1所示。图16.1“常规”选项卡⑥选择“服务器角色”选项卡,在其中的“服务器角色”列表框中选中sysadmin,如图16.2所示。 第16章SQLServer的安全管理75第1章网站与网页概述图16.2“服务器角色”选项卡⑦选择“用户映射”选项卡,在其中“映射到此登录名的用户”列表框中选中Factory,在“数据库角色成员身份”列表框中选中public(默认值),如图16.3所示。图16.3“用户映射”选项卡⑧选择“安全对象”选项卡,单击“添加”按钮;在出现的“添加对象”对话框中选中“特定类型的所有对象”,单击“确认”按钮;在出现的“选择对象类型”对话框中选中“服务器”,单击“确认”按钮返回到“安全对象”选项卡;在“LCB-PC的显式权限”列表框中选中ConnectSQL。如图16.4所示。 第16章SQLServer的安全管理75第1章网站与网页概述图16.4“安全对象”选项卡⑨选择“状态”选项卡,从中可以设置是否允许登录名连接到数据库引擎,以及是否启用等。这里保留所有默认设置不变,如图16.5所示。图16.5“状态”选项卡⑩单击“确定”按钮,即可完成创建SQLServer登录名XYZ。(2)对应的操作步骤如下:①启动SQLServer管理控制器。②在“对象资源管理器”中展开LCB-PC节点。 第16章SQLServer的安全管理75第1章网站与网页概述③展开“数据库”节点。④展开factorry节点。⑤展开“安全性”节点。⑥展开“用户”节点。⑦选中XYZ,右击,在出现的快捷菜单中选择“属性”命令。⑧在“数据库角色成员身份”列表框中选中db_owner,这样XYZ登录账号对Factory数据库就具有了db_owner权限,如图16.6所示。⑨单击“确定”按钮。图16.6“常规”选项卡 第17章数据备份与恢复79第1章网站与网页概述第17章CHAPTER17数据备份与恢复练习题17参考答案1.什么是备份?备份分为哪几种类型?答数据库备份是指系统管理员定期或不定期地将数据库部分或全部内容复制到磁带或另一个磁盘上保存起来的过程。这些复制的数据备份称为后备副本。备份可分为静态备份和动态备份。备份期间不允许对数据库进行任何存取、修改活动的备份方式称为静态备份。备份期间允许对数据库进行存取或修改,即备份和用户事务可以并发执行的备份方式称为动态备份。2.何为差异数据库备份?答差异数据库备份只记录自上次数据库备份后发生更改的数据。差异数据库备份比数据库备份小,而且备份速度快,因此可以更经常地备份,经常备份将减少丢失数据的危险。3.何为备份媒体?答备份媒体是备份设备用来存储备份的实际物理存储。备份媒体可以是磁盘,也可以是磁带。例如,备份设备可以是文件C:BackupsAccountingFull.bak,备份媒体是包含该文件的磁盘。同样,对于磁带,备份设备可以是本地计算机上的磁带设备,备份媒体是用来存储备份的物理磁带。4.确定备份计划应该考虑哪些因素?答确定备份计划主要考虑以下几个方面:确定备份的频率。确定备份频率要考虑两个因素:一是系统还原时的工作量,二是系统活动的事务量。对于完整数据库备份,可以是每个月、每一周甚至是每一天进行,而事务日志备份可以是每一周、每一天甚至是每一小时进行。确定备份的内容。确定数据库中的哪些数据需要备份。确定备份的介质。确定是使用磁盘还是磁带作为备份的介质。确定备份的方式。确定备份采用动态备份还是静态备份。估计备份需要的存储空间量。在执行备份前,应该估计备份需要使用的存储空间量。 第17章数据备份与恢复79第1章网站与网页概述确定备份的人员。应该指定专人负责数据库的备份,一般只有下列角色的成员才可以备份数据库:服务器角色sysadmin、数据库角色db_owner和db_backupoperator。是否使用备份服务器。如果使用备份服务器,那么在出现故障时,系统就能迅速地得到还原。确定备份存储的期限和存放地点。备份应该存储在安全的地方并保存适当的期限。5.进行数据库还原应该注意哪两点?答进行数据库还原以前,应注意以下两点:在数据库还原前,应该删除故障数据库,以便删除对故障数据库的任何引用。在数据库还原前,必须限制用户对数据库的访问,数据库的还原是静态的,应使用SQLServer管理控制器设置数据库为单用户。上机实验题12参考答案使用SQLServer管理控制器对factory数据库执行完全备份(备份到H:DBFbackup1文件中)和恢复操作。操作过程(1)启动SQLServer管理控制器。(2)在“对象资源管理器”中展开LCB-PC服务器。(3)展开“数据库”节点。(4)选中factory,右击,在出现的快捷菜单中选择“属性”命令。(5)出现“数据库属性-Factory”对话框,选择“选项”选项卡,如图17.1所示,将恢复模式设置为“完整”选项。 第17章数据备份与恢复79第1章网站与网页概述图17.1“选项”选项卡(6)单击“确定”按钮,这样即将factory数据库设置为了完整恢复模式。(7)选中factory,右击,在出现的快捷菜单中选择“任务”|“备份”命令。(8)出现“备份数据库-Factory”对话框,其“选项”选项卡如图17.2所示;单击“删除”按钮删除“备份到”列表框中原来的项。图17.2“常规”选项卡(9)单击“添加”按钮,出现“选择备份目标”对话框;单击“...”按钮选择备份文件名为H:DBFbackup1,如图17.3所示,单击“确定”按钮。图17.3“选择备份目标”对话框(10)此时的“常规”选项卡如图17.4所示,单击“确定”按钮即开始完整备份工作。 第17章数据备份与恢复79第1章网站与网页概述图17.4修改后的“常规”选项卡 第18章数据转换83第1章网站与网页概述第18章CHAPTER18数据转换练习题18参考答案1.SQLServer导入和导出向导有什么功能?答使用SQLServer导入和导出向导可以在支持的数据源和目标之间复制和转换数据。2.SQLServer导入和导出向导可以访问哪些数据源?答SQLServer导入和导出向导可以访问各种数据源。可以向下列源复制数据或从其中复制数据:MicrosoftSQLServer平面文件MicrosoftOfficeAccessMicrosoftOfficeExcel其他OLEDB访问接口3.什么是分离数据库?什么是附加数据库?答分离数据库是指将数据库从SQLServer实例中删除,但是数据库在其数据文件和事务日志文件中保持不变,之后就可以使用这些文件将数据库附加到任何SQLServer实例,包括分离该数据库的服务器。附加数据库就是将数据库重置为其分离或复制时的状态。4.生成SQLServer脚本向导有哪些功能?答生成SQLServer脚本向导引导用户完成创建脚本的各个步骤,并允许选择要创建脚本的各种对象。该向导提供各种用于创建脚本的选项,包括是否包含权限、排序规则、约束等。5.SQL脚本包含哪些内容?答 第18章数据转换83第1章网站与网页概述SQL脚本包含用于创建数据库及其对象的语句的描述。可以从现有数据库中的对象生成脚本,然后通过在该数据库中运行脚本以将这些对象添加到其他数据库。实际上,这样做重新创建了完整的数据库结构以及所有的单个数据库对象。上机实验题13参考答案使用SQLServer管理控制器生成数据库factory的脚本文件H:DBFfactory.sql,并显示该文件的内容。操作过程(1)启动SQLServer管理控制器。(2)在“对象资源管理器”中展开LCB-PC服务器。(3)展开“数据库”节点。(4)选中factory,右击,在出现的快捷菜单中选择“编写数据库脚本为”|“CREATE到”|“文件”命令。(5)出现“选择文件”对话框,在“保存在”下拉列表框中设置文件的保存位置,在“文件名”下拉列表框中输入相应的脚本名称,这里将脚本保存到H:DBFfactory.sql文件中。单击“保存”按钮,开始编写SQL脚本。(6)选择“文件”|“打开”|“文件”命令,在出现的“打开文件”对话框中选择H:DBFfactory.sql文件,SQL编辑器中显示其内容如下:USE[master]GO/****对象:Database[Factory]脚本日期:03/11/200818:05:45****/CREATEDATABASE[Factory]ONPRIMARY(NAME=N"Factory",FILENAME=N"H:SQLServerFactory.mdf",SIZE=3072KB,MAXSIZE=UNLIMITED,FILEGROWTH=1024KB)LOGON(NAME=N"Factory_log",FILENAME=N"H:SQLServerFactory_log.ldf",SIZE=1024KB,MAXSIZE=2048GB,FILEGROWTH=10%)COLLATEChinese_PRC_CI_ASGOEXECdbo.sp_dbcmptlevel@dbname=N"Factory",@new_cmptlevel=90GOIF(1=FULLTEXTSERVICEPROPERTY("IsFullTextInstalled"))beginEXEC[Factory].[dbo].[sp_fulltext_database]@action="disable"endGOALTERDATABASE[Factory]SETANSI_NULL_DEFAULTOFFGOALTERDATABASE[Factory]SETANSI_NULLSOFFGOALTERDATABASE[Factory]SETANSI_PADDINGOFFGOALTERDATABASE[Factory]SETANSI_WARNINGSOFFGOALTERDATABASE[Factory]SETARITHABORTOFFGOALTERDATABASE[Factory]SETAUTO_CLOSEOFF 第18章数据转换83第1章网站与网页概述GOALTERDATABASE[Factory]SETAUTO_CREATE_STATISTICSONGOALTERDATABASE[Factory]SETAUTO_SHRINKOFFGOALTERDATABASE[Factory]SETAUTO_UPDATE_STATISTICSONGOALTERDATABASE[Factory]SETCURSOR_CLOSE_ON_COMMITOFFGOALTERDATABASE[Factory]SETCURSOR_DEFAULTGLOBALGOALTERDATABASE[Factory]SETCONCAT_NULL_YIELDS_NULLOFFGOALTERDATABASE[Factory]SETNUMERIC_ROUNDABORTOFFGOALTERDATABASE[Factory]SETQUOTED_IDENTIFIEROFFGOALTERDATABASE[Factory]SETRECURSIVE_TRIGGERSOFFGOALTERDATABASE[Factory]SETENABLE_BROKERGOALTERDATABASE[Factory]SETAUTO_UPDATE_STATISTICS_ASYNCOFFGOALTERDATABASE[Factory]SETDATE_CORRELATION_OPTIMIZATIONOFFGOALTERDATABASE[Factory]SETTRUSTWORTHYOFFGOALTERDATABASE[Factory]SETALLOW_SNAPSHOT_ISOLATIONOFFGOALTERDATABASE[Factory]SETPARAMETERIZATIONSIMPLEGOALTERDATABASE[Factory]SETREAD_WRITEGOALTERDATABASE[Factory]SETRECOVERYFULLGOALTERDATABASE[Factory]SETMULTI_USERGOALTERDATABASE[Factory]SETPAGE_VERIFYCHECKSUMGOALTERDATABASE[Factory]SETDB_CHAININGOFF 第19章VB与数据库99第1章网站与网页概述第19章CHAPTER19VB与数据库练习题19参考答案1.在VB中可以访问哪些类型的数据库?答VB可以访问的数据库有以下3类。Jet数据库。数据库由Jet引擎直接生成和操作,不仅灵活而且速度快。MicrosoftAccess与VB使用相同的Jet数据库引擎。ISAM数据库。索引顺序访问方法(ISAM)数据库有几种不同的形式,如dBase、FoxPro、TextFiles和Paradox。在VB中可以生成和操作这些数据库。ODBC数据库。开放数据库连接,这类数据库包括遵守ODBC标准的客户机/服务器数据库,如MicrosoftSQLServer、Oracle、Sybase等,VB可以使用任何支持ODBC标准的数据库。2.ODBC由哪几部分组成?答ODBC由以下几部分组成。客户应用程序:是为了访问数据库而开发的前端,它通过ODBC的API来建立与数据库的连接,并使用SQL命令操纵数据库。ODBC数据源:用于描述数据库管理系统、远程操纵系统和网络之间的组合方式,其中,远程操纵系统和网络并不是必需的。ODBC驱动程序管理器:是应用程序和用户访问一个特定数据库所必需的驱动程序之间的中介。驱动程序:为迁移一个特定的数据库管理系统而提供的ODBCAPI。它建立与服务器的连接,提交SQL查询,然后向应用程序返回结果集或出错信息。3.建立ADOData控件连接有哪几种方式?答建立ADOData控件连接有3种方式,即使用Data 第19章VB与数据库99第1章网站与网页概述Link文件、使用ODBC数据资源名称和使用连接字符串。4.简述将ADOData控件连接到数据源的步骤。答将ADO控件添加到窗体之后,必须建立ADO控件与数据源的连接,才能够实现对数据的各种操作。ADO控件实现数据连接的关键属性是Connectionstring和RecordSource。其中Connectionstring属性指出了ADO控件和数据库连接的连接字符串,通过这个连接字符串可以使ADO控件和OLEDBProvider(提供程序)支持的数据库连接;RecordSource属性指出了可以操作的数据来源,即记录集的内容可以是一张表、一个存储过程或SQL命令生成的结果集等。连接数据源的操作一般是在ADO控件的“属性页”对话框中进行的,其步骤如下:(1)右击ADO控件,在弹出的快捷菜单中选择“ADODC属性”命令,或单击属性窗口中Connectionstring属性右边的“…”按钮,弹出“属性页”对话框。(2)在“属性页”对话框的“通用”选项卡中,单击“生成”按钮,显示“数据链接属性”对话框。在“提供程序”选项卡中,若选择连接到SQLServer2005数据库,应选中MicrosoftOLEDBProviderforSQLServer。单击“下一步”按钮。(3)打开“连接”选项卡,在“选择或输入服务器库名称”下拉列表框中输入服务器名称。再进行安全登录验证,如输入登录名和密码。在服务器上选择一个要连接的数据库名称。(4)单击“测试连接”按钮可测试连接是否成功。当连接成功后,单击“确定”按钮,返回“属性页”对话框,在“使用连接字符串”框中已经生成了一个连接字符串。(5)在“属性页”对话框中选择“记录源”选项卡,在“命令类型”下拉列表框中选择2-adCmdTable,在“表或存储过程”下拉列表框中选择一个数据表名。(6)单击“确定”按钮,结束连接数据源的操作。5.如何用命令为DataGrid控件指定数据源?答DataGrid控件的数据源属性为DataSource属性,可以使用以下语句设置DataGrid控件的数据源:SetDataGrid控件名.DataSource=数据源例如,以下语句表示将DataGrid1控件的DataSource属性设置为Adodc1:SetDataGrid1.DataSource=Adodc16.使用DataCombo控件时,主要设置哪两个属性?答使用DataCombo控件时,主要设置RowSource和ListField两个属性。例如设置DataCombo控件DataCombo1的这两个属性如下:RowSource="Adodc1"ListField="sname"7.图像列表控件ImageList有什么作用?答图像列表控件ImageList是一个存储Image( 第19章VB与数据库99第1章网站与网页概述图像)的数组,可以保存许多图像,以供其他控件使用。因此它必须和其他控件或应用相结合,才能表现出强大的功能。例如,ImageList控件和TreeView、ListView控件相结合,用以美化界面。8.TreeView控件和ListView控件各有什么作用?答TreeView控件用来显示信息的分级视图,如同Windows中显示的文件和目录。ListView控件适合于表示数据的子集(比如数据库的成员)或分布式对象(比如文档模板),其中每个子对象都可以有一个可选的图标与其标签相关联。9.CommonDialog控件有什么作用?答公共对话框(CommonDialog)控件提供了Windows系统的标准对话框,例如,打开文件、保存文件、设置打印机、选择字体和选择颜色。图19.1习题10窗体设计界面10.有一个窗体,用于实现teacher表记录的简单查找,其界面如图19.1所示。其中ADOData控件adodc1采用“ODBC数据资源名称”的方式,设置它们的DSN为schoolDBS,记录源为“SELECT*FROMteacher”,Visible属性为False。“教师信息”框架中有6个标签(Label1数组)和6个文本框(Text1数组,它们的数据源分别对应teacher表的6个列)。另有4个命令按钮(Comm1数组)用于记录导航。编写该窗体上对应的事件过程。解:该窗体上对应的事件过程如下:PrivateSubComm1_Click(IndexAsInteger)SelectCaseIndexCase0IfNotAdodc1.Recordset.BOFThenAdodc1.Recordset.MoveFirstEndIfCase1IfNotAdodc1.Recordset.BOFThenAdodc1.Recordset.MovePreviousEndIfCase2IfNotAdodc1.Recordset.EOFThenAdodc1.Recordset.MoveNextEndIfCase3IfNotAdodc1.Recordset.EOFThenAdodc1.Recordset.MoveLastEndIfEndSelectEndSub11.设计一个窗体,用于实现teacher表按部门查询,其中部门通过数据下拉列表框选择。解:设计一个窗体,如图19.2所示。其中ADOData控件adodc1采用“ODBC数据资源名称”的方式设置它们的DSN为schoolDBS,记录源为SELECTdistinct(depart)FROMteacher,Visible属性为False。ADOData控件adodc2采用“ODBC数据资源名称”的方式设置它们的DSN为schoolDBS,记录源为“SELECT*FROMteacher”,Visible属性为False。“指定部门” 第19章VB与数据库99第1章网站与网页概述框架中包含一个DataCombo1控件(其RowSource属性为adodc1,ListField属性为depart)和一个命令按钮Command1。DataGrid控件DataGrid1的数据源为adodc2,并通过属性页修改其列标题、字体等。图19.2习题11窗体设计界面图19.3习题11窗体执行界面在该窗体上设计如下事件过程:PrivateSubCommand1_Click()Adodc2.RecordSource="SELECT*FROMteacherWHEREdepart=""+_DataCombo1.Text+"""Adodc2.RefreshSetDataGrid1.DataSource=Adodc2DataGrid1.RefreshEndSub运行本窗体,指定“计算机系”的结果如图19.3所示。12.设计一个窗体,用于实现teacher表按部门查询,其中部门通过TreeView控件选择。图19.4习题12窗体设计界面解:设计一个窗体,如图19.4所示。其中ADOData控件adodc1采用“ODBC数据资源名称”的方式设置它们的DSN为schoolDBS,记录源为SELECTdistinct(depart)FROMteacher,Visible属性为False。ADOData控件adodc2采用“ODBC数据资源名称”的方式设置它们的DSN为schoolDBS,记录源为“SELECT*FROMteacher”,Visible属性为False。“指定部门”框架中包含一个TreeView1控件,该控件从adodc1中提取相关部门显示。DataGrid控件DataGrid1的数据源为adodc2,并通过属性页修改其列标题、字体等。在该窗体上设计如下事件过程:PrivateSubForm_Load()TreeView1.LineStyle=1TreeView1.Style=7Adodc1.RefreshAdodc1.Recordset.MoveFirstDoWhileNotAdodc1.Recordset.EOFTreeView1.Nodes.Add,,"K"&_Trim(Adodc1.Recordset.Fields("depart")),_Trim(Adodc1.Recordset.Fields("depart"))Adodc1.Recordset.MoveNextLoop 第19章VB与数据库99第1章网站与网页概述EndSubPrivateSubTreeView1_NodeClick(ByValNodeAsMSComctlLib.Node)Adodc2.RecordSource="SELECT*FROMteacherWHEREdepart=""+Trim(Node.Text)+"""Adodc2.RefreshSetDataGrid1.DataSource=Adodc2DataGrid1.RefreshLabel1.Caption="查询部门:"+Trim(Node.Text)EndSub运行本窗体,指定“计算机系”的结果如图19.5所示。图19.5习题12窗体执行界面13.设计一个窗体,用于实现student表记录的条件查找。图19.6习题13窗体设计界面解:设计一个窗体,如图19.6所示。其中ADOData控件adodc1采用“ODBC数据资源名称”的方式设置它们的DSN为schoolDBS,记录源为“SELECT*FROMstudent”,Visible属性为False。DataGrid控件DataGrid1的数据源为adodc1,并通过属性页修改其列标题、字体等。“设置条件”框架中包含3个文本框(Text1数组,分别对应“学号”、“姓名”和“班号”)、两个单选按钮(opt1标题为“男”,opt2标题为“女”)和两个命令按钮(selcmd1的标题为“确定”,selcmd2的标题为“重置”)。它们的数据源均为空。在该窗体上设计如下事件过程:PrivateSubForm_Load()recs=Adodc1.Recordset.RecordCount"求出当前记录数,注意recs是模块变量Text2.Text=recsIfrecs>0Then"已有学生时Adodc1.Recordset.MoveLast"移到最后一个记录Adodc1.Recordset.MoveFirst"移到开头记录EndIfEndSubPrivateSubForm_Activate()DataGrid1.SetFocus"焦点移向DataGrid1控件EndSubPrivateSubretComm_Click()UnloadMe 第19章VB与数据库99第1章网站与网页概述EndSubPrivateSubselcmd1_Click()"确定condstr="""条件表达式,以下代码根据“设置条件”框架建立condstrIfTrim(Text1(0).Text)<>""ThenIfcondstr=""Thencondstr="snoLIKE""+Trim(Text1(0).Text)+"%""EndIfEndIfIfTrim(Text1(1).Text)<>""ThenIfcondstr=""Thencondstr="snameLIKE""+Trim(Text1(1).Text)+"%""Elsecondstr=condstr+"ANDsnameLIKE""+Trim(Text1(1).Text)+"%""EndIfEndIfIfTrim(Text1(2).Text)<>""ThenIfcondstr=""Thencondstr="sclassLIKE""+Trim(Text1(2).Text)+"%""Elsecondstr=condstr+"ANDsclassLIKE""+Trim(Text1(2).Text)+"%""EndIfEndIfIfOpt1.Value=TrueThenIfcondstr=""Thencondstr="ssex="男""Elsecondstr=condstr+"ANDssex="男""EndIfElseIfOpt2.Value=TrueThenIfcondstr=""Thencondstr="ssex="女""Elsecondstr=condstr+"ANDssex="女""EndIfEndIfIfcondstr<>""Then"根据condstr返回相应的记录集Adodc1.RecordSource="SELECT*FROMstudentWHERE"+condstrAdodc1.RefreshElse"返回ksb表中所有记录Adodc1.RecordSource="SELECT*FROMstudent"Adodc1.RefreshEndIfrecs=Adodc1.Recordset.RecordCountText2.Text=recsIfrecs=0ThenMsgBox"没有任何满足条件的记录",vbOKOnly,"信息提示"EndIfEndSubPrivateSubselcmd2_Click()"重置,将“设置条件”框架中的所有输入清空Text1(0).Text=""Text1(1).Text=""Text1(2).Text=""Opt1.Value=FalseOpt2.Value=FalseEndSub运行本窗体,查找姓“王”学生记录的结果如图19.7所示。 第19章VB与数据库99第1章网站与网页概述图19.7习题13窗体执行界面14.设计一个窗体,用于实现student表的记录操作,包括添加、编辑和删除记录。解:设计一个窗体,如图19.8所示。其中ADOData控件adodc1采用“ODBC数据资源名称”的方式设置它们的DSN为schoolDBS,记录源为“SELECT*FROMstudent”,Visible属性为False。学生记录框架中包含4个文本框(Text1数组,分别对应“学号”、“姓名”、“出生日期”和“班号”)、一个下拉列表框(sexComb),这些控件DataSource属性均为adodc1,DataField属性对应student表中对应的列。另有5个命令按钮(Comm1的标题为“添加”,Comm2的标题为“编辑”,Comm3的标题为“删除”,Comm4的标题为“确定”,Comm5的标题为“取消”)。前3个命令按钮为操作组,后2个命令按钮为确认操作组,同一时刻只显示其中的一组。在该窗体上设计如下事件过程:DimselAsIntegerPrivateSubForm_Load()edit(False)buttons(1)EndSubPrivateSubComm1_Click()"添加操作sel=1Adodc1.Recordset.AddNewedit(True)buttons(2)Text1(0).SetFocusEndSubPrivateSubComm2_Click()"编辑操作sel=2edit(True)buttons(2)Text1(0).SetFocusEndSubPrivateSubComm3_Click()"删除操作sel=3Adodc1.Recordset.Deletebuttons(2)EndSub 第19章VB与数据库99第1章网站与网页概述PrivateSubComm4_Click()"确定操作Adodc1.Recordset.UpdateIfsel=3ThenIfNotAdodc1.Recordset.EOFThenAdodc1.Recordset.MoveNextElseIfNotAdodc1.Recordset.BOFThenAdodc1.Recordset.MoveFirstEndIfEndIfedit(False)buttons(1)EndSubPrivateSubComm5_Click()"取消操作Adodc1.Recordset.CancelUpdateedit(False)buttons(1)EndSubPrivateSubedit(ByValopAsBoolean)Text1(0).Enabled=opText1(1).Enabled=opText1(2).Enabled=opText1(3).Enabled=opsexComb.Enabled=opEndSubPrivateSubbuttons(ByValopAsInteger)Ifop=1ThenComm1.Visible=TrueComm2.Visible=TrueComm3.Visible=TrueComm4.Visible=FalseComm5.Visible=FalseElseComm1.Visible=FalseComm2.Visible=FalseComm3.Visible=FalseComm4.Visible=TrueComm5.Visible=TrueEndIfEndSub运行本窗体,通过adodc1控件的箭头找到一个记录,如图19.9所示,单击“编辑”按钮,可以对记录进行修改;如图19.10所示,单击“确定”按钮表示确认修改,单击“取消”按钮表示放弃本次修改。图19.8习题14窗体设计界面图19.9习题14窗体执行界面(1) 第19章VB与数据库99第1章网站与网页概述图19.10习题14窗体执行界面(2)上机实验题14参考答案建立连接Factory数据库的名称为Factory的系统DSN。设计一个窗体,用于实现worker表的记录查找、添加、修改和删除功能。操作过程1.创建数据源Factory其操作步骤如下:(1)在WindowsXP中选择“开始”|“控制面板”|“管理工具”命令,出现如图19.11所示的“管理工具”窗口。图19.11“管理工具”窗口(2)双击“ODBC数据源”,打开“ODBC数据源管理器”对话框;选择“系统DSN”选项卡,如图19.12所示。(3)单击“添加”按钮,出现如图19.13所示的对话框;选择SQLServer选项,单击“完成”按钮。 第19章VB与数据库99第1章网站与网页概述图19.12“系统DSN”选项卡(4)出现“创建到SQLServer的新数据源”对话框,如图19.14所示;在“名称”文本框中输入Factory,在“服务器”下拉列表框中输入LCB-PC,单击“下一步”按钮。图19.13“创建新数据源”对话框图19.14“创建到SQLServer的新数据源”对话框(5)出现连接SQLServer认证的输入框,如图19.15所示。选择“使用用户输入登录ID和密码的SQLServer验证”单选按钮,在“登录ID”文本框中输入sa,在“密码”文本框中输入123456,单击“下一步”按钮,进入选择数据库的对话框,如图19.16所示。图19.15“连接SQLServer”的身份认证对话框图19.16数据选择对话框(6)选中“更改默认的数据库为”复选框,从其下方的下拉列表框中选择数据库为Factory,不更改其他默认设置。设置完毕后,单击“下一步” 第19章VB与数据库99第1章网站与网页概述按钮,进入设置ODBC对话框,如图19.17所示。保持默认选项,单击“完成”按钮,(7)出现ODBC配置的确认对话框,如图19.18所示。单击“测试数据源”按钮,即弹出一个关于测试结果对话框,如图19.19所示,表示测试成功。单击“确定”按钮。(8)出现如图19.20所示的“系统DSN”选项卡,从中看到了新建的Factory数据源,单击“确定”按钮,完成整个基于ODBC的数据库的连接。图19.17ODBC设置对话框图19.18ODBC配置测试结果提示框图19.19测试结果图19.20“系统DSN”选项卡2.设计窗体用于实现worker表记录操作设计一个窗体,其设计界面如图19.21所示。图19.21上机实验题14窗体设计界面其中ADOData控件adodc1采用“ODBC数据资源名称”的方式设置它们的DSN为Factory,记录源为“SELECT*FROMworker”,Visible属性为False。 第19章VB与数据库99第1章网站与网页概述DataGrid控件DataGrid1的数据源为adodc1,并通过属性页修改其列标题、字体等。“职工记录”框架中包含5个文本框(Text1数组,分别对应“职工号”、“姓名”、“出生日期”、“参加工作”和“部门号”)、两个单选按钮(Opt1标题为“男”,Opt2标题为“女”)和一个复选框Chk1(对应“党员否”)。它们的数据源均为空。中部有5个操作命令按钮,分为两组,第一组为Comm1(标题为“添加”)、Comm2(标题为“编辑”)和Comm3(标题为“删除”);第二组为Comm4(标题为“确定”)和Comm5(标题为“取消”)。这两组命令按钮同一时刻只出现其中一组。下方有4个命令按钮,用于记录导航,从左到右是tp(标题为“|<-”)、prev(标题为“<-”)、nxt(标题为“->”)和bott(标题为“->|”),其功能为分别移到第一个记录、前移一个记录、后移一个记录和移到最后一个记录。在该窗体上设计如下事件过程:PublicselAsInteger"存放前一次的用户操作PrivateSubForm_Load()Adodc1.RefreshIfNotAdodc1.Recordset.EOFAndNotAdodc1.Recordset.BOFThenCalldispEndIfedit(False)"不允许修改屏幕字段数据buttons(1)EndSubPrivateSubDataGrid1_Click()"单击DataGrid1控件时显示当前记录CalldispEndSubPrivateSubbuttons(ByValopAsInteger)"自定义过程:确定显示哪组命令按钮Ifop=1Then"显示第一组命令按钮Comm1.Visible=TrueComm2.Visible=TrueComm3.Visible=TrueComm4.Visible=FalseComm5.Visible=Falsetp.Enabled=Trueprev.Enabled=Truenxt.Enabled=Truebott.Enabled=TrueElse"显示第二组命令按钮Comm1.Visible=FalseComm2.Visible=FalseComm3.Visible=FalseComm4.Visible=TrueComm5.Visible=Truetp.Enabled=Falseprev.Enabled=Falsenxt.Enabled=Falsebott.Enabled=FalseEndIfEndSubPrivateSubedit(ByValopAsBoolean)"自定义过程:确定是否可以编辑屏幕字段Text1(0).Enabled=opText1(1).Enabled=op 第19章VB与数据库99第1章网站与网页概述Text1(2).Enabled=opText1(3).Enabled=opText1(4).Enabled=opOpt1.Enabled=opOpt2.Enabled=opChk1.Enabled=opEndSubPrivateSubComm1_Click()"添加操作sel=1Text1(0).Text=""Text1(1).Text=""Text1(2).Text=""Text1(3).Text=""Text1(4).Text=""Opt1.Value=FalseOpt2.Value=FalseChk1.Value=0edit(True)Text1(0).SetFocusbuttons(2)EndSubPrivateSubComm2_Click()"编辑操作sel=2edit(True)Text1(0).SetFocusbuttons(2)EndSubPrivateSubComm3_Click()"删除操作sel=3buttons(2)EndSubPrivateSubComm4_Click()"确定操作SelectCaseselCase1"添加确定Adodc1.Recordset.AddNewCallsetvalueAdodc1.Recordset.Updateedit(False)buttons(1)Case2"修改确定CallsetvalueAdodc1.Recordset.Updateedit(False)buttons(1)Case3"删除确定Adodc1.Recordset.DeleteAdodc1.Recordset.UpdateIfNotAdodc1.Recordset.EOFThenAdodc1.Recordset.MoveNextCalldispElseIfNotAdodc1.Recordset.BOFThenAdodc1.Recordset.MoveFirstCalldispEndIfbuttons(1)EndSelect 第19章VB与数据库99第1章网站与网页概述EndSubPrivateSubComm5_Click()"取消操作buttons(1)CalldispEndSubPrivateSubText1_KeyPress(IndexAsInteger,KeyAsciiAsInteger)IfKeyAscii=13Theni=(Index+1)Mod5Text1(i).SetFocusEndIfEndSubPrivateSubdisp()"用于屏幕显示一个记录IfNotAdodc1.Recordset.EOFAndNotAdodc1.Recordset.BOFThenText1(0)=Adodc1.Recordset.Fields("职工号")&""Text1(1)=Adodc1.Recordset.Fields("姓名")&""Text1(2)=Adodc1.Recordset.Fields("出生日期")&""Text1(3)=Adodc1.Recordset.Fields("参加工作")&""Text1(4)=Adodc1.Recordset.Fields("部门号")&""IfAdodc1.Recordset.Fields("性别")="男"ThenOpt1.Value=TrueElseIfAdodc1.Recordset.Fields("性别")="女"ThenOpt2.Value=TrueEndIfIfAdodc1.Recordset.Fields("党员否")="是"ThenChk1.Value=1ElseChk1.Value=0EndIfEndIfEndSubPrivateSubsetvalue()"用于向记录集中输入数据Adodc1.Recordset.Fields("职工号")=Trim(Text1(0).Text)Adodc1.Recordset.Fields("姓名")=Trim(Text1(1).Text)IfTrim(Text1(2).Text)<>""ThenAdodc1.Recordset.Fields("出生日期")=_Format(Trim(Text1(2).Text),"yyyy-mm-dd")EndIfIfTrim(Text1(3).Text)<>""ThenAdodc1.Recordset.Fields("参加工作")=_Format(Trim(Text1(3).Text),"yyyy-mm-dd")EndIfAdodc1.Recordset.Fields("部门号")=Val(Text1(4).Text)IfOpt1.Value=TrueThenAdodc1.Recordset.Fields("性别")="男"ElseAdodc1.Recordset.Fields("性别")="女"EndIfIfChk1.Value=1ThenAdodc1.Recordset.Fields("党员否")="是"ElseAdodc1.Recordset.Fields("党员否")="否"EndIfEndSubPrivateSubtp_Click()IfNotAdodc1.Recordset.BOFThen 第19章VB与数据库99第1章网站与网页概述Adodc1.Recordset.MoveFirstCalldispEndIfEndSubPrivateSubnxt_Click()IfNotAdodc1.Recordset.EOFThenAdodc1.Recordset.MoveNextCalldispEndIfEndSubPrivateSubprev_Click()IfNotAdodc1.Recordset.BOFThenAdodc1.Recordset.MovePreviousCalldispEndIfEndSubPrivateSubbott_Click()IfNotAdodc1.Recordset.EOFThenAdodc1.Recordset.MoveLastCalldispEndIfEndSub运行本窗体,在初始界面中单击“添加”按钮,在“职工记录”框架中输入一个职工记录,如图19.22所示,单击“确定”按钮;如图19.23所示,可以看到新职工记录插入到worker表中了。单击“编辑”按钮,修改其出生日期,如图19.24所示;单击“取消”按钮,如图19.25所示,可以看到由于取消编辑,该职工记录没有发生改变。图19.22添加记录图19.23添加记录后的结果 第19章VB与数据库99第1章网站与网页概述图19.24编辑记录图19.25取消编辑操作 第20章使用ADO操作SQLServer数据库113第1章网站与网页概述第20章CHAPTER20使用ADO操作SQLServer数据库练习题20参考答案1.简述建立ADO记录集对象的两种方法。答建立ADO记录集对象的两种方法如下。(1)通过数据源名称(DSN)建立连接在创建系统DSN之后,可以使用ADO的Connection对象通过DSN对数据库进行访问,访问之前先建立连接。一个DSN连接通常需要的参数有:DSN数据源名称、用户名和口令。其使用格式如下:ConnectionString="DSN=数据源名称;UID=用户名;PWD=口令"其中,DSN指出数据源名称;UID指出登录数据库的用户名,也可以使用UserID指出用户名;PWD指出登录数据库的口令,也可以使用Password指出口令。(2)直接使用数据库名称建立连接直接使用数据库的文件名(比如Access、Paradox或FoxPro的数据库文件)或者SQLServer的数据库,也可建立数据库的连接。其使用格式如下:ConnectionString="Provider=提供程序名称;DSN=数据源名称;DRIVER=驱动程序名称;SERVER=服务器名称;DATABASE=数据库名称;UID=用户名;PWD=口令"其中,Provider指出数据提供程序,默认为MSDASQL,为微软OLEDB,通常省略;DSN指出要打开的数据库对应的ODBC系统数据源,是可选参数;DRIVER指出要打开的数据库所用的驱动程序名称,例如,Access对应的驱动程序为MicrosoftAccessDriver(*.mdb),SQLServer对应的驱动程序为SQLServer,它是可选参数。2.如何用记录集对象rst修改、插入和删除记录?答修改rst数据的方法是先修改该记录集中当前记录各字段值,然后使用rst.Update命令将修改操作保存到rst中。 第20章使用ADO操作SQLServer数据库113第1章网站与网页概述插入rst数据的方法是先使用rst.AddNew命令插入一个空记录,再修改该记录的各字段值,最后使用rst.Update命令将该记录保存到rst中。删除rst数据的方法是先使用rst.Delete命令删除当前记录,然后使用rst.Update命令将删除操作保存到rst中。3.设计一个窗体,浏览student表中的记录。要求采用ADO编程。解:设计窗体的界面如图20.1所示。“学生记录”框架中包含4个文本框(Text1数组)和两个单选按钮(Option1的标题为“男”,Option2的标题为“女”)。它们的数据源均为空。下方有4个命令按钮,从左到右是Command1(标题为“|<-”)、Command2(标题为“<-”)、Command3(标题为“->”)和Command4(标题为“->|”),其功能分别为移到第一个记录、前移一个记录、后移一个记录和移到最后一个记录。在该窗体上设计如下事件过程:PublicconnAsADODB.ConnectionPublicrstAsADODB.RecordsetPrivateSubForm_Load()Setconn=NewADODB.ConnectionSetrst=NewADODB.Recordsetconn.ConnectionString="Provider=SQLOLEDB;DRIVER={SQLServer};"+_"SERVER=LCB-PC;UID=sa;PWD=123456;DATABASE=school"conn.CursorLocation=adUseServerconn.Openrst.LockType=adLockOptimisticrst.CursorType=adOpenDynamicrst.ActiveConnection=connrst.Open"SELECT*FROMstudent"IfNotrst.EOFAndNotrst.BOFThenrst.MoveFirstCalldispElseMsgBox"没有任何记录",vbOKOnly,"信息提示"UnloadMeEndIfEndSubPrivateSubCommand1_Click()"显示第一个记录IfNotrst.BOFThenrst.MoveFirstCalldispEndIfEndSubPrivateSubCommand2_Click()"显示上一个记录rst.MovePreviousIfNotrst.BOFThenCalldispElserst.MoveFirstEndIfEndSubPrivateSubCommand3_Click()"显示下一个记录rst.MoveNextIfNotrst.EOFThen 第20章使用ADO操作SQLServer数据库113第1章网站与网页概述CalldispElserst.MoveLastEndIfEndSubPrivateSubCommand4_Click()"显示最后一个记录IfNotrst.EOFThenrst.MoveLastCalldispEndIfEndSubPrivateSubForm_Unload(CancelAsInteger)Setconn=NothingSetrst=NothingEndSubPrivateSubdisp()"自定义过程Text1(0).Text=rst.Fields(0)Text1(1).Text=rst.Fields(1)Ifrst.Fields(2)="男"ThenOption1.Value=TrueElseOption2.Value=TrueEndIfText1(2).Text=rst.Fields(3)Text1(3).Text=rst.Fields(4)EndSub本窗体的执行界面如图20.2所示。图20.1习题3设计界面图20.2习题3执行界面4.设计一个窗体,实现student表记录的复杂查询,并用列表框显示查询结果。要求采用ADO编程。解:设计窗体的界面如图20.3所示。“设置条件”框架中包含3个文本框(Text1数组)和两个单选按钮(Opt1的标题为“男”,Opt2的标题为“女”),另有两个命令按钮(selcmd1的标题为“确定”,selcmd2的标题为“重置”)。上方有一个列表框List1,其下方有一个文本框Text2(Enabled属性设为False)和一个标签。在该窗体上设计如下事件过程:PublicrecsAsInteger 第20章使用ADO操作SQLServer数据库113第1章网站与网页概述PublicconnAsADODB.ConnectionPublicrstAsADODB.RecordsetPrivateSubForm_Load()Setconn=NewADODB.ConnectionSetrst=NewADODB.Recordsetconn.ConnectionString="Provider=SQLOLEDB;DRIVER={SQLServer};"+_"SERVER=LCB-PC;UID=sa;PWD=123456;DATABASE=school"conn.CursorLocation=adUseServerconn.Openrst.LockType=adLockOptimisticrst.CursorType=adOpenDynamicrst.ActiveConnection=connEndSubPrivateSubselcmd1_Click()"确定condstr="""条件表达式,以下代码根据“设置条件”框架建立condstrIfTrim(Text1(0).Text)<>""ThenIfcondstr=""Thencondstr="snoLIKE""+Trim(Text1(0).Text)+"%""EndIfEndIfIfTrim(Text1(1).Text)<>""ThenIfcondstr=""Thencondstr="snameLIKE""+Trim(Text1(1).Text)+"%""Elsecondstr=condstr+"ANDsnameLIKE""+Trim(Text1(1).Text)+"%""EndIfEndIfIfTrim(Text1(2).Text)<>""ThenIfcondstr=""Thencondstr="sclassLIKE""+Trim(Text1(2).Text)+"%""Elsecondstr=condstr+"ANDsclassLIKE""+Trim(Text1(2).Text)+"%""EndIfEndIfIfOpt1.Value=TrueThenIfcondstr=""Thencondstr="ssex="男""Elsecondstr=condstr+"ANDssex="男""EndIfElseIfOpt2.Value=TrueThenIfcondstr=""Thencondstr="ssex="女""Elsecondstr=condstr+"ANDssex="女""EndIfEndIfIfcondstr<>""Then"有条件,根据condstr返回相应的记录集OnErrorResumeNextrst.Open"SELECT*FROMstudentWHERE"+condstrElse"无条件,返回student表中所有记录rst.Open"SELECT*FROMstudent"EndIfCalldispText2.Text=recsIfrecs=0ThenMsgBox"没有任何满足条件的记录",vbOKOnly,"信息提示"EndIf 第20章使用ADO操作SQLServer数据库113第1章网站与网页概述rst.CloseEndSubPrivateSubselcmd2_Click()"重置,将“设置条件”框架中的所有输入清空Text1(0).Text=""Text1(1).Text=""Text1(2).Text=""Opt1.Value=FalseOpt2.Value=FalseEndSubPrivateSubdisp()List1.Clearrecs=0List1.AddItem"学号 姓名 性别出生日期 班号"List1.AddItem"====================================="DoWhileNotrst.EOFList1.AddItemrst.Fields("sno")+""+rst.Fields("sname")+_""+rst.Fields("ssex")+""+Format(rst.Fields("sbirthday"),_"yyyy-mm-dd")+""+rst.Fields("sclass")rst.MoveNextrecs=recs+1LoopEndSub运行本窗体,查询95031班学生的界面如图20.4所示。图20.3习题4设计界面图20.4习题4执行界面5.设计一个窗体,实现student表记录的复杂查询,并用DataGrid1控件显示查询结果。要求采用ADO编程。解:设计窗体的界面如图20.5所示。“设置条件”框架中包含3个文本框(Text1数组)和两个单选按钮(Opt1的标题为“男”,Opt2的标题为“女”),另有两个命令按钮(selcmd1的标题为“确定”,selcmd2的标题为“重置”)。上方有一个DataGrid1控件,其下方有一个文本框Text2(Enabled属性设为False)和一个标签。在该窗体上设计如下事件过程:PublicconnAsADODB.ConnectionPublicrstAsADODB.Recordset 第20章使用ADO操作SQLServer数据库113第1章网站与网页概述PrivateSubForm_Load()Setconn=NewADODB.ConnectionSetrst=NewADODB.Recordsetconn.ConnectionString="DSN=schoolDBS;UID=sa;PWD=123456"conn.CursorLocation=adUseClientconn.Openrst.LockType=adLockOptimisticrst.CursorType=adOpenStaticrst.ActiveConnection=connrst.Open"SELECT*FROMstudent"SetDataGrid1.DataSource=rstDataGrid1.Columns(0).Caption="学号"DataGrid1.Columns(1).Caption="姓名"DataGrid1.Columns(2).Caption="性别"DataGrid1.Columns(3).Caption="出生日期"DataGrid1.Columns(4).Caption="班号"DataGrid1.Columns(0).Width=600DataGrid1.Columns(1).Width=900DataGrid1.Columns(2).Width=550DataGrid1.Columns(3).Width=1000DataGrid1.Columns(4).Width=700EndSubPrivateSubselcmd1_Click()"确定condstr="""条件表达式,以下代码根据“设置条件”框架建立condstrIfTrim(Text1(0).Text)<>""ThenIfcondstr=""Thencondstr="snoLIKE""+Trim(Text1(0).Text)+"%""EndIfEndIfIfTrim(Text1(1).Text)<>""ThenIfcondstr=""Thencondstr="snameLIKE""+Trim(Text1(1).Text)+"%""Elsecondstr=condstr+"ANDsnameLIKE""+Trim(Text1(1).Text)+"%""EndIfEndIfIfTrim(Text1(2).Text)<>""ThenIfcondstr=""Thencondstr="sclassLIKE""+Trim(Text1(2).Text)+"%""Elsecondstr=condstr+"ANDsclassLIKE""+Trim(Text1(2).Text)+"%""EndIfEndIfIfOpt1.Value=TrueThenIfcondstr=""Thencondstr="ssex="男""Elsecondstr=condstr+"ANDssex="男""EndIfElseIfOpt2.Value=TrueThenIfcondstr=""Thencondstr="ssex="女""Elsecondstr=condstr+"ANDssex="女""EndIfEndIfrst.Filter=condstrrecs=rst.RecordCountText2.Text=recs 第20章使用ADO操作SQLServer数据库113第1章网站与网页概述EndSubPrivateSubselcmd2_Click()"重置,将“设置条件”框架中的所有输入清空Text1(0).Text=""Text1(1).Text=""Text1(2).Text=""Opt1.Value=FalseOpt2.Value=FalseEndSub运行本窗体,查询所有男学生的界面如图20.6所示。图20.5习题5设计界面图20.6习题5执行界面6.在SQLServer2005中设计一个存储过程maxfs,其功能是求最高分学生的姓名、课程和分数。设计一个窗体,调用该存储过程显示结果。解:设计存储过程如下:CREATEPROCEDUREmaxfs(@s_namechar(10)OUTPUT,/*返回参数*/@c_namechar(10)OUTPUT,/*返回参数*/@sc_degreeintOUTPUT/*返回参数*/)ASBEGINSELECT@s_name=s.sname,@c_name=c.cname,@sc_degree=sc.degreeFROMstudents,coursec,scorescWHEREs.sno=sc.snoANDc.cno=sc.cnoANDsc.degree=(SELECTMAX(degree)FROMscore)ENDGO设计一个窗体的界面如图20.7所示。“最高分情况”框架中包含3个文本框(Text1、Text2和Text3)和3个标签。另有一个命令按钮。在窗体上设计如下事件过程:PrivateSubCommand1_Click()DimconnAsADODB.ConnectionDimcmdAsADODB.CommandDimpar1AsADODB.ParameterDimpar2AsADODB.ParameterDimpar3AsADODB.Parameter"声明并初始化一个ADO的Connection对象Setconn=NewADODB.Connection"使用Connection对象的ConnectionString属性,直接指定连接的数据库conn.ConnectionString="Provider=SQLOLEDB;DRIVER={SQLServer};"+_ 第20章使用ADO操作SQLServer数据库113第1章网站与网页概述"SERVER=LCB-PC;UID=sa;PWD=123456;DATABASE=school""使用Connection对象的Open方法连接数据库conn.OpenSetcmd=NewADODB.Command"指定cmd的当前连接为conncmd.ActiveConnection=conn"设置要执行的是存储过程averagecmd.CommandType=adCmdStoredProccmd.CommandText="maxfs""maxfs是SQLServer存储过程"设置第一个参数,并将其添加到Parameters集合中Setpar1=NewADODB.Parameterpar1.Direction=adParamOutputpar1.Type=adCharpar1.Size=10cmd.Parameters.Appendpar1"设置第二个参数,并将其添加到Parameters集合中Setpar2=NewADODB.Parameterpar2.Direction=adParamOutputpar2.Type=adCharpar2.Size=10cmd.Parameters.Appendpar2"设置第三个参数,并将其添加到Parameters集合中Setpar3=NewADODB.Parameterpar3.Direction=adParamOutputpar3.Type=adIntegercmd.Parameters.Appendpar3"执行命令cmd.Execute"将执行后的返回参数输出到窗体上Text1.Text=par1.ValueText2.Text=par2.ValueText3.Text=par3.Valueconn.CloseEndSub运行本窗体,单击命令按钮,结果如图20.8所示。图20.7习题6设计界面图20.8习题6执行界面上机实验题15参考答案设计一个与第19章上机实验题功能相似的窗体,要求采用ADO编程。 第20章使用ADO操作SQLServer数据库113第1章网站与网页概述操作过程设计一个窗体,其设计界面如图20.9所示。图20.9上机实验题15设计界面其中有一个DataGrid控件DataGrid1,只需通过其属性页修改HeadFont字体大小,其余均不作修改。“职工记录”框架中包含5个文本框(Text1数组,分别对应“职工号”、“姓名”、“出生日期”、“参加工作”和“部门号”)、两个单选按钮(Opt1标题为“男”,Opt2标题为“女”)和一个复选框Chk1(对应“党员否”)。它们的数据源均为空。数据导航框架中有4个命令按钮,从左到右是tp(标题为“|<-”)、prev(标题为“<-”)、nxt(标题为“->”)和bott(标题为“->|”),其功能分别为移到第一个记录、前移一个记录、后移一个记录和移到最后一个记录。数据操作框架中部有5个操作命令按钮,分为两组,第一组为Comm1(标题为“添加”)、Comm2(标题为“编辑”)和Comm3(标题为“删除”);第二组为Comm4(标题为“确定”)和Comm5(标题为“取消”)。这两组命令按钮同一时刻只出现其中一组。在该窗体上设计如下事件过程:PublicselAsInteger"存放前一次的用户操作PublicconnAsADODB.ConnectionPublicrstAsADODB.RecordsetPrivateSubForm_Load()OnErrorResumeNextSetconn=NewADODB.ConnectionSetrst=NewADODB.Recordsetconn.ConnectionString="DSN=Factory;UID=sa;PWD=123456" "连接到名称为Factory的系统DSN,它在第19章上机实验题中创建conn.CursorLocation=adUseClientconn.Openrst.LockType=adLockOptimisticrst.CursorType=adOpenDynamicrst.ActiveConnection=connrst.Open"SELECT*FROMworker"SetDataGrid1.DataSource=rst"以下通过代码设置DataGrid1的各列属性DataGrid1.Columns(0).Visible=TrueDataGrid1.Columns(0).Width=700DataGrid1.Columns(0).Caption="职工号"DataGrid1.Columns(0).DataField=rst.Fields("职工号").Name 第20章使用ADO操作SQLServer数据库113第1章网站与网页概述DataGrid1.Columns(0).Alignment=dbgGeneralDataGrid1.Columns(1).Visible=TrueDataGrid1.Columns(1).Width=800DataGrid1.Columns(1).Caption="姓名"DataGrid1.Columns(1).DataField=rst.Fields("姓名").NameDataGrid1.Columns(1).Alignment=dbgGeneralDataGrid1.Columns(2).Visible=TrueDataGrid1.Columns(2).Width=500DataGrid1.Columns(2).Caption="性别"DataGrid1.Columns(2).DataField=rst.Fields("性别").NameDataGrid1.Columns(2).Alignment=dbgGeneralDataGrid1.Columns(3).Visible=TrueDataGrid1.Columns(3).Width=1000DataGrid1.Columns(3).Caption="出生日期"DataGrid1.Columns(3).DataField=rst.Fields("出生日期").NameDataGrid1.Columns(3).Alignment=dbgGeneralDataGrid1.Columns(4).Visible=TrueDataGrid1.Columns(4).Width=700DataGrid1.Columns(4).Caption="党员否"DataGrid1.Columns(4).DataField=rst.Fields("党员否").NameDataGrid1.Columns(4).Alignment=dbgGeneralDataGrid1.Columns(5).Visible=TrueDataGrid1.Columns(5).Width=1000DataGrid1.Columns(5).Caption="参加工作"DataGrid1.Columns(5).DataField=rst.Fields("参加工作").NameDataGrid1.Columns(5).Alignment=dbgGeneralDataGrid1.Columns(6).Visible=TrueDataGrid1.Columns(6).Width=800DataGrid1.Columns(6).Caption="部门号"DataGrid1.Columns(6).DataField=rst.Fields("部门号").NameDataGrid1.Columns(6).Alignment=dbgLeftIfNotrst.EOFAndNotrst.BOFThenCalldispEndIfedit(False)"不允许修改屏幕字段数据buttons(1)EndSubPrivateSubDataGrid1_Click()"单击DataGrid1控件时显示当前记录CalldispEndSubPrivateSubbuttons(ByValopAsInteger)"自定义过程:确定显示哪组命令按钮Ifop=1Then"显示第一组命令按钮Comm1.Visible=TrueComm2.Visible=TrueComm3.Visible=TrueComm4.Visible=FalseComm5.Visible=Falsetp.Enabled=Trueprev.Enabled=Truenxt.Enabled=Truebott.Enabled=TrueElse"显示第二组命令按钮Comm1.Visible=FalseComm2.Visible=FalseComm3.Visible=FalseComm4.Visible=TrueComm5.Visible=True 第20章使用ADO操作SQLServer数据库113第1章网站与网页概述tp.Enabled=Falseprev.Enabled=Falsenxt.Enabled=Falsebott.Enabled=FalseEndIfEndSubPrivateSubedit(ByValopAsBoolean)"自定义过程:确定是否可以编辑屏幕字段Text1(0).Enabled=opText1(1).Enabled=opText1(2).Enabled=opText1(3).Enabled=opText1(4).Enabled=opOpt1.Enabled=opOpt2.Enabled=opChk1.Enabled=opEndSubPrivateSubComm1_Click()"添加操作sel=1Text1(0).Text=""Text1(1).Text=""Text1(2).Text=""Text1(3).Text=""Text1(4).Text=""Opt1.Value=FalseOpt2.Value=FalseChk1.Value=0edit(True)Text1(0).SetFocusbuttons(2)EndSubPrivateSubComm2_Click()"编辑操作sel=2edit(True)Text1(0).SetFocusbuttons(2)EndSubPrivateSubComm3_Click()"删除操作sel=3buttons(2)EndSubPrivateSubComm4_Click()"确定操作SelectCaseselCase1"添加确定rst.AddNewCallsetvaluerst.Updateedit(False)buttons(1)Case2"修改确定Callsetvaluerst.Updateedit(False)buttons(1)Case3"删除确定rst.Delete 第20章使用ADO操作SQLServer数据库113第1章网站与网页概述rst.UpdateIfrst.EOFAndrst.BOFThen"所有记录均删除了Text1(0).Text=""Text1(1).Text=""Text1(2).Text=""Text1(3).Text=""Text1(4).Text=""Opt1.Value=FalseOpt2.Value=FalseChk1.Value=0Elserst.MoveNextIfrst.EOFThenrst.MoveFirstEndIfCalldispEndIfbuttons(1)EndSelectEndSubPrivateSubComm5_Click()"取消操作buttons(1)edit(False)CalldispEndSubPrivateSubText1_KeyPress(IndexAsInteger,KeyAsciiAsInteger)IfKeyAscii=13Theni=(Index+1)Mod5Text1(i).SetFocusEndIfEndSubPrivateSubdisp()"用于屏幕显示一个记录IfNotrst.EOFAndNotrst.BOFThenText1(0)=rst.Fields("职工号")&""Text1(1)=rst.Fields("姓名")&""Text1(2)=rst.Fields("出生日期")&""Text1(3)=rst.Fields("参加工作")&""Text1(4)=rst.Fields("部门号")&""Ifrst.Fields("性别")="男"ThenOpt1.Value=TrueElseIfrst.Fields("性别")="女"ThenOpt2.Value=TrueEndIfIfrst.Fields("党员否")="是"ThenChk1.Value=1ElseChk1.Value=0EndIfEndIfEndSubPrivateSubsetvalue()"用于向记录集中输入数据rst.Fields("职工号")=Trim(Text1(0).Text)rst.Fields("姓名")=Trim(Text1(1).Text)IfTrim(Text1(2).Text)<>""Thenrst.Fields("出生日期")=Format(Trim(Text1(2).Text),"yyyy-mm-dd")EndIf 第20章使用ADO操作SQLServer数据库113第1章网站与网页概述IfTrim(Text1(3).Text)<>""Thenrst.Fields("参加工作")=Format(Trim(Text1(3).Text),"yyyy-mm-dd")EndIfrst.Fields("部门号")=Val(Text1(4).Text)IfOpt1.Value=TrueThenrst.Fields("性别")="男"ElseIfOpt2.Value=TrueThenrst.Fields("性别")="女"Elserst.Fields("性别")=""EndIfIfChk1.Value=1Thenrst.Fields("党员否")="是"Elserst.Fields("党员否")="否"EndIfEndSubPrivateSubtp_Click()IfNotrst.BOFThenrst.MoveFirstCalldispEndIfEndSubPrivateSubnxt_Click()IfNotrst.EOFThenrst.MoveNextCalldispEndIfEndSubPrivateSubprev_Click()IfNotrst.BOFThenrst.MovePreviousCalldispEndIfEndSubPrivateSubbott_Click()IfNotrst.EOFThenrst.MoveLastCalldispEndIfEndSub其执行界面如图20.10所示,所有操作与上机实验题19的操作完全相同。 第20章使用ADO操作SQLServer数据库113第1章网站与网页概述图20.10上机实验题15执行界面 141附录数据库应用系统开发综合实习题第1章网站与网页概述参考文献[1]赵松涛.SQLServer2005系统管理实录.北京:电子工业出版社,2006[2]明日科技.SQLServer2005技术大全.北京:电子工业出版社,2007[3]宋晓峰.SQLServer2005基础培训教程.北京:人民邮电出版社,2007[4]董福贵等.SQLServer2005数据库简明教程.北京:电子工业出版社,2006[5]孙明丽等.SQLServer2005完全手册.北京:人民邮电出版社,2006[6]李昭原主编.数据库原理与应用.北京:科学出版社,1999[7]赵杰,杨丽丽,陈雷.数据库原理与应用.北京:人民邮电出版社,2002[8]刘耀儒.SQLServer2005教程.北京:北京科海电子出版社,2001[9]何文华,李萍.SQLServer2000应用开发教程.北京:电子工业出版社,2004[10]孙越.VisualBasic数据库开发自学教程.北京:人民邮电出版社,2002[11]谭小丹,刘国庆,李光明.VisualBasic6.0数据库编程思想与实践.北京:冶金工业出版社,2002[12]张宏林,孔艳,王哲.VisualBasic6.0开发数据库.北京:人民邮电出版社,1999[13]李春葆.VisualBasic程序设计.北京:清华大学出版社,2005[14]刘圣才,李春葆.VisualBasic6程序设计导学.北京:清华大学出版社,2002[15]李春葆,张植民.VisualBasic数据库系统设计与开发.北京:清华大学出版社,2003[16]李春葆,曾慧.数据库原理习题与解析.第2版.北京:清华大学出版社,2004[17]李春葆,曾慧.SQLServer2000应用系统开发教程.北京:清华大学出版社,2005 141附录数据库应用系统开发综合实习题第1章网站与网页概述附录数据库应用系统开发综合实习题采用VB6.0+SQLServer2005设计一个名片管理系统。功能:(1)客户基本信息录入、修改和删除(2)客户信息的任意条件查找(3)设置系统用户和系统初始化要求:(1)数据库设计采用规范化方法(2)系统设计界面友好,人机交互性能好系统设计1.数据库设计本系统主要是对名片的客户信息进行管理,客户信息包括姓名、性别、出生日期、单位、职务、单位电话、手机号、工作地址、客户类型、住宅电话、家庭地址、个人爱好、背景信息和编号等。为此设计一个客户表mpb,用于存放客户的所有信息,其中客户编号是由系统自动生成的。由于客户职务和客户类型是大量重复的数据,为了共享,设计一个客户类型表lxb和一个客户职务表zwb。这两个表均只有一个字段fn,可以包含若干个记录,这些记录由用户自己输入设定,在设定好后,输入客户信息时可以从这些数据项中直接选择某一客户职务或客户类型,不仅可避免重复汉字输入,而且便于客户按职务和类型进行汇总、查询和分析等。另外,设计一个用户表oper,用于存放使用本系统的用户,每个用户信息有用户名(最多10位)、密码(最多10位数字字符)和级别(只分“一般操作员”和“系统管理员”两类)。设计一个数据库MPK,用于存放这些表,其中mpb表的结构如图1所示,lxb表的结构如图2所示,zwb表的结构如图3所示,oper表的结构如图4所示。图1mpb表结构图2lxb表结构 141附录数据库应用系统开发综合实习题第1章网站与网页概述图3zwb表结构图4oper表结构2.系统结构本系统对应的工程为MP.vbp,它包含的所有文件如图5所示,该系统的结构如图6所示。设置本工程的启动对象为subMain主过程,由该过程调用pass窗体。pass窗体通过用户输入的用户名/密码,判断是否为合法用户。如果是合法用户,则调用menu窗体。menu窗体中包含4个命令按钮,这4个按钮起到菜单的作用。这些功能如下:编辑名片记录查询名片记录设置系统用户系统初始化单击这些命令按钮将执行相对应的功能。图5MP.vbp工程图6系统结构图3.系统设计本节介绍图5中各组成部分的实现方法。对于窗体,给出执行功能、设计界面、主要对象的属性和方法。本工程中引用了一些ActiveX控件等,在设计时选择“工程”|“引用”命令,从“可用的引用”列表中选中如下项:RVisualBasicForApplicationsRVisualBasicruntimeobjectsandprocedures 141附录数据库应用系统开发综合实习题第1章网站与网页概述RVisualBasicobjectsandproceduresROLEAutomationRMicrosoftActiveXDataObject2.6Library选择“工程”|“部件”命令,从控件列表中选中如下项:RMicrosoftADODataControl6.0(OLEDB)RMicrosoftDataGridControl6.0(OLEDB)RMicrosoftDataListControl6.0(OLEDB)RMicrosoftWindowsCommonControls6.0(SP4)(1)Module1.bas公共模块本工程中包含一个公共模块即Module1.bas模块,其中包含一些全局变量和过程(被本工程中的一些窗体所调用)。代码如下:PublicuserlevelAsString"保存用户级别PublicflagAsInteger"用做记录操作标记Publicflag1AsInteger"用做记录操作标记PublictnaAsString"保存表名:用于调用edrec1窗体PubliccapAsString"保存标题名:用于调用edrec1窗体PublicrecsAsInteger"保存记录集中记录个数PublicSubmain()"主过程pass.ShowvbmodelEndSubPublicFunctionexesql(ByValsqlAsString)AsADODB.Recordset"自定义过程,用于执行SQL语句并返回记录集sql=Trim$(sql)Setconn=NewADODB.ConnectionSetrst=NewADODB.Recordsetconn.ConnectionString="DSN=MP;UID=sa;PWD=123456;"conn.OpenSetrst.ActiveConnection=connrst.LockType=adLockOptimisticrst.CursorType=adOpenKeysetrst.OpensqlSetexesql=rstSetrst=NothingSetconn=NothingEndFunctionPublicSubdeldata(ByValtnAsString)"删除指定表中所有记录,对于oper表添加一个系统用户DimsqlAsStringsql="DELETE"&Trim$(tn)Setconn=NewADODB.Connectionconn.ConnectionString="DSN=MP;UID=sa;PWD=123456;"conn.Openconn.ExecutesqlIfTrim(tn)="oper"Thensql="insertopervalues("1234","1234","系统管理员")"conn.ExecutesqlEndIfconn.CloseEndSub 141附录数据库应用系统开发综合实习题第1章网站与网页概述PublicSubendata(KeyascAsInteger)IfKeyasc=13ThenSendKeys"{TAB}""将Enter键转换成Tab键EndIfEndSub(2)pass窗体本窗体用于接收用户的用户名/密码输入,判断是否为合法。如果是合法用户,释放该窗体并启动menu窗体;否则释放该窗体不启动menu窗体。对于合法用户,用全局变量userlevel保存当前用户的级别。该窗体的设计界面如图7所示。pass窗体中包含的主要对象及其属性如表1所示(Text1为文本框数组,用户名输入对应Text1(0),口令输入对应Text1(1))。图7pass窗体设计界面表1pass窗体中包含的主要对象及其属性对象名属性属性值passCaption"名片管理系统"MaxButton0"FalseMinButton0"FalseStartUpPosition2"屏幕中心Command1Caption"确定"Command2Caption"取消"Text1(1)PasswordChar"*"在本窗体上设计如下事件过程:PublicnAsIntegerPrivateSubCommand1_Click()DimmrcAsADODB.Recordsettxtsql="select*fromoperwhere用户名=""&_Trim$(Text1(0).Text)&"""&"And口令=""&Trim$(Text1(1).Text)+""" 141附录数据库应用系统开发综合实习题第1章网站与网页概述Setmrc=exesql(txtsql)Ifmrc.RecordCount=0Then"未找到用户记录n=n+1Ifn<3ThenMsgBox"没有这个用户,继续登录",vbOKOnly+vbExclamation,"信息提示"Text1(0).Text=""Text1(1).Text=""Text1(0).SetFocusElseMsgBox"已登录失败三次,退出系统",vbOKOnly+vbExclamation,"信息提示"mrc.CloseUnloadMeEndIfElse"找到合法用户记录userlevel=Trim(mrc.Fields("级别"))mrc.CloseUnloadMemenu.ShowvbModal"调用menu窗体EndIfEndSubPrivateSubCommand2_Click()UnloadMeEndSubPrivateSubForm_Load()n=0"n保存登录的次数EndSubPrivateSubText1_KeyPress(IndexAsInteger,KeyAsciiAsInteger)Callendata(KeyAscii)EndSub(3)menu窗体该窗体起到菜单的作用。可以单击其中的命令按钮执行相应的功能。其设计界面如图8所示,其中包含的主要对象及其属性如表2所示。图8menu窗体设计界面 141附录数据库应用系统开发综合实习题第1章网站与网页概述表2menu窗体中包含的主要对象及其属性对象名属性属性值menuCaption"主菜单"MaxButton0"FalseMinButton0"FalseStartUpPosition2"屏幕中心Comm1Caption"编辑名片记录"Comm2Caption"查询名片记录"Comm3Caption"设置系统用户"Comm4Caption"系统初始化"Comm5Caption"退出"在本窗体上设计如下事件过程:PrivateSubForm_Load()Ifuserlevel<>"系统管理员"ThenComm3.Enabled=FalseComm4.Enabled=FalseEndIfEndSubPrivateSubComm1_Click()edkh.ShowvbModalEndSubPrivateSubComm2_Click()qukh.ShowvbModalEndSubPrivateSubComm3_Click()setuser.ShowvbModalEndSubPrivateSubcomm4_Click()IfMsgBox("本功能要清除系统中所有数据,真的初始化吗?",vbYesNo,_"确认初始化操作")=vbYesThenCalldeldata("mpb")Calldeldata("zwb")Calldeldata("lxb")Calldeldata("oper")MsgBox"系统初始化完毕,下次只能以1234/1234(用户名/口令)进入本系统",_vbOKOnly,"信息提示"EndIfEndSubPrivateSubcomm5_Click()UnloadMeEndSub(4)edkh窗体 141附录数据库应用系统开发综合实习题第1章网站与网页概述该窗体用于编辑客户记录。包括客户的姓名、性别等。其设计界面如图9所示,包含的主要对象及其属性设置如表3所示。用户可以单击右下方的“添加”、“修改”和“删除”命令按钮执行相应的客户编辑功能。用户可以通过在设置条件框中输入相应的条件后,单击“确定”命令按钮,在上方的DataGrid1控件中仅显示满足指定条件的客户记录,“重置”命令按钮用于将所有条件文本框(Text1数组)中的数据置空,此时再直接选择“确定”命令按钮,则在上方的网格中显示所有的客户记录。当DataGrid1控件中不存在任何客户记录时,右下方的“修改”和“删除”命令按钮变得不可使用。图9edkh窗体设计界面表3edkh窗体中的主要对象及其属性对象名属性属性值edkhCaption"编辑客户记录"MaxButton0"FalseMinButton0"FalseStartUpPosition2"屏幕中心Adodc1Visible0"FalseConnect"DSN=MP"DataSourceName"MP"UserName"sa"Password"123456"RecordSource"select*frommpb"Caption"Adodc1"Adodc2Visible0"False 141附录数据库应用系统开发综合实习题第1章网站与网页概述(续表)对象名属性属性值Connect"DSN=MP"DataSourceName"MP"UserName"sa"Password"123456"RecordSource"select*fromzwb"Caption"Adodc2"Adodc3Visible0"FalseConnect"DSN=MP"DataSourceName"MP"UserName"sa"Password"123456"RecordSource"select*fromlxb"Caption"Adodc3"Comm1Caption"添加"Comm2Caption"修改"Comm3Caption"删除"Comm4Caption"返回"Frame3Caption"性别"Opt1Caption"男"Opt2Caption"女"selcmd2Caption"重置"selcmd1Caption"确定"DataCombo1RowSource"Adodc2"ListField"fn"Text""DataCombo2RowSource"Adodc3"ListField"fn"Text""DataGrid1AllowUpdate0"FalseDataSource"Adodc1"HeadLines1RowHeight15FormatLocked-1"True 141附录数据库应用系统开发综合实习题第1章网站与网页概述(续表)对象名属性属性值ColumnCount13Column00DataField"姓名"Caption"姓名"Column01DataField"性别"Caption"性别"Column02DataField"出生日期"Caption"出生日期"Column03DataField"单位"Caption"单位"Column04DataField"职务"Caption"职务"Column05DataField"单位电话"Caption"单位电话"Column06DataField"手机"Caption"手机"Column07DataField"工作地址"Caption"工作地址"Column08DataField"客户类型"Caption"客户类型"Column09DataField"住宅电话"Caption"住宅电话"Column10DataField"家庭地址"Caption"家庭地址"Column11DataField"个人爱好"Caption"个人爱好"Column12DataField"背景信息"Caption"背景信息"在本窗体上设计如下事件过程:PrivateSubForm_Load()recs=Adodc1.Recordset.RecordCountEndSubPrivateSubDataGrid1_DblClick() 141附录数据库应用系统开发综合实习题第1章网站与网页概述Ifrecs>0Thendisp.ShowvbModalEndIfEndSubPrivateSubForm_Activate()DataGrid1.SetFocusCallencommEndSubPrivateSubComm1_Click()flag1=1edkh1.ShowvbModalEndSubPrivateSubComm2_Click()flag1=2edkh1.ShowvbModalEndSubPrivateSubComm3_Click()IfMsgBox("真的要删除["+Trim(Adodc1.Recordset.Fields("姓名"))+"]吗?",vbYesNo,"信息提示")=vbYesThenAdodc1.Recordset.Deleterecs=recs-1CallencommEndIfEndSubPrivateSubcomm4_Click()UnloadMeEndSubPrivateSubselcmd1_Click()"确定IfTrim(Text1(1).Text)<>""ThenIfNotIsDate(Trim(Text1(1).Text))ThenMsgBox"出生日期输入错误,应为yy-mm-dd类型",vbOKOnly,"信息提示"Text1(1).SetFocusExitSubEndIfEndIfDimstrAsStringstr="""条件表达式IfTrim(Text1(0).Text)<>""ThenIfstr=""Thenstr="姓名=""+Trim(Text1(0).Text)+"""Elsestr=str+"and姓名=""+Trim(Text1(0).Text)+"""EndIfEndIfIfTrim(Text1(1).Text)<>""ThenIfstr=""Thenstr="出生日期=""+Format(Trim(Text1(1).Text),"yyyy.mm.dd")+"""Elsestr=str+"and出生日期=""+Format(Trim(Text1(1).Text),_"yyyy.mm.dd")+"""EndIfEndIfIfTrim(Text1(2).Text)<>""ThenIfstr=""Then 141附录数据库应用系统开发综合实习题第1章网站与网页概述str="单位=""+Trim(Text1(2).Text)+"""Elsestr=str+"and单位=""+Trim(Text1(2).Text)+"""EndIfEndIfIfOpt1.Value=TrueThenIfstr=""Thenstr="性别="男""Elsestr=str+"and性别="男""EndIfElseIfOpt2.Value=TrueThenIfstr=""Thenstr="性别="女""Elsestr=str+"and性别="女""EndIfEndIfIfTrim(DataCombo1.Text)<>""ThenIfstr=""Thenstr="职务=""+Trim(DataCombo1.Text)+"""Elsestr=str+"and职务=""+Trim(DataCombo1.Text)+"""EndIfEndIfIfTrim(DataCombo2.Text)<>""ThenIfstr=""Thenstr="客户类型=""+Trim(DataCombo2.Text)+"""Elsestr=str+"and客户类型=""+Trim(DataCombo2.Text)+"""EndIfEndIfIfstr<>""ThenAdodc1.RecordSource="select*frommpbwhere"+strAdodc1.RefreshElseAdodc1.RecordSource="select*frommpb"Adodc1.RefreshEndIfrecs=Adodc1.Recordset.RecordCountIfrecs=0ThenMsgBox"没有任何满足条件的记录",vbOKOnly,"信息提示"EndIfCallencommEndSubPrivateSubselcmd2_Click()"重置Text1(0).Text=""Text1(1).Text=""Text1(2).Text=""Opt1.Value=FalseOpt2.Value=FalseDataCombo1.Text=""DataCombo2.Text=""EndSubPrivateSubencomm()"自定义子过程:判断Adodc1中是否存在记录Ifrecs=0ThenComm2.Enabled=FalseComm3.Enabled=False 141附录数据库应用系统开发综合实习题第1章网站与网页概述ElseComm2.Enabled=TrueComm3.Enabled=TrueEndIfEndSubPrivateSubText1_KeyPress(IndexAsInteger,KeyAsciiAsInteger)Callendata(KeyAscii)EndSub说明:上述程序中recs是在公共模块中声明的全局变量。为什么使用recs而不直接使用adodc1.recordset.recordcount?因为在调用edkh1窗体添加一个记录(确定)后再返回到本表单时,若不在Form_Activate()事件过程中调用adodc1.refresh进行刷新,则adodc1.recordset.recordcount值仍未增1,这样调用encomm过程时出错;若在Form_Activate()事件过程中调用adodc1.refresh进行刷新,adodc1.recordset.recordcount值增1了,调用encomm过程时也正确,但是返回本窗体时,当前记录总是第一个记录,而用户希望在添加或修改后DataGrid中显示的应是当前操作的那条记录,所以采用recs用程序统计记录个数更好些。后面的qukh等窗体也是采用这种设计方法。(5)disp窗体该窗体被edkh和qukh窗体调用,以显示当前选择的客户详细记录,用户不能编辑其中的数据。其设计界面如图10所示,其中包含的主要对象及其属性设置如表4所示。图10disp窗体设计界面表4disp窗体中的主要对象及其属性对象名属性属性值dispCaption"显示客户记录"MaxButton0"FalseMinButton0"FalseStartUpPosition2"屏幕中心Comm1Caption"确定"在本窗体上设计如下事件过程:PrivateSubForm_Load()IfTrim(edkh.Adodc1.Recordset.Fields("姓名"))<>""Then 141附录数据库应用系统开发综合实习题第1章网站与网页概述Text1(0).Text=edkh.Adodc1.Recordset.Fields("姓名")&""Text1(1).Text=edkh.Adodc1.Recordset.Fields("性别")&""Text1(2).Text=edkh.Adodc1.Recordset.Fields("出生日期")&""Text1(3).Text=edkh.Adodc1.Recordset.Fields("单位")&""Text1(4).Text=edkh.Adodc1.Recordset.Fields("职务")&""Text1(5).Text=edkh.Adodc1.Recordset.Fields("单位电话")&""Text1(6).Text=edkh.Adodc1.Recordset.Fields("手机")&""Text1(7).Text=edkh.Adodc1.Recordset.Fields("工作地址")&""Text1(8).Text=edkh.Adodc1.Recordset.Fields("客户类型")&""Text1(9).Text=edkh.Adodc1.Recordset.Fields("住宅电话")&""Text1(10).Text=edkh.Adodc1.Recordset.Fields("家庭地址")&""Text1(11).Text=edkh.Adodc1.Recordset.Fields("个人爱好")&""Text1(12).Text=edkh.Adodc1.Recordset.Fields("背景信息")&""EndIfEndSubPrivateSubComm1_Click()UnloadMeEndSub(6)edkh1窗体该窗体被edkh窗体所调用,以实现mpb表中记录基本数据的编辑。用户单击“确定”按钮时,记录编辑有效;单击“取消”按钮时,记录编辑无效。在编辑记录时可以单击“...”按钮调用edrec窗体来设置常用的客户职务和客户类型,这样用户可以从DataCombo1和DataCombo2下拉列表框中重复选取这些数据,从而提高录入速度。其设计界面如图11所示,其中包含的主要对象及其属性设置如表5所示。图11edkh1窗体设计界面表5edkh1窗体中的主要对象及其属性对象名属性属性值edkh1Caption"编辑客户记录"MaxButton0"FalseMinButton0"FalseStartUpPosition2"屏幕中心 141附录数据库应用系统开发综合实习题第1章网站与网页概述(续表)对象名属性属性值Adodc1Visible0"FalseConnect"DSN=MP"DataSourceName"MP"UserName"sa"Password"123456"RecordSource"select*fromzwb"Caption"Adodc1"Adodc2Visible0"FalseConnect"DSN=MP"DataSourceName"MP"UserName"sa"Password"123456"RecordSource"select*fromlxb"Caption"Adodc2"selcom1Caption"..."selcom2Caption"..."Comm1Caption"确定"Comm2Caption"取消"DataCombo1RowSource"Adodc1"ListField"fn"Text""DataCombo2RowSource"Adodc2"ListField"fn"Text""Frame2Caption"性别"Opt1Caption"男"Opt2Caption"女"在本窗体上设计如下事件过程:DimrsAsADODB.RecordsetPrivateSubForm_Load()Ifflag1=2Then"修改操作Text1(0).Text=edkh.Adodc1.Recordset.Fields("姓名")&""Ifedkh.Adodc1.Recordset.Fields("性别")="男"ThenOpt1.Value=TrueElseIfedkh.Adodc1.Recordset.Fields("性别")="女"Then 141附录数据库应用系统开发综合实习题第1章网站与网页概述Opt2.Value=TrueEndIfText1(1).Text=edkh.Adodc1.Recordset.Fields("出生日期")&""Text1(2).Text=edkh.Adodc1.Recordset.Fields("单位")&""Text1(3).Text=edkh.Adodc1.Recordset.Fields("单位电话")&""Text1(4).Text=edkh.Adodc1.Recordset.Fields("手机")&""Text1(5).Text=edkh.Adodc1.Recordset.Fields("工作地址")&""Text1(6).Text=edkh.Adodc1.Recordset.Fields("住宅电话")&""Text1(7).Text=edkh.Adodc1.Recordset.Fields("家庭地址")&""Text1(8).Text=edkh.Adodc1.Recordset.Fields("个人爱好")&""Text1(9).Text=edkh.Adodc1.Recordset.Fields("背景信息")&""DataCombo1.Text=edkh.Adodc1.Recordset.Fields("职务")&""DataCombo2.Text=edkh.Adodc1.Recordset.Fields("客户类型")&""EndIfEndSubPrivateSubForm_Activate()Adodc1.Refresh"数据源刷新Adodc2.Refresh"数据源刷新EndSubPrivateSubComm1_Click()IfTrim(Text1(0).Text)=""ThenMsgBox"加*数据项不能为空,请重新设置",vbOKOnly,"信息提示"Text1(0).SetFocusExitSubEndIfIfTrim(Text1(1).Text)<>""ThenIfNotIsDate(Trim(Text1(1).Text))ThenMsgBox"出生日期输入不正确,重新输入",vbOKOnly,"信息提示"Text1(1).SetFocusEndIfEndIfIfflag1=1Then"添加操作sqltxt="select*frommpbwhere姓名=""+Trim(Text1(0).Text)+""""对mpb中记录进行判断Setrs=exesql(sqltxt)Ifrs.RecordCount<>0ThenMsgBox"存在相同的客户姓名",vbOKOnly,"信息提示"Text1(0).SetFocusrs.CloseExitSubElsers.CloseEndIfrecs=recs+1edkh.Adodc1.Recordset.AddNewElse"修改操作sqltxt="select*frommpbwhere姓名=""+Trim(Text1(0).Text)+_""and编号<>"+str(edkh.Adodc1.Recordset.Fields("编号"))Setrs=exesql(sqltxt)Ifrs.RecordCount<>0ThenMsgBox"存在相同的客户姓名",vbOKOnly,"信息提示"Text1(0).SetFocusrs.CloseExitSubElsers.CloseEndIfEndIf 141附录数据库应用系统开发综合实习题第1章网站与网页概述edkh.Adodc1.Recordset.Fields("姓名")=Trim(Text1(0).Text)IfOpt1.Value=TrueThenedkh.Adodc1.Recordset.Fields("性别")="男"ElseIfOpt2.Value=TrueThenedkh.Adodc1.Recordset.Fields("性别")="女"Elseedkh.Adodc1.Recordset.Fields("性别")=""EndIfIfTrim(Text1(1).Text)<>""Thenedkh.Adodc1.Recordset.Fields("出生日期")=_Format(Trim(Text1(1).Text),"yyyy-mm-dd")EndIfedkh.Adodc1.Recordset.Fields("单位")=Trim(Text1(2).Text)edkh.Adodc1.Recordset.Fields("单位电话")=Trim(Text1(3).Text)edkh.Adodc1.Recordset.Fields("手机")=Trim(Text1(4).Text)edkh.Adodc1.Recordset.Fields("工作地址")=Trim(Text1(5).Text)edkh.Adodc1.Recordset.Fields("住宅电话")=Trim(Text1(6).Text)edkh.Adodc1.Recordset.Fields("家庭地址")=Trim(Text1(7).Text)edkh.Adodc1.Recordset.Fields("个人爱好")=Trim(Text1(8).Text)edkh.Adodc1.Recordset.Fields("背景信息")=Trim(Text1(9).Text)edkh.Adodc1.Recordset.Fields("职务")=Trim(DataCombo1.Text)edkh.Adodc1.Recordset.Fields("客户类型")=Trim(DataCombo2.Text)edkh.Adodc1.Recordset.Fields("编号")=Int(TimeValue(Time)*10000000)"产生唯一编号edkh.Adodc1.Recordset.UpdateUnloadMeEndSubPrivateSubComm2_Click()UnloadMeEndSubPrivateSubselcom1_Click()tna="zwb"cap="职务"edrec.ShowvbModalEndSubPrivateSubselcom2_Click()tna="lxb"cap="客户类型"edrec.ShowvbModalEndSubPrivateSubText1_KeyPress(IndexAsInteger,KeyAsciiAsInteger)Callendata(KeyAscii)EndSubPrivateSubDataCombo1_KeyPress(KeyAsciiAsInteger)Callendata(KeyAscii)EndSubPrivateSubDataCombo2_KeyPress(KeyAsciiAsInteger)Callendata(KeyAscii)EndSub(7)edrec窗体本窗体被“...”一类的命令按钮所调用,以输入和编辑一些重复使用的数据。本窗体的设计界面如图12所示,其中包含的主要对象及其属性值如表6所示。 141附录数据库应用系统开发综合实习题第1章网站与网页概述图12edrec窗体设计界面表6edrec窗体包含的主要对象及其属性对象名属性属性值edrecCaption"编辑系统用户"MaxButton0"FalseMinButton0"FalseStartUpPosition2"屏幕中心Comm1Caption"添加"Comm2Caption"修改"Comm3Caption"删除"Comm4Caption"返回"Adodc1Connect"DSN=MP"DataSourceName"MP"UserName"sa"Password"123456"RecordSource"select*fromzwb"Caption"Adodc1"DataGrid1AllowUpdate0"FalseDataSource"Adodc1"HeadLines1RowHeight15FormatLocked-1"TrueColumnCount1Column00DataField"fn"Caption""在本窗体上设计如下事件过程:DimmsgAsStringPrivateSubForm_Load()Adodc1.RecordSource="select*from"+tnaAdodc1.Refreshrecs=Adodc1.Recordset.RecordCount 141附录数据库应用系统开发综合实习题第1章网站与网页概述DataGrid1.Columns(0).Caption=capDataGrid1.Columns(0).DataField="fn"EndSubPrivateSubForm_Activate()CallencommEndSubPrivateSubComm1_Click()flag=1edrec1.ShowvbModalEndSubPrivateSubComm2_Click()flag=2edrec1.ShowvbModalEndSubPrivateSubComm3_Click()IfMsgBox("真的要删除["+Trim(Adodc1.Recordset.Fields("fn"))+_"]吗?",vbYesNo,"信息提示")=vbYesThenAdodc1.Recordset.Deleterecs=recs-1CallencommEndIfEndSubPrivateSubComm4_Click()Adodc1.Recordset.UpdateBatchAdodc1.Recordset.CloseUnloadMeEndSubPrivateSubencomm()Ifrecs=0ThenComm2.Enabled=FalseComm3.Enabled=FalseElseComm2.Enabled=TrueComm3.Enabled=TrueEndIfEndSub(8)edrec1窗体该窗体被edrec窗体所调用,用于编辑当前打开表的记录。用户单击“确定”按钮时,记录编辑有效;单击“取消”按钮时,记录编辑无效。本窗体的设计界面如图13所示,其中包含的主要对象及其属性值如表7所示。图13edrec1窗体设计界面 141附录数据库应用系统开发综合实习题第1章网站与网页概述表7edrec1窗体包含的主要对象及其属性对象名属性属性值edrec1Caption"记录编辑"StartUpPosition2"屏幕中心Comm1Caption"确定"Comm2Caption"取消"在本窗体上设计如下事件过程:DimcondAsStringPrivateSubForm_Load()Label1.Caption=capIfflag=1ThenText1.Text=""ElseText1.Text=edrec.Adodc1.Recordset.Fields("fn")EndIfEndSubPrivateSubComm1_Click()IfTrim(Text1.Text)=""ThenMsgBox"数据项不能为空,请重新设置",vbOKOnly,"信息提示"Text1.SetFocusExitSubEndIfIfflag=1Then"添加操作Ifedrec.Adodc1.Recordset.RecordCount>0Then"原记录个数大于0cond="fn=""+Trim(Text1.Text)+"""edrec.Adodc1.Recordset.MoveFirst"每次从头开始查找edrec.Adodc1.Recordset.Find(cond)IfNotedrec.Adodc1.Recordset.EOF()ThenMsgBox"存在完全相同的记录",vbOKOnly,"信息提示"Text1.SetFocusExitSubEndIfEndIfedrec.Adodc1.Recordset.AddNewedrec.Adodc1.Recordset.Fields("fn")=Trim(Text1.Text)edrec.Adodc1.Recordset.Updaterecs=recs+1Else"修改操作n=edrec.Adodc1.Recordset.AbsolutePositioncond="fn=""+Trim(Text1.Text)+"""edrec.Adodc1.Recordset.MoveFirst"每次从头开始查找edrec.Adodc1.Recordset.Find(cond)IfNotedrec.Adodc1.Recordset.EOF()And_edrec.Adodc1.Recordset.AbsolutePosition<>nThenMsgBox"存在完全相同的记录",vbOKOnly,"信息提示"edrec.Adodc1.Recordset.MoveFirst"这两个语句恢复原记录位置edrec.Adodc1.Recordset.Move(n-1)Text1.SetFocusExitSubEndIfedrec.Adodc1.Recordset.MoveFirst"这两个语句恢复原记录位置 141附录数据库应用系统开发综合实习题第1章网站与网页概述edrec.Adodc1.Recordset.Move(n-1)edrec.Adodc1.Recordset.Fields("fn")=Trim(Text1.Text)edrec.Adodc1.Recordset.UpdateEndIfUnloadMeEndSubPrivateSubComm2_Click()UnloadMeEndSub(9)qukh窗体该窗体用于条件查找mpb表中的客户记录。用户通过“设置条件”框架设置任意条件,单击“确定”按钮后在上方的网格中显示指定条件的客户记录。“重置”按钮用于将所有条件文本框(Text1数组)清空,若之后直接单击“确定”按钮,则在DataGrid1控件中显示全部输入的客户记录。本窗体的设计界面如图14所示,其中包含的主要对象及其属性值如表8所示。图14qukh窗体设计界面表8qukh窗体中的主要对象及其属性对象名属性属性值qukhCaption"查询客户"MaxButton0"FalseMinButton0"FalseStartUpPosition2"屏幕中心Adodc1Visible0"FalseConnect"DSN=MP"DataSourceName"MP"UserName"sa"Password"123456"RecordSource"select*frommpb"Caption"Adodc1"Adodc2Visible0"FalseConnect"DSN=MP"DataSourceName"MP"UserName"sa" 141附录数据库应用系统开发综合实习题第1章网站与网页概述(续表)对象名属性属性值Password"123456"RecordSource"select*fromzwb"Caption"Adodc2"Adodc3Visible0"FalseConnect"DSN=MP"DataSourceName"MP"UserName"sa"Password"123456"RecordSource"select*fromlxb"Caption"Adodc3"retCommCaption"返回"Frame3Caption"性别"Opt1Caption"男"Opt2Caption"女"selcmd2Caption"重置"selcmd1Caption"确定"DataCombo1RowSource"Adodc2"ListField"fn"Text""DataCombo2RowSource"Adodc3"ListField"fn"Text""DataGrid1AllowUpdate0"FalseDataSource"Adodc1"HeadLines1RowHeight15FormatLocked-1"TrueColumnCount13Column00DataField"姓名"Caption"姓名"Column01DataField"性别"Caption"性别"Column02DataField"出生日期"Caption"出生日期"Column03DataField"单位"Caption"单位"Column04DataField"职务" 141附录数据库应用系统开发综合实习题第1章网站与网页概述(续表)对象名属性属性值Caption"职务"Column05DataField"单位电话"Caption"单位电话"Column06DataField"手机"Caption"手机"Column07DataField"工作地址"Caption"工作地址"Column08DataField"客户类型"Caption"客户类型"Column09DataField"住宅电话"Caption"住宅电话"Column10DataField"家庭地址"Caption"家庭地址"Column11DataField"个人爱好"Caption"个人爱好"Column12DataField"背景信息"Caption"背景信息"在本窗体上设计如下事件过程:PublicstrAsString"设置的条件PrivateSubForm_Load()str=""recs=Adodc1.Recordset.RecordCountText2.Text=recsEndSubPrivateSubDataGrid1_DblClick()Ifrecs>0Thendisp.ShowvbModalEndIfEndSubPrivateSubForm_Activate()DataGrid1.SetFocusEndSubPrivateSubretComm_Click()UnloadMeEndSubPrivateSubselcmd1_Click()"确定IfTrim(Text1(1).Text)<>""ThenIfNotIsDate(Trim(Text1(1).Text))ThenMsgBox"出生日期输入错误,应为yy-mm-dd类型",vbOKOnly,"信息提示"Text1(1).SetFocus 141附录数据库应用系统开发综合实习题第1章网站与网页概述ExitSubEndIfEndIfstr="""条件表达式IfTrim(Text1(0).Text)<>""ThenIfstr=""Thenstr="姓名=""+Trim(Text1(0).Text)+"""Elsestr=str+"and姓名=""+Trim(Text1(0).Text)+"""EndIfEndIfIfTrim(Text1(1).Text)<>""ThenIfstr=""Thenstr="出生日期=""+Format(Trim(Text1(1).Text),"yyyy.mm.dd")+"""Elsestr=str+"and出生日期=""+Format(Trim(Text1(1).Text),_"yyyy.mm.dd")+"""EndIfEndIfIfTrim(Text1(2).Text)<>""ThenIfstr=""Thenstr="单位=""+Trim(Text1(2).Text)+"""Elsestr=str+"and单位=""+Trim(Text1(2).Text)+"""EndIfEndIfIfOpt1.Value=TrueThenIfstr=""Thenstr="性别="男""Elsestr=str+"and性别="男""EndIfElseIfOpt2.Value=TrueThenIfstr=""Thenstr="性别="女""Elsestr=str+"and性别="女""EndIfEndIfIfTrim(DataCombo1.Text)<>""ThenIfstr=""Thenstr="职务=""+Trim(DataCombo1.Text)+"""Elsestr=str+"and职务=""+Trim(DataCombo1.Text)+"""EndIfEndIfIfTrim(DataCombo2.Text)<>""ThenIfstr=""Thenstr="客户类型=""+Trim(DataCombo2.Text)+"""Elsestr=str+"and客户类型=""+Trim(DataCombo2.Text)+"""EndIfEndIfIfstr<>""ThenAdodc1.RecordSource="select*frommpbwhere"+strAdodc1.RefreshElseAdodc1.RecordSource="select*frommpb"Adodc1.RefreshEndIf 141附录数据库应用系统开发综合实习题第1章网站与网页概述recs=Adodc1.Recordset.RecordCountText2.Text=recsIfrecs=0ThenMsgBox"没有任何满足条件的记录",vbOKOnly,"信息提示"EndIfEndSubPrivateSubselcmd2_Click()"重置Text1(0).Text=""Text1(1).Text=""Text1(2).Text=""Opt1.Value=FalseOpt2.Value=FalseDataCombo1.Text=""DataCombo2.Text=""EndSubPrivateSubText1_KeyPress(IndexAsInteger,KeyAsciiAsInteger)Callendata(KeyAscii)EndSub图15setuser窗体设计界面(10)setuser窗体该窗体用于添加、删除和修改使用本系统的用户。设计界面如图15所示,其中包含的主要对象及其属性值如表9所示。在上方的网格中显示所有的用户。通过“添加”按钮增加新用户,“插入”按钮在当前用户之前插入一个新用户,“修改”按钮修改当前选择的用户,“删除”按钮删除当前选择的用户。表9setuser窗体中包含的主要对象及其属性设置对象属性属性取值setuserCaption"设置系统用户"MaxButton0"FalseMinButton0"FalseStartUpPosition2"屏幕中心Comm1Caption"添加"Comm2Caption"修改"Comm3Caption"删除"Comm4Caption"返回"Adodc1Connect"DSN=MP"UserName"sa"Password"123456"RecordSource"select*fromoper"Caption"Adodc1" 141附录数据库应用系统开发综合实习题第1章网站与网页概述(续表)对象属性属性取值DataGrid1ColumnCount3Column00DataField"用户名"Caption"用户名"Column01DataField"口令"Caption"口令"Column02DataField"级别"Caption"级别"在本窗体上设计如下事件过程:DimmsgAsStringPrivateSubForm_Load()recs=Adodc1.Recordset.RecordCountEndSubPrivateSubForm_Activate()DataGrid1.SetFocusCallencommEndSubPrivateSubComm1_Click()flag=1setuser1.ShowvbModalEndSubPrivateSubComm2_Click()flag=2setuser1.ShowvbModalEndSubPrivateSubComm3_Click()IfMsgBox("真的要删除["+Trim(Adodc1.Recordset.Fields("级别"))+"]吗?",vbYesNo,"信息提示")=vbYesThenAdodc1.Recordset.Deleterecs=recs-1CallencommEndIfEndSubPrivateSubComm4_Click()UnloadMeEndSubPrivateSubencomm()Ifrecs=0ThenComm2.Enabled=FalseComm3.Enabled=FalseElseComm2.Enabled=TrueComm3.Enabled=True 141附录数据库应用系统开发综合实习题第1章网站与网页概述图16setuser1窗体设计界面EndIfEndSub(11)setuser1窗体该窗体被setuser窗体调用以编辑用户记录。设计界面如图16所示,其中包含的主要对象及其属性值如表10所示。在操作中,单击“确定”按钮时,记录编辑有效;单击“取消”按钮时,记录编辑无效。表10setuser1窗体中包含的主要对象及其属性设置对象属性属性取值setuser1Caption"编辑系统用户"MaxButton0"FalseMinButton0"FalseStartUpPosition2"屏幕中心Comm1Caption"确定"Comm2Caption"取消"Combo1List"一般操作员,系统管理员"在本窗体上设计如下事件过程:DimcondAsStringPrivateSubForm_Load()Ifflag=2ThenText1(0).Text=setuser.Adodc1.Recordset.Fields("用户名")&""Text1(1).Text=setuser.Adodc1.Recordset.Fields("口令")&""Combo1.Text=setuser.Adodc1.Recordset.Fields("级别")&""EndIfEndSubPrivateSubForm_KeyPress(KeyAsciiAsInteger)IfKeyAscii=13ThenSendKeys"{TAB}"EndIfEndSubPrivateSubComm1_Click()IfTrim(Text1(0).Text)=""OrTrim(Text1(1).Text)=""Or_Trim(Combo1.Text)=""ThenMsgBox"数据项不全,请重新设置",vbOKOnly,"信息提示"Text1(0).SetFocusExitSubEndIfIfflag=1Then"添加操作Ifsetuser.Adodc1.Recordset.RecordCount>0Then"原记录个数大于0cond="级别=""+Trim(Text1(0).Text)+"""setuser.Adodc1.Recordset.MoveFirst"每次从头开始查找setuser.Adodc1.Recordset.Find(cond)IfNotsetuser.Adodc1.Recordset.EOF()ThenMsgBox"存在完全相同的记录",vbOKOnly,"信息提示" 141附录数据库应用系统开发综合实习题第1章网站与网页概述Text1(0).SetFocusExitSubEndIfEndIfsetuser.Adodc1.Recordset.AddNewsetuser.Adodc1.Recordset.Fields("用户名")=Trim(Text1(0).Text)setuser.Adodc1.Recordset.Fields("口令")=Trim(Text1(1).Text)setuser.Adodc1.Recordset.Fields("级别")=Trim(Combo1.Text)setuser.Adodc1.Recordset.Updaterecs=recs+1Else"修改操作n=setuser.Adodc1.Recordset.AbsolutePositioncond="级别=""+Trim(Text1(0).Text)+"""setuser.Adodc1.Recordset.MoveFirst"每次从头开始查找setuser.Adodc1.Recordset.Find(cond)IfNotsetuser.Adodc1.Recordset.EOF()And_setuser.Adodc1.Recordset.AbsolutePosition<>nThenMsgBox"存在完全相同的记录",vbOKOnly,"信息提示"setuser.Adodc1.Recordset.MoveFirst"这两个语句恢复原记录位置setuser.Adodc1.Recordset.Move(n-1)Text1(0).SetFocusExitSubEndIfsetuser.Adodc1.Recordset.MoveFirst"这两个语句恢复原记录位置setuser.Adodc1.Recordset.Move(n-1)setuser.Adodc1.Recordset.Fields("用户名")=Trim(Text1(0).Text)setuser.Adodc1.Recordset.Fields("口令")=Trim(Text1(1).Text)setuser.Adodc1.Recordset.Fields("级别")=Trim(Combo1.Text)setuser.Adodc1.Recordset.UpdateEndIfUnloadMeEndSubPrivateSubComm2_Click()UnloadMeEndSubPrivateSubText1_KeyPress(IndexAsInteger,KeyAsciiAsInteger)Callendata(KeyAscii)EndSub4.系统运行将本系统连编成MP.exe文件,可以脱离VB系统单独运行。运行MP,出现如图17所示的界面,输入1234/1234(默认的系统管理员),单击“确定”按钮,进入系统主菜单窗体,该窗体如图18所示。图17系统运行界面(1)图18系统运行界面(2) 141附录数据库应用系统开发综合实习题第1章网站与网页概述在主窗体中单击“编辑名片记录”按钮,在出现的窗体中单击“添加”按钮,输入一个姓名为“王华”的客户记录,如图19所示,输入完毕后单击“确定”按钮。采用同样的操作输入“王丽”的客户记录,返回后出现如图20所示的界面。图19系统运行界面(3)图20系统运行界面(4)在主窗体中单击“查询名片记录”按钮,在“设置条件”选项组中选中性别“男”,单击“确定”按钮,显示如图21所示的界面,表示只有一个男性客户。在这个窗体中用户可以进行复杂的查询。图21系统运行界面(5)'