第一篇:2015-2 13计科数据库编程 实验教案 oracle11g
湘南学院 实验教案
授课学期:2015年度第二学期 课程名称:数据库编程课时安排:专
业:计算机科学与技术班
级:年
级:任课教师:陆汝华
实验 16课时
1班 2013级 实验一 Oracle安装配置与基本操作实验
教学目的要求:
1.掌握Oracle数据库的安装,包括服务器端数据库管理系统安装和客户端工具的安装。2.掌握Oracle数据库的登录、启动和关闭 重点:
Oracle 11g数据库的安装 难点:
服务端和客户端的安装 课时安排:实验2课时
预备知识:
一、安装:
1、选择安装方法:默认为基本安装,一般选择高级安装
2、选择安装类型:企业版 标准版 个人版
一般选择企业版
3、安装位置:即ORACLE基目录和主目录设置
4、先决条件检查
5、选择配置选项:创建数据库
6、选择数据库配置:一般用途/事务处理
7、输入全局数据库名和SID
8、数据库存储选项:数据文件存储位置
9、备份和恢复选项
10、口令
11、概要
点击安装按钮开始安装,直到出现安装结束界面。
二、操作:
1、程序组,系统服务,文件夹目录等的变化
2、从开始进入SQL Plus进行登录操作 用户名:sys as sysdba
3、进入控制台进行操作 https://localhost:1158/em
三、当oracle11g计算机名修改后需要重新配置 1 监听程序配置 本地NET服务名配置 3 控制台重新配置
(1)cmd
(2)emctl start dbconsole 提示:Environment variable ORACLE_SID not defined.Please define it.(3)set oracle_sid=orcl
(4)emctl start dbconsole 提示:OC4J Configuration issue.c:appAdministratorproduct11.1.0db_1/oc4j/j2ee/OC4 J_DBConsole_j1390_orcl not found.(5)复制上述文件改名为:OC4J_DBConsole_j1390_orcl
(6)emctl start dbconsole 提示:EM Configuration issue.c:appAdministratorproduct11.1.0db_1/j1390_orcl not found.(7)emctl start dbconsole 服务已经启动成功。还可以通过修改资料档案库或新建数据库来完成。
实验内容:
1、Oracle服务端软件的安装;
2、Oracle数据库的安装;
3、Oracle数据库客户端的安装;
4、Oracle数据库的登录、启动和关闭等基本操作。实验二 Oracle网络结构与管理实验
教学目的要求:
1.理解Oracle网络服务组成及Oracle NET、监听程序、管理连接器和网络工具的功能和作用;
2.理解服务名、连接描述符、连接标识符等基本概念; 3.掌握Oracle网络在服务器端和客户端的配置方法。重点:
Oracle 服务器端监听程序和网络服务名的配置 难点:
Oracle 服务器端监听程序的配置 课时安排:实验2课时
预备知识:
一、监听程序的配置
1、监听程序配置文件内容
默认路径为%Oracle-Home%networkadmin,存在文件名为listener.ora的配置文件,包含内容:配置监听程序所监听的一个或多个协议地址。配置监听程序所支持的数据库服务信息。设置控制监听程序运行的参数。
2、监听程序配置方法
使用ONCA或Oracle net manager修改配置文件listener.ora的内容,可以配置多个监听程序,ONCA配置方法步骤如下。
(1)欢迎使用(2)监听程序
(3)输入监听程序名称(4)选择协议(5)选择端口(6)配置完成
3、监听程序管理
在Windows环境下,可用命令行程序LSNRCTL(listener control 监听控制)启动、关闭和管理监听程序。
二、命名方法的配置
1、选择命名方法的配置
选择的命名方法记录在sqlnet.ora的文件中,该文件默认路径为networkadmin,默认内容为:
# sqlnet.ora Network Configuration File: D:appAdministratorproduct11.1.0db_1networkadminsqlnet.ora # Generated by Oracle configuration tools.# This file is actually generated by netca.But if customers choose to # install “Software Only”, this file wont exist and without the native # authentication, they will not be able to connect to the database on NT.SQLNET.AUTHENTICATION_SERVICES=(NTS)NAMES.DIRECTORY_PATH=(TNSNAMES, EZCONNECT)
2、配置本地命名方法 本地命名方法将连接标识符到连接描述符的映射关系保存在名称为tnsnames.ora文件中,默认内容为:
# tnsnames.ora Network Configuration File: D:appAdministratorproduct11.1.0db_1networkadmintnsnames.ora # Generated by Oracle configuration tools.ORCL =
(DESCRIPTION =
(ADDRESS =(PROTOCOL = TCP)(HOST = localhost)(PORT = 1521))
(CONNECT_DATA =
(SERVER = DEDICATED)
(SERVICE_NAME = orcl)))也可通过ONCA进行配置:
(1)选择“本地Net服务名配置”(2)服务名配置(3)服务名(4)选择协议(5)主机名(6)测试
(7)测试成功,可编辑网络服务名
实验内容:
1、对Oracle 服务器端进行监听程序和网络服务名等配置,并查看listener.ora、sqlnet.ora、tnsnames.ora等相关文件和Net Manager等相关界面的数据信息;
2、修改服务端的计算机名,对Oracle进行重新配置,使其能正常工作,同时查看上述相关数据并与之比较变化;
3、使用命令对监听程序进行操作管理。
实验三 Oracle数据库管理实验
教学目的要求:
1.掌握数据库的建立方法。
2.了解手动建立数据库的基本步骤。3.掌握数据库启动、关闭和删除的方法 重点:
数据库启动、关闭和删除的方法 难点:
手动建立数据库 课时安排:实验2课时
预备知识:
一、数据库的建立
(1)DBCA建立数据库
点击:OracleHome、Configuration And Migration Tools、Database Configuration Assistant进入DBCA界面。
(2)SQL命令建立数据库
1、确定数据库名和实例名SID SQL>setenv Oracle_SID=student
2、确定环境变量设置正确
在启动SQL Plus之前,必须正确设置环境变量。如Oracle_sid,Oracle_hom,PATH等。
3、确定DBA认证方式
新建数据库,必须以DBA身份连接,并具有相应的系统权限。
4、创建初始化参数文件
可复制样本初始化参数文件,也可复制其它数据库的初始化 参数文件。
5、创建实例
C:>oradim –NEW –SID student –STARTMODE MANUAL-PFILE=„„INIT.ORA
6、连接到实例
SQL>CONNECT SYS AS SYSDBA;连接正确,则提示connected to an idle instance.7、建立服务器参数文件
SQL>CREATE SPFILE FROM PFILE;
8、启动实例
SQL>STARTUP NOMOUNT;以非加载方式启动实例
9、执行CREATE DATABASE命令
二、数据库的操作(1)数据库的启动
1、启动实例但不加载数据库(NOMOUNT状态)SQL>STARTUP NOMOUNT;SQL>STARTUP NOMOUNT PFILE=„.init.ora;
2、启动实例并加载数据库(MOUNT状态)SQL>STARTUP MOUNT;SQL>STARTUP MOUNT PFILE=„.init.ora;
3、启动实例并加载、打开数据库(OPEN状态)SQL>STARTUP OPEN;SQL>STARTUP;SQL>STARTUP MOUNT PFILE=„.init.ora;SQL>STARTUP PFILE=„.init.ora;
4、数据库启动模式之间的转换
从NOMOUNT状态到MOUNT状态: SQL>ALTER DATABASE MOUNT; 从MOUNT状态到OPEN状态: SQL>ALTER DATABASE OPEN; 只读模式
SQL>ALTER DATABASE OPEN READ ONLY; 读写模式
SQL>ALTER DATABASE OPEN READ WRITE;(2)数据库的关闭
1、正常关闭方式(NORMAL)SQL>SHUTDOWN NORMAL;
2、立即关闭方式(IMMEDIATE)SQL>SHUTDOWN IMMEDIATE;
3、事务关闭方式(TRANSACTIONAL)SQL>SHUTDOWN TRANSACTIONAL;
4、终止关闭方式(ABORT)SQL>SHUTDOWN ABORT;
三、数据库的删除
启动DBCA,选择删除数据库。单击“下一步”,将显示所有可以被删除的数据库例程。
实验内容:
1、使用DBCA建立数据库;
2、使用命令建立数据库;
3、使用DBCA和命令对所建立的数据库进行修改、删除等操作;
4、练习数据库的启动和关闭等操作,重点练习三种启动模式和三种关闭方式,并了解数据库处于各种打开或关闭状态下所能进行和不能进行的基本操作。实验四 Oracle数据库对象管理实验
教学目的要求:
1.了解各类数据库对象的作用。
2.掌握表、视图、索引、序列、同义词等数据库对象的建立、删除、修改和查询等方法。3.掌握表内容的插入、删除、更新和查询等方法。4.掌握表的约束的使用方法 重点:
表内容的插入、删除、更新和查询等方法 难点:
手动建立表、视图、索引、序列等数据库对象 课时安排:实验4课时 实验内容:
1、使用SQL语句创建表(至少包含三种不同类型的字段),使用SQL语句向表中插入数据、修改表中数据、删除表中数据和查询数据。
2、使用SQL语句创建索引、视图。
3、创建序列,并在插入语句中使用序列。实验五Oracle数据库安全管理实验
教学目的要求:
1.了解数据库用户、权限、事务、概要文件、并发和会话等基本概念。2.掌握建立、删除和修改、查询用户等的方法。3.掌握用户授予和回收权限或角色的方法。4.掌握整个数据库安全的综合管理 重点:
用户授予和回收权限或角色 难点:
用户授予和回收权限或角色 课时安排:实验4课时 实验内容:
1、使用命令创建数据库认证用户。
2、为用户授予和回收权限或角色操作。
3、使用新用户登录,进行有权限和无权限操作。
第二篇:计科2008级 数据库课程设计题目
题目1高校教务管理系统(4人)
某高校有若干系,每系又分为若干专业,每系有若干学生和教师。学生被分在若干班级中,一个学生只能属于一个班级,一个班级的学生都是一个专业的;教师则被分在不同的课程组,一个教师可以属于多个课程组,某个课程组的老师才有资格讲授该门课程。学生须在大学四年中修满规定的学分,其中有一部分为必修课,另一部分是选修课;必修课以班级为最小单位安排上课教室及上课老师,多个班级可以安排在一个教室上课。每个专业都有自已的培养计划,规定该专业的学生应在大学四个学年或8 个学期中修完哪些必修课,并在指定的选修课修满选修学分。该计划同时指定了这些必修课或选修课所开设的学期。所有教学活动均在教室进行,但上机与实验则在机房或实验室进行。不同的教室、实验室或机房可容纳不同的人数。有的教室有多媒体设施,有的没有。有的课程必须在多媒体教室完成教学,有的则不然。
根据上述描述,设计并开发一个教务管理系统,功能至少包括:
学生、教师、课程、专业、教室等信息管理;
培养计划的制订;
排课系统;
选修课的选修系统(先有课表,然后方许学生选修);
成绩登记系统(只有任课老师才有权登记该门课程的成绩,但只能在该课程结束后一个月内登记,登记完毕后,任课老师要给予确认,此后再不能修改。在一个月快要结束的前一个星期,教务管理员应收到提醒,得知哪些老师尚未完成成绩的登记,以便电话通知这些任课老师);
成绩的统计、查询与打印(单人、单科、班级等成绩的打印);
学分的查询与统计;
根据需要的其它功能;
题目2图书销售系统(4人)
图书销售系统提供给书店包括图书编目、进退货、销售、财务报表等方面的一体化解决方案。同时还提供会员折扣功能,B/S 模式下的网上会员系统等。功能包括:
图书零售购买:顾客购书后收银台进行结账。对于书店的会员可以提供相应的折扣。输入需要购买的图书和数量,计算出总金额,由用户选择使用现金或会员卡进行结账。并提供销售小票流水号作为销售的单据。对于会员,还要计算相应的积分。
图书零售退货:顾客对已购买的图书进行退货。需要提供图书和销售的小票以作为购买凭证。系统查询数据库进行数据验证,对符合要求的图书进行退货。
新书编目:书店从出版社购买新的图书后在这里进行编目。只有编目后的图书才可以进行销售。
图书查找:可以使用ISBN、书名、作者、出版社等多种方式进行查找已编目的图书。
图书资料修改:对已编目的图书修改图书的基本信息、零售价和最低折扣价。图书进货:对已编目的图书再进货,同时处理其金额差异。
图书退货:对已编目的图书退货,同时处理其金额差异。
出版社管理:添加、删除、修改出版社,同时查询出版社的资料。
会员添加:添加新的会员,同时登记会员的基本信息、有效期、指定会员组等。会员查找:提供会员编号、身份证号、会员姓名等方式复合查询。
会员删除:删除已存在的会员。
会员信息修改:对会员的基本资料进行修改。
会员充值:向会员的虚拟账户充值。
挂失与特别处理:将会员的状态在正常、挂失、特别处理之间调整。也可以找回会员的密码。
会员组管理:添加、删除和列出会员组。可以对会员组的名称、折扣、积分换算等方面进行设置。
系统设置:添加、删除、修改系统操作员,同时为相应的操作员设置其控制权限。
密码修改:对当前的系统操作员的密码进行修改。
数据管理:提供系统数据库的备份与恢复。
报表处理:提供图书销售单、图书进货单、会员列表、出版社列表、销售单等报表。
题目3自来水公司水费管理系统(3人)
某市自来水公司负责该市所有民用和工业用水的供应,并负责水费的收取。工业用水与民用水采取不同的收费标准。无论工业用水或民用水均一月抄表一次,原则上每月收费一次。由于抄表的工作量较大,并不能保证两次抄表期间正好跨度一个月,因此以每月抄表的期间为当月收费期间。工业水费都由单位缴纳。民用水费有的由个人缴纳,有的由单位或住宅小区统一缴纳(然后单位再从职工工资中扣取,或由小区物业代收)。水费有的是由单位代理人或个人在收费大厅缴纳,有的由收费人员上门收取,再上缴财务。收费应当出具收费凭证(发票)。偶有单位或个人多个收费期间并缴现象,此时,可按收费期间出具多张收费凭证。对拖欠水费超过一定额度的出打印催缴通知。
根据上述描述,设计与开发一个自来水收费管理系统。功能至少
包括:
水费帐户的建立;
帐户初始化;
水表期末数的读取;
水费帐单的建立;
催缴通知;
水费收取与发票打印;
水费查询、统计与报表;
根据需要的其它功能。
单位和个人可在网上查询本单位或本人缴费情况和欠费情况,以及缴费历记录。
题目4银行储蓄管理系统(3人)
某储蓄所接受定期和活期储蓄业务,储户采用实名存款,需登记真实姓名,并
出具身份证号码。储户可以办理多个存折。系统除了管理存取款业务外,还应管理储蓄所每天的业务交接与对帐、扎帐业务。储蓄所每天上班前可能接受运钞车送来的现金,下班时则将所内现金送回金库,零星款项也可能留在所内。每天下班前都要盘点每个营业员准备金、收取储户的存款、支付储户的取款以及缴回的余款,以验证帐目的正确。这些比较记录除了存储数据库外,都将打印凭证,交由当事人签字后存档。储户存款依法支付扣税后利息,定期存款依照到期日计息,活期存款在每年的6 月30 日计息(以存款天数计算)。此外,某个单位可能为本单位职工在该银行办理了工资卡,应予以考虑本项业务。客户存折或卡丢失后,可以申请挂失,挂失后该帐户即被冻结,直到储户补办新折或卡后。
根据上述描述,设计并开发一个储蓄管理系统。功能至少包括:
开户、销户、挂失等管理;
存款(包括活期存款和定期存款);
取款(包括活期取款、定期到期取款和定期提前取款);
转帐(一次转帐可以从一个帐户资金转到多个帐户,一如代发工资的情况)。储户可以通过网络查询自已的帐户信息;还可以通过网络挂失。
查询、统计与报表(如查询交易历史);
其它管理功能。
题目5个人信息管理系统(3人)
设计一个个人信息管理系统,包括一下信息:
1.通讯录信息:包括通讯人姓名、联系方式、工作地点、城市、备注等。
2.备忘录信息:包括什么时间、事件、地点等。
3.日记信息:包括什么时间、天气、事件等。
4.个人财物管理:包括总收入,消费项目、消费金额、消费时间、剩余资金。系统要实现下列操作
根据相应的用户名密码,显示相应的所有记录。如果没有对应的UID或PWD和UID不对应则报错。显示用户的通讯录具体内容,可以查询联系人的资料和添加新的联系人。显示用户的日记本,供用户查阅和编写。若日记较长,窗口能显示部分信息。双击窗口能显示日记详细内容显示用户的财务信息,记录新的收支信息。计算出用户的总收入,总支出,和剩余金额。显示用户的备忘录内容,提醒用户重要事件的时间地点。用于注册新用户。若新用户的用户名已经存在,则报错。
题目6教务管理系统(3人)
背景资料:
某大学的某个学院下设若干系,每个系包含一个或几个班级,每个系有若干名教师。每个班级有若干名学生。教师每学期讲授多门课程,每门课程每学期由一名教师讲授。负责教务工作的教师的日常工作包括:
1、每学期开始时打印每个系的每个班级的基本信息(班名,入学时间,班长等)以及学生的基本状况报表,包括每个学生的基本信息(学号、姓名、性别、出生日期、照片等)和联系方式,如宿舍号,电话,E-MAIL地址等。
2、每学期重新打印一份教师名单,包含教师的基本信息,以及便于联系
等方面的信息(工作证号码、姓名、性别、出生日期、职称,职务,办公室房间号,电话号码)。假设每个教师的办公室房间号有一个,不同的教师也可以有相同的房间号。每个教师可有多个联系电话。
设计要求:
(1)进行需求分析,编写数据字典。
(2)设计E-R图。
(3)采用友好的界面对系、班级、学生、教师、课程、选课等内容进行增、删、改。
(4)具有方便的查询功能,例如,对于学生,可以按照学生的学号、姓名、年龄、性别、系别等属性的任意组合条件进行查询。同样为课程以及选课等内容进行查询。
(5)具有丰富的报表统计功能,例如,对于学生选课信息,可以进行如下报表汇总操作:
1)打印出某学生某学期所选修的全部课程的学分,学时以及成绩。
2)打印出某教师所讲授的全部课程的信息。
3)打印出某班某学期所有学生按总成绩降序列出的学号、姓名以及总成绩报表。
4)打印出各系具有的各级职称的教师人数。
5)打印出该学院所开设的各门课程的名称、学时以及先修课的名称和学时。
题目7房屋中介管理系统(3人)
背景资料:
某房屋中介公司拥有多名职员分管不同业务,公司与多名房主具有业务联系,每个房主在委托房屋中介公司进行房屋的出租或出售时都要填写一张表格,说明房屋的地址、面积、朝向、类别以及价格等相关信息。需要租住或购买房屋的客户在向中介公司寻求服务时,也需要登记需要租住或购买的房屋的细节要求。职员负责与客户约定时间,并陪同客户看房,若客户看中房屋,公司将记录客户购买或租住房屋的合同的相关信息。试为此公司设计一个数据库应用系统。
功能要求:
(1)管理公司职员的基本信息,以及所进行的业务信息,如联系客户、陪同客户看房的信息
(2)登记房屋、房主以及客户的信息,并能进行方便地增、删、改。
(3)方便房主查询所需要的房屋的查询功能。
(4)统计待租或待售的房屋信息等。
题目8产品生产与销售管理系统(3人)
背景资料:
某家具公司生产和销售多种家具产品。公司拥有多个生产家具的车间,每个车间有多名工人,负责生产多种产品。客户可在公司下设的多个销售点购买家具,所购买的家具记录在订单中,销售点根据订单向客户运送家具。请根据如上
应用环境,为该公司设计和实现一个产品生产与销售管理系统。
功能要求:
(1)记录公司的产品和工人的基本信息,并能进行方便的增、删、改。
(2)记录公司的每个销售点、客户以及每个订单的信息。
(3)对工人、产品、客户以及订单等信息进行多条件任意组合查询。
(4)统计产品的销售信息。
题目9教师工资管理系统(3人)
背景资料:
(1)某学校现有100名教职工,按职称分为教授、副教授、讲师、助教。(可根据本人所在学校实际情况确定具体名额。
(2)工资由基本工资、福利津贴和奖励工资构成,失业保险和住房公积金在工资中扣除。
(3)该学校基本工资是根据教师职称等级分配工资数额,其余无差别。
(4)每位教师的基本资料有姓名、性别、年龄、职称。
(5)工资按月发放,实际发放的工资金额为工资减去扣除。
以上信息可供参考,学员可根据本人所在学校具体情况设计。
设计要求:
(1)进行需求分析,编写数据字典。
(2)设计E-R图。
(3)实现个人的基本资料、工资和扣除金额数据的录入。
(4)计算个人的实际发放工资。
(5)按职称分类统计人数和工资金额。
(6)实现分类查询。
(7)能够删除辞职人员的数据。
题目10学生学籍管理信息系统(3人)
学生学籍管理工作包括学生档案、学籍、成绩、升学等内容的管理;面对大量的学生数据、报表,手工处理方式已经很难跟上现代化的步伐。随着计算机技术及网络通讯技术的飞速发展,许多学校已经有了较好的计算机应用甚至网络硬件建设基础。因此为提高学校管理工作的现代化、科学化水平,保证信息处理的即时化、准确化,开发一套对学生学籍进行管理的软件是极其重要的。
应完成的主要功能:(1)学生档案的管理,即录入、修改、查询、输出学生档案信息,这些信息包括学生基本情况、学生简历情况、学生奖励情况、学生处分情况、学生家庭信息、学生体检情况。(2)学生学籍管理,录入、修改、查询、输出学生学籍信息,这些信息包括学生奖贷学金情况、学生注册、学生异动情况、学生军训情况、学生毕业情况。(3)学生成绩管理,录入修改、查询、输出学生入校成绩,各学期、各门课程的成绩信息,并支持按年级、班级等条件的统计、查询、报表输出。
第三篇:数据库原理实验教案
《数据库原理》课程实验
实验1 创建数据库和数据表
一、实验目的
熟悉SQL Server Management Studio界面;掌握通过图形化向导和执行Transact-SQL语句创建数据库的方法。
二、实验环境
Windows XP操作系统,SQL Server 2005软件。
三、实验课时
2课时。
四、实验内容
SQL Server中的一个数据库必须至少包含一个数据文件和一个事务日志文件,所以创建数据库就是建立主数据文件和日志文件。
在SQL Server 2005中创建数据库的方法主要有两种:一是在SQL Server Management Studio窗口中使用可视化界面,通过方便的图形化向导创建,二是通过执行Transact-SQL语句创建。
(一)向导方式创建
1、从“开始”菜单选择“所有程序”→“Microsoft SQL Server 2005”,打开“SQL Server Management Studio”窗口,使用Windows或SQL Server身份验证建立连接。
2、在“对象资源管理器”窗格中展开服务器,选择“数据库”节点右击,从弹出的快捷菜单中选择“新建数据库”命令,打开“新建数据库”窗口。
3、该窗口中有3个页,分别是“常规”、“选项”和“文件组”,完成这3个页的内容即可完成数据库的创建。这里,我们仅设置“常规”的相应内容,其他2个页的内容按照默认设置即可。
(1)“数据库名称”文本框中输入数据库的名称,如“sample_st”,再输入该数据库的所有者,这里使用默认值即可。(也可以通过单击文本框右边的“浏览”按钮选择所有者。
(2)“数据库文件”列表中包括两行,一个是数据文件,一个是日志文件。通过单击下面相应的按钮可以添加或删除相应的数据文件。
逻辑名称:指定该文件的文件名。
文件类型:用于区别当前文件是数据文件还是日志文件。 文件组:显示当前数据库文件所属的文件组。
初始大小:指定该文件的初始容量。在SQL Server 2005中数据文件的默认值为3MB,日志文件的默认值为1MB。 自动增长:用于设置在文件容量不够用时,文件根据何种增长方式自动增长。
路径:指定存放在文件的目录。默认情况下,SQL Server 2005将存放路径设置为其安装目录下的data子目录,单击该列中的按钮可以在打开的“定位文件夹”对话框中更改数据库的存储路径。
完成上述操作后,单击“确定”按钮关闭“新建数据库”窗口,即完成了数据库的创建,可以在“对象资源管理器”窗格中看到新建的数据库。
(二)语言方式创建
SQL Server 2005使用的Transact-SQL语言是标准SQL的增强版本,使用它提供的Create Database语句同样可以完成对数据库的建立(参考内容见附录)。
1、单击“新建查询”按钮,创建一个查询输入窗口将附录中的语句复制到该窗口。选择创建数据库的命令,单击工具栏中的“分析”按钮,可以检查语法错误;单击“执行”按钮即可执行语句,在查询窗口内的“查询”窗格中可以看到“命令已成功完成”的提示消息。在“对象资源管理器”窗格中刷新,即可看到新建的数据库。
2、继续执行Create Database之后的语句,在“sample_st”数据库中用Create Table命令依次建立Student、Course和SC这三个数据表,利用Insert命令为各数据表添加数据。(参考内容见教材P84)
(三)知识巩固
仿照附录内容,用SQL-DDL语言创建“产品订购”数据库,包含四个数据表S、P、J和SPJ,表结构及内容见教材P122。
实验2 数据库的简单查询
一、实验目的
掌握单表查询中各个子句(Select、From、Where、Group、Having、Order)的用法,特别要掌握比较运算符和逻辑运算符的使用。
二、实验环境
Windows XP操作系统,SQL Server 2005软件。
三、实验课时
2课时。
四、实验内容
在已建立的数据库和数据表的基础上,用Select语句完成下列查询操作。
1、查询全体学生的学号和姓名。
select sn,sno from s
2、查询全体学生的所有基本信息(仅针对Student表)。
select * from s
3、对SC表查询全体学生的选课记录,在显示结果中为“Grade”列增加5分。select score+5 from sc
4、查询全体学生的学号和姓名,将原来的英文列名设置中文别名。select sn as 姓名,sno as 学号 from s
5、显示所有选课学生的学号,去掉重复结果。
select distinct sno from sc
6、查询成绩在80分以上的学生选课记录
select * from sc where score>80
7、查询经济系所有学生的学号和姓名。
select sn,sno from s where dept='经济系'
8、查询成绩在80~90分的学生选课记录。
select * from sc where score between 80 and 90
9、查询年龄不在22~25的学生记录。
select * from s where age not between 22 and 25
10、查询所有姓“刘”的学生记录。
select * from s where sn like'刘%'
11、查询无考试成绩(成绩为空值)的学号、课程号。5
select sno ,cno from sc where score is null
12、查询考试成绩非空值的学号、课程号。
select sno ,cno from sc where score is null
13、查询数学系年龄小于20岁的学生记录。
select * from s where dept ='数学系'and age <28
14、查询选修了“101”或“102”课程的选课记录。select * from c where cno ='101' or cno ='102'
15、查询学生总人数。
select count(sno)from s
16、查询选修了课程的学生人数。
select count(distinct sno)from sc
17、查询选修了“101”课程的学生的平均成绩。
select AVG(score)from sc
where cno='101'
18、查询学号为“01003”的学生的考试总成绩。
select sum(score)from sc
where sno=01003
19、查询“101”课程的最高分和最低分。
select max(score),MIN(score)from sc
where cno='101'
20、查询每门课程的选课人数。
select cno,COUNT(sno)from sc
group by cno
21、查询每个学生的学号、选课数、平均成绩和总成绩。
select sno,COUNT(cno)/*,AVG(score),sum(score)*/ from sc group by sno
22、查询选课数超过2的学生学号及其选课数。
select sno,COUNT(cno)from sc
group by sno
having COUNT(*)>2
23、查询所有学生信息,查询结果按年龄降序排列。(针对Student表操作)
select * from s order by AGE desc
24、查询所有学生信息,查询结果按系名升序,同系学生按年龄降序排列。
select * from s order by dept,AGE desc
25、查询选课数超过2的学生学号及其选课数,查询结果按选课数降序排列。
select sno,COUNT(cno)from sc group by sno having COUNT(*)>2 order by count(cno)desc
实验3 数据库的多表查询
一、实验目的
继续熟练SQL-SELECT语句的使用;理解多表查询的概念;掌握多表连接查询中各个子句的用法,特别要比较内连接和外连接的结果。掌握非相关子查询、相关子查询的用法,理解它们的执行过程;学会在SQL Server中用Exists实现交运算,用Not Exists实现差运算。
二、实验环境
Windows XP操作系统,SQL Server 2005软件。
三、实验课时
2课时。
四、实验内容
(一)、在已建立的数据库和数据表的基础上,用Select语句的连接查询完成下列操作。
1、查询每个学生的基本信息及其选课情况。
2、查询选修“101”课程的学生学号、姓名和成绩。
3、查询与“李平”在同一个系学习的学生记录。
4、查询与“李平”年龄相同的学生记录。
5、查询选修课程名为“数据库原理”的选课记录。
6、查询选修课程名为“数据库原理”的学生记录。
7、查询选修“101”课程且成绩≥90的学号、姓名和成绩。
8、查询“李平”的所有选课记录。
9、查询数学系学生选修的课程号,要求结果中去掉重复记录。
10、查询计算机系选修课程数≥2的学号、姓名及平均成绩,查询结果按平均成绩降序。
11、查询每个学生的学号、选修课程号、课程名及成绩。
12、查询所有学生的选修情况(包括选课和未选课的学生),要求显示学号、姓名、课程号和成绩。
(二)、在已建立的数据库和数据表的基础上,用Select语句的嵌套查询完成下列操作。
1、查询选修“101”课程且成绩≥90的学号、姓名。
2、查询“李平”的所有选课记录。
3、查询与“李平”在同一个系学习的学生记录。
4、查询与“李平”年龄相同的学生记录。
5、查询选修课程名为“数据库原理”的选课记录,输出结果包括学号和成绩。
6、查询选修课程名为“数据库原理”的学生记录,输出结果包括学号、姓名和所在系。
7、查询学号为“01003”学生的选修课程号和课程名。
8、查询没有选修“101”课程的学生学号和姓名。
9、查询选修“101”课程或“102”课程的学生姓名。
10、查询选修“101”课程和“102”课程的学生学号。
11、查询选修“101”课程但没选修“102”课程的学生学号。
12、查询没有选修任何课程的学生记录,输出结果包括学号、姓名和所在系。
13、查询数学系学生选修的课程号,要求结果中去掉重复记录。
14、查询选修课程至少包含“01003”选修课程的学生学号。实验4 数据库更新、视图定义及使用
一、实验目的
掌握Insert、Update、Delete语句的使用;对于Insert语句,要求理解默认值约束、空值约束在插入记录时所起的作用。理解视图的概念,掌握Create View、Drop View语句的使用;掌握基于视图的查询语句的使用。
二、实验环境
Windows XP操作系统,SQL Server 2005软件。
三、实验课时
2课时。
四、实验内容
(一)、在已建立的数据库和数据表的基础上,向数据库中添加一个临时表ST,其结构比Student表结构多一个score字段。用Insert语句向临时表输入数据,输入有误时用Update语句进行修改。再用三个更新语句完成下列操作。
1、向Student表添加若干新记录,内容自定。(观察已定义的表的约束情况)
2、向SC表添加新记录,内容自定,不低于10条(注意不能违反参照完整性)。
3、为临时表ST添加记录。
4、把Student表的所有行一次性地加到临时表ST中。
5、在ST表中把所有学生的成绩加2分。
6、在ST表中把所有学生的年龄增加1。
7、在ST表中把“李平”的所在系改为“计算机”。
8、在ST表中将选修课程“数据库原理”的学生成绩加2分。
9、在SC表中删除所有成绩为空值的选修记录。
10、删除计算机系选修成绩不及格的选课记录。
(二)、在已建立的数据库和数据表的基础上,完成下列操作。
1、建立数学系学生的视图MAST。
2、建立计算机系选修课程名为“数据库原理”的学生视图,视图名:CSTVIEW,该视图中应包括属性列:学号、姓名、成绩。
3、创建一个名为STSUMVIEW的视图,包括所有学生的学号和总成绩。
4、建立学生选课视图SCVIEW,包括所有学生的学号、姓名、课程号、课程名和成绩。
5、通过MAST视图查询学生基本信息。
6、通过SCVIEW查询成绩大于90分的学生的学号和成绩。
7、查询计算机系选修课程名为“数据库原理”并且成绩大于85分的学生的学号和成绩。
8、通过MAST视图将学号为“01008”学生的年龄修改为21岁。
9、通过MAST视图将学号为“01009”学生所在系改为“经济”,是否能成功执行?若不能成功请说明理由;若修改成功,请再次通过MAST视图查询学生基本信息,是否能查询到该生?若不能查询请说明理由。
10、通过SCVIEW视图将学号为“01004”学生的总成绩修改为380分,是否能成功执行?若不能成功请说明理由。
实验5 数据库的安全与保护
一、实验目的
理解SQL Server的用户与权限管理机制,掌握用对象资源管理器创建服务器登录帐号,并同时建立用户。掌握如何为给定的用户分配权限。
二、实验环境
Windows XP操作系统,SQL Server 2005软件。
三、实验课时
2课时。
四、实验内容
用户与权限管理
(1)打开“SQL Server Management Studio”窗口,使用对象资源管理器创建两个服务器登录帐号Test1和Test2,并在“sample_st”数据库中创建两个对应的同名用户。设置Test1用户和Test2用户的默认架构为guest。
(2)使用Test1身份登录,并为Test2分配创建数据表的权限;用Test2身份登录来验证权限分配成功。
(3)使用Test1身份登录,收回刚刚分配给Test2的创建数据表的权限;用Test2身份登录来验证权限回收成功。
五、实验步骤
1、使用对象资源管理器创建两个服务器登录帐号。以系统管理员身份登录SQL Server。打开“SQL Server Management Studio”窗口,在对象资源管理器列表中,打开展开“安全性”文件夹,选择“登录名”图标,单击鼠标右键,在弹出的菜单中选择“新建登录名”。在打开的对话框中依次建立Test1和Test2,选择“SQL Server身份验证”,同时还要输入密码,默认数据库为“sample_st”。
(2)在“用户映射”中列出了当前登录帐号可以选择访问的数据库如“sample_st”,在其左侧的复选框中打勾,表示当前登录帐号可以访问对应的数据库,默认用户名与登录帐号相同。
(3)单击“确定”按钮完成创建。
2、创建新的数据库用户。
在对象资源管理器中选中要访问操作的数据库,展开“安全性”文件夹,在“用户”文件夹中查找是否已建立与登录名Test1和Test2同名的数据库用户,若已建立,则在属性中修改其默认架构为guest;否则右击鼠标在菜单中选择“新建用户”选项,出现“数据库用户-新建”对话框,建立相应的用户。最后,在sample_st数据库的“安全性架构guest属性权限”中,为test1和test2用户分配相应权限。
3、用Grant、Revoke命令实现对用户的授权和收权。
4、用Create命令创建数据表验证授权和收权是否成功。
5、以系统管理员身份登录SQL Server。使用:“GRANT SELECT ON SC TO Test1 WITH GRANT OPTION”命令,再分别以Test1和Test2身份登录,进行授权及查询数据表,验证“WITH GRANT OPTION”能否成功执行。
6、以系统管理员身份使用“REVOKE”命令回收上述授权。
实验6 数据库的完整性
一、实验目的
通过实验掌握数据库完整性概念,掌握利用SQL Server 2005实现数据库完整性的基本方法和步骤。
二、实验环境
Windows XP操作系统,SQL Server 2005软件。
三、实验课时
2课时。
四、实验内容
1、建立关系模式。
完成教材P164第6题,用SQL语言定义“职工”和“部门”两个关系模式: 职工(职工号,姓名,年龄,职务,工资,部门号),职工号为主码 部门(部门号,名称,经理名,电话), 部门号为主码 要求在模式中完成以下完整性约束条件的定义:(1)定义每个模式的主码;(2)定义参照完整性;
(3)定义职工年龄不得超过60岁;(4)定义部门名称必须取值唯一。
2、验证完整性约束。
使用Insert Values语句向两个表中各插入5~10条记录,对下列内容进行验证。(1)验证主键约束:“职工”和“部门”两个表中是否能接受主码值相同的记录,通过实例验证。
(2)验证唯一约束:“部门”表中是否能接受名称相同的两个不同记录?为什么?
(3)验证检查约束:“职工”表中能否接受年龄不满足条件的记录?为什么?
(4)验证参照完整性:若“部门”表中不存在部门号为“008”的记录,是否能在“职工”表中插入部门号为“008”的职工记录?若删除“001”部门的所有信息,正确的操作步骤是什么?
实验7 数据库设计实验
一、实验目的
通过实验掌握数据库设计的基本方法和步骤。
二、实验环境
Windows XP操作系统,SQL Server 2005软件。
三、实验课时
2课时。
四、实验内容
1、选定实验题目,为某个单位或部门设计数据库应用系统,比如:学生成绩管理、机房上机管理、职工档案管理、商品库存管理、图书管理、工资管理等。
2、根据选定的题目进行需求分析,重点分析数据需求和功能需求。
3、概念结构设计:画出E-R图。
4、逻辑结构设计:设计数据库和数据表的具体结构,指出各表的属性名称、数据类型;说明各表的主码及表之间的关联情况;说明本设计是否已达到3NF要求。
5、简要评价系统设计的优点和不足。
五、实验要求
1、提交设计报告,涵盖实验内容的全部信息,不低于1000字。
2、提交建立应用系统数据库的代码,所有数据表中的记录总数不低于50条。(请参照实验2的附录建立数据库)
实验8 存储过程实验
一、实验目的
通过实验熟悉使用存储过程进行数据库应用程序设计的方法
二、实验环境
Windows XP操作系统,SQL Server 2005软件。
三、实验课时
2课时。
四、实验内容
对sample_st数据库,编写存储过程,完成下面功能
1、统计任意一门课程的平均成绩
2、统计所有课程的平均成绩
3、统计任意一门课程的成绩分布情况,即按照分数段统计人数(即<60、60-69、70-79、80-89、90以上)
第四篇:数据库原理实验教案
《数据库原理》课程实验
实验1 创建数据库和数据表
一、实验目的
熟悉SQL Server Management Studio界面;掌握通过图形化向导和执行Transact-SQL语句创建数据库的方法。
二、实验环境
Windows XP操作系统,SQL Server 2005软件。
三、实验课时
2课时。
四、实验内容
SQL Server中的一个数据库必须至少包含一个数据文件和一个事务日志文件,所以创建数据库就是建立主数据文件和日志文件。
在SQL Server 2005中创建数据库的方法主要有两种:一是在SQL Server Management Studio窗口中使用可视化界面,通过方便的图形化向导创建,二是通过执行Transact-SQL语句创建。
(一)向导方式创建
1、从“开始”菜单选择“所有程序”→“Microsoft SQL Server 2005”,打开“SQL Server Management Studio”窗口,使用Windows或SQL Server身份验证建立连接。
2、在“对象资源管理器”窗格中展开服务器,选择“数据库”节点右击,从弹出的快捷菜单中选择“新建数据库”命令,打开“新建数据库”窗口。
3、该窗口中有3个页,分别是“常规”、“选项”和“文件组”,完成这3个页的内容即可完成数据库的创建。这里,我们仅设置“常规”的相应内容,其他2个页的内容按照默认设置即可。
(1)“数据库名称”文本框中输入数据库的名称,如“sample_st”,再输入该数据库的所有者,这里使用默认值即可。(也可以通过单击文本框右边的“浏览”按钮选择所有者。
(2)“数据库文件”列表中包括两行,一个是数据文件,一个是日志文件。通过单击下面相应的按钮可以添加或删除相应的数据文件。
逻辑名称:指定该文件的文件名。
文件类型:用于区别当前文件是数据文件还是日志文件。 文件组:显示当前数据库文件所属的文件组。
初始大小:指定该文件的初始容量。在SQL Server 2005中数据文件的默认值为3MB,日志文件的默认值为1MB。 自动增长:用于设置在文件容量不够用时,文件根据何种增长方式自动增长。
路径:指定存放在文件的目录。默认情况下,SQL Server 2005将存放路径设置为其安装目录下的data子目录,单击该列中的按钮可以在打开的“定位文件夹”对话框中更改数据库的存储路径。
完成上述操作后,单击“确定”按钮关闭“新建数据库”窗口,即完成了数据库的创建,可以在“对象资源管理器”窗格中看到新建的数据库。
(二)语言方式创建
SQL Server 2005使用的Transact-SQL语言是标准SQL的增强版本,使用它提供的Create Database语句同样可以完成对数据库的建立(参考内容见附录)。
1、单击“新建查询”按钮,创建一个查询输入窗口将附录中的语句复制到该窗口。选择创建数据库的命令,单击工具栏中的“分析”按钮,可以检查语法错误;单击“执行”按钮即可执行语句,在查询窗口内的“查询”窗格中可以看到“命令已成功完成”的提示消息。在“对象资源管理器”窗格中刷新,即可看到新建的数据库。
2、继续执行Create Database之后的语句,在“sample_st”数据库中用Create Table命令依次建立Student、Course和SC这三个数据表,并建立各自的约束及它们之间的联系(外键),利用Insert命令为各数据表添加数据。
(三)知识巩固
用SQL-DDL语言创建“产品订购”数据库,包含四个数据表S、P、J和SPJ,表结构及内容见教材P122。
实验2 数据库的简单查询
一、实验目的
掌握单表查询中各个子句(Select、From、Where、Group、Having、Order)的用法,特别要掌握比较运算符和逻辑运算符的使用。
二、实验环境
Windows XP操作系统,SQL Server 2005软件。
三、实验课时
2课时。
四、实验内容
在已建立的数据库和数据表的基础上,用Select语句完成下列查询操作。
1、查询全体学生的学号和姓名。
2、查询全体学生的所有基本信息(仅针对Student表)。
3、对SC表查询全体学生的选课记录,在显示结果中为“Grade”列增加5分。
4、查询全体学生的学号和姓名,将原来的英文列名设置中文别名。
5、显示所有选课学生的学号,去掉重复结果。
6、查询成绩在80分以上的学生选课记录。
7、查询经济系所有学生的学号和姓名。
8、查询成绩在80~90分的学生选课记录。
9、查询年龄不在22~25的学生记录。
10、查询所有姓“刘”的学生记录。
11、查询无考试成绩(成绩为空值)的学号、课程号。
12、查询考试成绩非空值的学号、课程号。
13、查询数学系年龄小于20岁的学生记录。
14、查询选修了“101”或“102”课程的选课记录。
15、查询学生总人数。
16、查询选修了课程的学生人数。
17、查询选修了“101”课程的学生的平均成绩。
18、查询学号为“01003”的学生的考试总成绩。
19、查询“101”课程的最高分和最低分。20、查询每门课程的选课人数。
21、查询每个学生的学号、选课数、平均成绩和总成绩。
22、查询选课数超过2的学生学号及其选课数。
23、查询所有学生信息,查询结果按年龄降序排列。(针对Student表操作)
24、查询所有学生信息,查询结果按系名升序,同系学生按年龄降序排列。
25、查询选课数超过2的学生学号及其选课数,查询结果按选课数降序排列。
实验3 数据库的多表查询
一、实验目的
继续熟练SQL-SELECT语句的使用;理解多表查询的概念;掌握多表连接查询中各个子句的用法,特别要比较内连接和外连接的结果。掌握非相关子查询、相关子查询的用法,理解它们的执行过程;学会在SQL Server中用Exists实现交运算,用Not Exists实现差运算。
二、实验环境
Windows XP操作系统,SQL Server 2005软件。
三、实验课时
2课时。
四、实验内容
(一)、在已建立的数据库和数据表的基础上,用Select语句的连接查询完成下列操作。
1、查询每个学生的基本信息及其选课情况。
2、查询选修“101”课程的学生学号、姓名和成绩。
3、查询与“李平”在同一个系学习的学生记录。
4、查询与“李平”年龄相同的学生记录。
5、查询选修课程名为“数据库原理”的选课记录。
6、查询选修课程名为“数据库原理”的学生记录。
7、查询选修“101”课程且成绩≥90的学号、姓名和成绩。
8、查询“李平”的所有选课记录。
9、查询数学系学生选修的课程号,要求结果中去掉重复记录。
10、查询计算机系选修课程数≥2的学号、姓名及平均成绩,查询结果按平均成绩降序。
11、查询每个学生的学号、选修课程号、课程名及成绩。
12、查询所有学生的选修情况(包括选课和未选课的学生),要求显示学号、姓名、课程号和成绩。
(二)、在已建立的数据库和数据表的基础上,用Select语句的嵌套查询完成下列操作(含EXISTS量词)。
1、查询选修“101”课程且成绩≥90的学号、姓名。
2、查询“李平”的所有选课记录。
3、查询与“李平”在同一个系学习的学生记录。
4、查询与“李平”年龄相同的学生记录。
5、查询选修课程名为“数据库原理”的选课记录,输出结果包括学号和成绩。
6、查询选修课程名为“数据库原理”的学生记录,输出结果包括学号、姓名和所在系。
7、查询学号为“01003”学生的选修课程号和课程名。
8、查询没有选修“101”课程的学生学号和姓名。
9、查询选修“101”课程或“102”课程的学生姓名。
10、查询选修“101”课程和“102”课程的学生学号。
11、查询选修“101”课程但没选修“102”课程的学生学号。
12、查询没有选修任何课程的学生记录,输出结果包括学号、姓名和所在系。
13、查询数学系学生选修的课程号,要求结果中去掉重复记录。
14、查询选修课程至少包含“01003”选修课程的学生学号。实验4 数据库更新、视图定义及使用
一、实验目的
掌握Insert、Update、Delete语句的使用;对于Insert语句,要求理解默认值约束、空值约束在插入记录时所起的作用。理解视图的概念,掌握Create View、Drop View等语句的使用;掌握基于视图的查询语句的使用。
二、实验环境
Windows XP操作系统,SQL Server 2005软件。
三、实验课时
2课时。
四、实验内容
(一)、在已建立的数据库和数据表的基础上,向数据库中添加一个临时表ST(sno,sname,dept,sage,cno,cname,score)。用Insert语句向临时表输入数据,输入有误时用Update语句进行修改。再用三个更新语句完成下列操作。
1、向Student表添加若干新记录,内容自定。(观察已定义的表的约束情况)
2、向SC表添加新记录,内容自定,不低于10条(注意不能违反参照完整性)。
3、为临时表ST添加记录。
4、把Student表的所有行及其对应的选课一次性地加到临时表ST中。
5、在ST表中把所有学生的成绩加2分。
6、在ST表中把所有学生的年龄增加1。
7、在ST表中把“李平”的所在系改为“计算机”。
8、在ST表中将选修课程“数据库原理”的学生成绩加2分。
9、在SC表中删除所有成绩为空值的选修记录。
10、删除计算机系选修成绩不及格的选课记录。
(二)、在已建立的数据库和数据表的基础上,完成下列操作。
1、建立数学系学生的视图MAST。
2、建立计算机系选修课程名为“数据库原理”的学生视图,视图名:CSTVIEW,该视图中应包括属性列:学号、姓名、成绩。
3、创建一个名为STSUMVIEW的视图,包括所有学生的学号和总成绩。
4、建立学生选课视图SCVIEW,包括所有学生的学号、姓名、课程号、课程名和成绩。
5、通过MAST视图查询学生基本信息。
6、通过SCVIEW查询成绩大于90分的学生的学号和成绩。
7、查询计算机系选修课程名为“数据库原理”并且成绩大于85分的学生的学号和成绩。
8、通过MAST视图将学号为“01008”学生的年龄修改为21岁。
9、通过MAST视图将学号为“01009”学生所在系改为“经济”,是否能成功执行?若不能成功请说明理由;若修改成功,请再次通过MAST视图查询学生基本信息,是否能查询到该生?若不能查询请说明理由。
10、通过SCVIEW视图将学号为“01004”学生的总成绩修改为380分,是否能成功执行?若不能成功请说明理由。
实验5 数据库的安全与保护
一、实验目的
理解SQL Server的用户与权限管理机制,掌握用对象资源管理器创建服务器登录帐号,并同时建立用户。掌握如何为给定的用户分配权限。
二、实验环境
Windows XP操作系统,SQL Server 2005软件。
三、实验课时
2课时。
四、实验内容
用户与权限管理
(1)打开“SQL Server Management Studio”窗口,使用对象资源管理器创建两个服务器登录帐号Test1和Test2,并在“sample_st”数据库中创建两个对应的同名用户。设置Test1用户和Test2用户的默认架构为guest。
(2)使用Test1身份登录,并为Test2分配创建数据表的权限;用Test2身份登录来验证权限分配成功。
(3)使用Test1身份登录,收回刚刚分配给Test2的创建数据表的权限;用Test2身份登录来验证权限回收成功。
五、实验步骤
1、使用对象资源管理器创建两个服务器登录帐号。以系统管理员身份登录SQL Server。打开“SQL Server Management Studio”窗口,在对象资源管理器列表中,打开展开“安全性”文件夹,选择“登录名”图标,单击鼠标右键,在弹出的菜单中选择“新建登录名”。在打开的对话框中依次建立Test1和Test2,选择“SQL Server身份验证”,同时还要输入密码,默认数据库为“sample_st”。
(2)在“用户映射”中列出了当前登录帐号可以选择访问的数据库如“sample_st”,在其左侧的复选框中打勾,表示当前登录帐号可以访问对应的数据库,默认用户名与登录帐号相同。
(3)单击“确定”按钮完成创建。
2、创建新的数据库用户。
在对象资源管理器中选中要访问操作的数据库,展开“安全性”文件夹,在“用户”文件夹中查找是否已建立与登录名Test1和Test2同名的数据库用户,若已建立,则在属性中修改其默认架构为guest;否则右击鼠标在菜单中选择“新建用户”选项,出现“数据库用户-新建”对话框,建立相应的用户。
3、用Grant、Revoke命令实现对用户的授权和收权。
4、用Create命令创建数据表验证授权和收权是否成功。
5、以系统管理员身份登录SQL Server。使用:“GRANT SELECT ON SC TO Test1 WITH GRANT OPTION”命令,再分别以Test1和Test2身份登录,进行授权及查询数据表,验证“WITH GRANT OPTION”能否成功执行。
6、以系统管理员身份使用“REVOKE”命令回收上述授权。
实验6 数据库的事务及并发控制
一、实验目的
通过实验加深学生对事务的基本概念理解语掌握;加深学生对并发控制的基本概念理解,认识不正确的并发控制所带来的危害;加深学生对锁的基本概念的掌握与理解,认识锁带来的问题;
二、实验环境
Windows XP操作系统,SQL Server 2005软件。
三、实验课时
2课时。
四、实验内容
1、事务的控制
数据准备:执行如下命令Select * into ##temp from student,将student的数据倒入到##temp表中。 启动事务,执行删除后,回滚事务
选择##temp的数据,察看记录总数 显式启动事务 删除##temp表的数据
选择##temp数据,察看记录总数 回滚事务
选择##temp数据,察看记录总数
启动事务,执行删除后,提交事务
选择##temp数据,察看记录总数 显式启动事务 删除##temp表的数据
选择##temp的数据,察看记录总数 回滚事务
选择##temp数据,察看记录总数
比较这两次执行效果的差异,为什么会有这些差异?
2、事务的隔离级别试验
数据准备:执行如下命令Select * into ##temp from student,将student的数据倒入到##temp表中。 脏读
启动两个分析器,分别叫(A,B)
在A中,选择##temp表中数据,察看记录总数 在A中,显式启动事务 在A中,删除##temp表的数据
在B中,将事务隔离级别设为UNCOMMITTED 在该查询分析器中选择##temp表数据,察看记录总数 回到先前窗口,回滚事务 选择##temp数据,察看记录总数 再次切查询分析器窗口
选择##temp数据,察看记录总数 观察结果,为什么会有这些现象? 不可重复读
启动两个分析器,分别叫(A,B)
在A中,显式启动事务,察看dept = 'math'的记录(注意地址中的数据)
在B中,显式启动事务,察看dept = 'math'的记录。在B中,将dept = 'math’地址更新为’AAAAAA’
在B中,再次察看dept = 'math'的记录。在B中,提交事务 在A中,再次察看dept = 'math'的记录。 在A中,提交事务
观察结果,为什么会有这些现象? 丢失修改
启动两个查询分析器,分别叫(A,B)
在A中,显式启动事务,察看dept = 'math'的记录(注意地址中的数据)
在B中,显式启动事务,察看dept = 'math'的记录。 在B中,将dept = 'math’地址更新为’AAAAAA’ 在B中,再次察看dept = 'math'的记录。 在B中,提交事务
在A中,再次察看dept = 'math'的记录。 在A中,将dept = 'math’地址更新为’BBBBBB’ 在A中,提交事务
在A,B窗口分别察看dept = 'math’的记录,结果如何? 锁的模拟
启动两个分析器,分别叫(A,B)
在A中,显式启动事务,察看dept = 'math'的记录 在B中,显式启动事务,察看dept = 'math'的记录 在B中,将dept = 'math’地址更新为’AAAAAA’ 在A中,将dept = 'math’地址更新为’BBBBBB’ 观察A窗口的结果,为什么?
事务隔离级别设置:set transaction isolation level {read committed, read uncommitted, repeatable read, serializable}
实验7 数据库设计实验
一、实验目的
通过实验掌握数据库设计的基本方法和步骤。
二、实验环境
Windows XP操作系统,SQL Server 2005软件。
三、实验课时
2课时。
四、实验内容
1、选定实验题目,为某个单位或部门设计数据库应用系统,比如:学生成绩管理、机房上机管理、职工档案管理、商品库存管理、图书管理、工资管理等。
2、根据选定的题目进行需求分析,重点分析数据需求和功能需求。
3、概念结构设计:画出E-R图。步骤如下:
(1)设计局部E-R图。设计依据是需求分析阶段的DFD/DD。主要内容是确定实体集合、联系、属性及主关键字
(2)集成局部E-R图。集成时要解决冲突和冗余等问题。(3)合并局部E-R图。合并局部E-R图中相同部分,尽可能的保留特殊部分,删除冗余部分,用累加的方式集成若干个局部E-R图。
(4)优化全局E-R图,得到最佳的全局E-R图方案。
4、逻辑结构设计:设计数据库和数据表的具体结构,指出各表的属性名称、数据类型;说明各表的主码及表之间的关联情况;说明本设计是否已达到3NF要求。
5、简要评价系统设计的优点和不足。
五、实验要求
1、提交设计报告,涵盖实验内容的全部信息,不低于1000字。
2、提交建立应用系统数据库的代码,所有数据表中的记录总数不低于50条。
实验8 存储过程实验
一、实验目的
通过实验熟悉使用存储过程进行数据库应用程序设计的方法
二、实验环境
Windows XP操作系统,SQL Server 2005软件。
三、实验课时
2课时。
四、实验内容
对sample_st数据库,编写存储过程,完成下面功能
1、统计任意一门课程的平均成绩
2、统计所有课程的平均成绩
3、统计任意一门课程的成绩分布情况,即按照分数段统计人数(即<60、60-69、70-79、80-89、90以上)
第五篇:数据库编程总结(推荐)
数据库编程总结
当前各种主流数据库有很多,包括Oracle, MS SQL Server, Sybase, Informix, MySQL, DB2, Interbase / Firebird, PostgreSQL, SQLite, SAP/DB, TimesTen, MS ACCESS等等。数据库编程是对数据库的创建、读写等一列的操作。数据库编程分为数据库客户端编程与数据库服务器端编程。数据库客户端编程主要使用ODBC API、ADO、ADO.NET、OCI、OTL等方法;数据库服务端编程主要使用OLE DB等方法。数据库编程需要掌握一些访问数据库技术方法,还需要注意怎么设计高效的数据库、数据库管理与运行的优化、数据库语句的优化。
一、访问数据库技术方法
数据库编程分为数据库客户端编程与数据库服务器端编程。数据库客户端编程主要使用ODBC API、ADO、ADO.NET、OCI、OTL等方法;数据库服务端编程主要使用OLE DB等方法。
1、几种是数据库访问方法比较
ODBC
API是一种适合数据库底层开发的编程方法,ODBC
API提供大量对数据源的操作,ODBC
API能够灵活地操作游标,支持各种帮定选项,在所有ODBC相关编程中,API编程具有最高的执行速度。DAO提供了很好的数据库编程的对象模型.但是,对数据库的所有调用以及输出的数据都必须通过Access/Jet数据库引擎,这对于使用数据库应用程序,是严重的瓶颈。
OLE
DB提供了COM接口,与传统的数据库接口相比,有更好的健壮性和灵活性,具有很强的错误处理能力,能够同非关系数据源进行通信。
ADO最主要的优点在于易于使用、速度快、内存支出少和磁盘遗迹小。
ADO.NET 是利用数据集的概念将数据库数据读入内存中,然后在内存中对数据进行操作,最后将数据集数据回写到源数据库中。
OTL 是 Oracle, Odbc and DB2-CLI Template Library 的缩写,是一个C++编译中操控关系数据库的模板库,OTL中直接操作Oracle主要是通过Oracle提供的OCI接口进行,进行操作DB2数据库则是通过CLI接口来进行,至于MS的数据库和其它一些数据库,则OTL只提供了ODBC来操作的方式。当然Oracle和DB2也可以由OTL间接使用ODBC的方式来进行操纵。具有以下优点:跨平台;运行效率高,与C语言直接调用API相当;开发效率高,起码比ADO.net使用起来更简单,更简洁;部署容易,不需要ADO组件,不需要.net framework 等。
2、VC数据库编程几种方法
VC数据库编程几种方法,包括ODBC连接、MFC
ODBC连接、DAO连接、OLE
DB、OLE
DB
Templates连接、ADO、Oracle专用方法(OCI(Oracle
Call
Interface)访问、Oracle
Object
OLE
C++
Class
Library)。
<1.>通用方法
1.ODBC连接
ODBC(Open
DataBase
Connectivity)是MSOA的一部分,是一个标准数据库接口。它提供对关系数据库访问的统一接口,实现对异构数据源的一致访问。ODBC数据访问由以下部分组成:
<1>句柄(Handles):ODBC使用句柄来标识ODBC环境、连接、语句和描述器.<2>缓存区(Buffers):
<3>数据类型(Data
types)
<4>一致性级别(Conformance
levels)
用ODBC设计客户端的一般步骤:
<1>分配ODBC环境
<2>分配连接句柄
<3>连接数据源
<4>构造和执行SQL语句
<5>获得查询结果
<6>断开数据源的连接
<7>释放ODBC环境
ODBC
API是一种适合数据库底层开发的编程方法,ODBC
API提供大量对数据源的操作,ODBC
API能够灵活地操作游标,支持各种帮定选项,在所有ODBC相关编程中,API编程具有最高的执行速度.因此,ODBC
API编程属于底层编程。
2.MFC
ODBC连接
MFC
ODBC是MFC对ODBC进行的封装,以简化对ODBC
API的 调用,从而实现面向对象的数据库编程接口.MFC
ODBC的封装主要开发了CDatabase类和CRecordSet类
(1)CDatabase类
CDatabase类用于应用程序建立同数据源的连接。CDatabase类中包含一个m_hdbc变量,它代表了数据源的连接句柄。如果要建立CDatabase类的实例,应先调用该类的构造函数,再调用Open函数,通过调用,初始化环境变量,并执行与数据源的连接。在通过Close函数关闭数据源。
CDatabase类提供了对数据库进行操作的函数及事务操作。
(2)CRecordSet类
CRecordSet类定义了从数据库接收或者发送数据到数据库的成员变量,以实现对数据集的数据操作。
CRecordSet类的成员变量m_hstmt代表了定义该记录集的SQL语句句柄,m_nFields为记录集中字段的个数,m_nParams为记录集所使用的参数个数。
CRecordSet的记录集通过CDatabase实例的指针实现同数据源的连接,即CRecordSet的成员变量m_pDatabase.MFC
ODBC编程更适合于界面型数据库应用程序的开发,但由于CDatabase类和CRecordSet类提供的数据库操作函数有限,支持的游标类型也有限,限制了高效的数据库开发。在编程层次上属于高级编程。
应用实例: 1.打开数据库
CDatabase database;
database.OpenEx(_T(“DSN=zhuxue”),CDatabase::noOdbcDialog);//zhuxue为数据源名称
2.关联记录集
CRecordset recset(&database);
3.查询记录
CString sSql1=“";
sSql1 = ”SELECT * FROM tablename“;
recset.Open(CRecordset::forwardOnly, sSql1, CRecordset::readOnly);
int ti=0;
CDBVariant var;//var可以转换为其他类型的值
while(!recset.IsEOF())
{
//读取Excel内部数值
recset.GetFieldValue(”id“,var);
jiangxiang[ti].id=var.m_iVal;
recset.GetFieldValue(”name“, jiangxiang[ti].name);
ti++;
recset.MoveNext();
}
recset.Close();//关闭记录集
4.执行sql语句
CString sSql=”“;
sSql+=”delete * from 院系审核“;//清空表
database.ExecuteSQL(sSql);
sSql也可以为Insert ,Update等语句
5.读取字段名
sSql = ”SELECT * FROM Sheet1“;
//读取的文件有Sheet1表的定义,或为本程序生成的表.// 执行查询语句
recset.Open(CRecordset::forwardOnly, sSql, CRecordset::readOnly);
int excelColCount=recset.GetODBCFieldCount();//列数
CString excelfield[30];
//得到记录集的字段集合中的字段的总个数
for(i=0;i { CODBCFieldInfo fieldinfo; recset.GetODBCFieldInfo(i,fieldinfo); excelfield[i].name =fieldinfo.m_strName;//字段名 } 6.打开excel文件 CString sDriver = ”MICROSOFT EXCEL DRIVER(*.XLS)“;// Excel安装驱动 CString sSql,sExcelFile;//sExcelFile为excel的文件路径 TRY { // 创建进行存取的字符串 sSql.Format(”DRIVER={%s};DSN='';FIRSTROWHASNAMES=1;READONLY=FALSE;CREATE_DB=/“%s/”;DBQ=%s“,sDriver, sExcelFile, sExcelFile); // 创建数据库(既Excel表格文件) if(database.OpenEx(sSql,CDatabase::noOdbcDialog)) { //可以把excel作为一个数据库操作 } } catch(e) { TRACE1(”Excel驱动没有安装: %s“,sDriver); AfxMessageBox(”读取失败,请检查是否定义数据区Sheet1“); } 3.DAO连接 DAO(Data Access Object)是一组Microsoft Access/Jet数据库引擎的COM自动化接口.DAO直接与Access/Jet数据库通信.通过Jet数据库引擎,DAO也可以同其他数据库进行通信。DAO还封装了Access数据库的结构单元,通过DAO可以直接修改Access数据库的结构,而不必使用SQL的数据定义语言(DDL)。 DAO的体系结构如下: DAO封装的类: (1)CdaoWorkspace:对DAO工作区(数据库处理事务管理器)的封装 (2)CdaoDatabase:对DAO数据库对象的封装,负责数据库连接.(3)CdaoRecordset:对DAO记录集对象的封装,代表所选的一组记录.(4)CdaoTableDef:对表定义对象的封装,代表基本表或附加表定义.(5)CdaoQueryDef:对查询对象的封装,包含所有查询的定义.(6)CdaoException:DAO用于接收数据库操作异常的类.(7)CDaoFieldExchange DAO提供了很好的数据库编程的对象模型.但是,对数据库的所有调用以及输出的数据都必须通过Access/Jet数据库引擎,这对于使用数据库应用程序,是严重的瓶颈。 DAO相对于ODBC来说,属于高层的数据库接口.4.OLE DB连接 OLE DB对ODBC进行了两方面的扩展:一是提供了数据库编程的OLE接口即COM,二是提供了一个可用于关系型和非关系型数据源的接口。 OLE DB提供了COM接口,与传统的数据库接口相比,有更好的健壮性和灵活性,具有很强的错误处理能力,能够同非关系数据源进行通信。 与ODBC API一样,OLE DB也属于底层的数据库编程接口,OLE DB结合了ODBC对关系数据库的操作功能,并进行扩展,可以访问非关系数据库。 OLE DB访问数据库的原理如下: OLE DB程序结构: OLE DB由客户(Consumer)和服务器(Provider)。客户是使用数据的应用程序,它通过OLE DB接口对数据提供者的数据进行访问和控制。OLE DB服务器是提供OLE DB接口的软件组件。根据提供的内容可以分为数据提供程序(Data Provider)和服务提供程序(Service Provider)。 程序结构原理图如下: <1>数据提供程序 数据提供程序拥有自己的数据并把数据以表格的形式呈现给使用者使用.<2>服务提供程序 服务提供程序是数据提供程序和使用者的结合。它是OLE DB体系结构中的中间件,它是OLE DB数据源的使用者和数据使用程序的提供者 <3>数据使用程序 数据使用程序对存储在数据提供程序中的数据进行使用和控制.OLE DB开发程序的一般步骤: <1>初始化COM环境 <2>连接数据源 <3>打开对话 <4>执行命令 <5>处理结果 <6>清除对象 应用实例: 使用OLEDB编写数据库应用程序 1 概述 OLE DB的存在为用户提供了一种统一的方法来访问所有不同种类的数据源。OLE DB可以在不同的数据源中进行转换。利用OLE DB,客户端的开发人员在进行数据访问时只需把精力集中在很少的一些细节上,而不必弄懂大量不同数据库的访问协议。OLE DB是一套通过COM接口访问数据的ActiveX接口。这个OLE DB接口相当通用,足以提供一种访问数据的统一手段,而不管存储数据所使用的方法如何。同时,OLE DB还允许开发人员继续利用基础数据库技术的优点,而不必为了利用这些优点而把数据移出来。 使用ATL使用OLE DB数据使用程序 由于直接使用OLE DB的对象和接口设计数据库应用程序需要书写大量的代码。为了简化程序设计,Visual C++提供了ATL模板用于设计OLE DB数据应用程序和数据提供程序。利用ATL模板可以很容易地将OLE DB与MFC结合起来,使数据库的参数查询等复杂的编程得到简化。MFC提供的数据库类使OLE DB的编程更具有面向对象的特性。Viual C++所提供用于OLE DB的ATL模板可分为数据提供程序的模板和数据使用程序的模板。 使用ATL模板创建数据应用程序一般有以下几步骤: 1)、创建应用框架 2)、加入ATL产生的模板类 3)、在应用中使用产生的数据访问对象3 不用ATL使用OLE DB数据使用程序 利用ATL模板产生数据使用程序较为简单,但适用性不广,不能动态适应数据库的变化。下面我们介绍直接使用MFC OLE DB类来生成数据使用程序。模板的使用 OLE DB数据使用者模板是由一些模板组成的,包括如下一些模板,下面对一些常用类作一些介绍。1)、会话类 CDataSource类 CDataSource类与OLE DB的数据源对象相对应。这个类代表了OLE DB数据提供程序和数据源之间的连接。只有当数据源的连接被建立之后,才能产生会话对象,可以调用Open来打开数据源的连接。CSession类 CSession所创建的对象代表了一个单独的数据库访问的会话。一个用CDataSource类产生的数据源对象可以创建一个或者多个会话,要在数据源对象上产生一个会话对象,需要调用函数Open()来打开。同时,会话对象还可用于创建事务操作。 CEnumeratorAccessor类 CEnumeratorAccessor类是用来访问枚举器查询后所产生的行集中可用数据提供程序的信息的访问器,可提供当前可用的数据提供程序和可见的访问器。2)、访问器类 CAcessor类 CAccessor类代表与访问器的类型。当用户知道数据库的类型和结构时,可以使用此类。它支持对一个行集采用多个访问器,并且,存放数据的缓冲区是由用户分配的。CDynamicAccessor类 CDynamicAccessor类用来在程序运行时动态的创建访问器。当系统运行时,可以动态地从行集中获得列的信息,可根据此信息动态地创建访问器。CManualAccessor类 CManualAccessor类中以在程序运行时将列与变量绑定或者是将参数与变量捆定。3)、行集类 CRowSet类 CRowSet类封装了行集对象和相应的接口,并且提供了一些方法用于查询、设置数据等。可以用Move()等函数进行记录移动,用GetData()函数读取数据,用Insert()、Delete()、SetData()来更新数据。CBulkRowset类 CBulkRowset类用于在一次调用中取回多个行句柄或者对多个行进行操作。CArrayRowset类 CArrayRowset类提供用数组下标进行数据访问。4)、命令类 CTable类 CTable类用于对数据库的简单访问,用数据源的名称得到行集,从而得到数据。CCommand类 CCommand类用于支持命令的数据源。可以用Open()函数来执行SQL命令,也可以Prepare()函数先对命令进行准备,对于支持命令的数据源,可以提高程序的灵活性和健壮性。 在stdafx.h头文件里,加入如下代码。#include 在打开数据源,会话,行集对象后就可以获取数据了。所获取的数据类型取决于所用的存取程序,可能需要绑定列。按以下步骤。 1、用正确的命令打开行集对象。 2、如果使用CManualAccessor,在使用之前与相应列进行绑定。要绑定列,可以用函数GetColumnInfo,如下所示: // Get the column information ULONG ulColumns = 0;DBCOLUMNINFO* pColumnInfo = NULL;LPOLESTR pStrings = NULL;if(rs.GetColumnInfo(&ulColumns, &pColumnInfo, &pStrings)!= S_OK)AfxThrowOLEDBException(rs.m_pRowset, IID_IColumnsInfo);struct MYBIND* pBind = new MYBIND[ulColumns];rs.CreateAccessor(ulColumns, &pBind[0], sizeof(MYBIND)*ulColumns);for(ULONG l=0;l 3、用while循环来取数据。在循环中,调用MoveNext来测试光标的返回值是否为S_OK,如下所示: while(rs.MoveNext()== S_OK){ // Add code to fetch data here // If you are not using an auto accessor, call rs.GetData()} 4、在while循环内,可以通过不同的存取程序获取数据。1)如果使用的是CAccessor类,可以通过使用它们的数据成员进行直接访问。如下所示: 2)如果使用的是CDynamicAccessor 或CDynamicParameterAccessor 类,可以通过GetValue或GetColumn函数来获取数据。可以用GetType来获取所用数据类型。如下所示: while(rs.MoveNext()== S_OK){ // Use the dynamic accessor functions to retrieve your // data ULONG ulColumns = rs.GetColumnCount(); for(ULONG i=0;i { rs.GetValue(i); } } 3)如果使用的是CManualAccessor,可以指定自己的数据成员,绑定它们。就可以直接存取。如下所示: while(rs.MoveNext()== S_OK){ // Use the data members you specified in the calls to // AddBindEntry.wsprintf(”%s“, szFoo);} 决定行集的数据类型 在运行时决定数据类型,要用动态或手工的存取程序。如果用的是手工存取程序,可以用GetColumnInfo函数得到行集的列信息。从这里可以得到数据类型。4 总结 由于现在有多种数据源,想要对这些数据进行访问管理的唯一途径就是通过一些同类机制来实现,如OLE DB。高级OLE DB结构分成两部分:客户和提供者。客户使用由提供者生成的数据。 就像其它基于COM的多数结构一样,OLE DB的开发人员需要实现很多的接口,其中大部分是模板文件。 当生成一个客户对象时,可以通过ATL对象向导指向一个数据源而创建一个简单的客户。ATL对象向导将会检查数据源并创建数据库的客户端代理。从那里,可以通过OLE DB客户模板使用标准的浏览函数。 当生成一个提供者时,向导提供了一个很好的开端,它们仅仅是生成了一个简单的提供者来列举某一目录下的文件。然后,提供者模板包含了OLE DB支持的完全补充内容。在这种支持下,用户可以创建OLE DB提供者,来实现行集定位策略、数据的读写以及建立书签。应用案例: Visual C++中使用OLE DB读写SQL Server 在需要对数据库进行操作时,OLE DB总是被认为是一种效率最高但最难的方法。但是以我最近使用OLE DB的经验看来,OLE DB的效率高则高矣,但却一点都不难。说它难恐怕主要是因为可参考的中文资料太少,为了帮助以后需要接触OLE DB的同行,我撰写了这篇文章。本文包含如下内容: 1.OLE DB写数据库; 2.OLE DB读数据库; 3.OLE DB对二进制数据(text、ntext、image等)的处理。 首先来看看对SQL Server进行写操作的代码,有一定VC基础的读者应该可以很顺利地看懂。OLE DB写数据库,就是这么简单! 注: 1.以下代码中使用的模板类EAutoReleasePtr 2.以下代码均在UNICODE环境下编译,因为执行的SQL语句必须是UNICODE的。设置工程为UNICODE的方法是:首先在project->settings->C/C++的属性页中的Preprocessor中,删除_MBCS写入UNICODE,_UNICODE。然后在link属性页中Category中选择output,在Entry-Point symbol 中添加wWinMainCRTStartup。 EAutoReleasePtr //失败,可能是因为数据库没有启动、用户名密码错等等 return;}EAutoReleasePtr //出错 return;}EAutoReleasePtr //出错 return;}hResult = ExecuteSQL(pICommand, pICommandText, _T(”USE PBDATA“));if(FAILED(hResult)){ //如果这里失败,那就是SQL语句执行失败。在此处,就是PBDATA还未创建 return;} // 创建表 ExecuteSQL(pICommand, pICommandText, _T(”CREATE TABLE 2005_1(Volume real NOT NULL,ID int NOT NULL IDENTITY)“)); // 添加记录 ExecuteSQL(pICommand, pICommandText, _T(”INSERT INTO 2005_1 VALUES(100.0)“));//...其中几个函数的代码如下: HRESULT ConnectDatabase(IDBInitialize** ppIDBInitialize, LPCTSTR pszDataSource, LPCTSTR pszUserID, LPCTSTR pszPassword){ ASSERT(ppIDBInitialize!= NULL && pszDataSource!= NULL && pszUserID!= NULL && pszPassword!= NULL); UINT uTimeout = 15U;// 连接数据库超时(秒) TCHAR szInitStr[1024]; VERIFY(1023 >= wsprintf(szInitStr, _T(”Provider=SQLOLEDB;Data Source=%s;Initial Catalog=master;User Id=%s;Password=%s;Connect Timeout=%u“), pszDataSource, pszUserID, pszPassword, uTimeout)); //Initial Catalog=master指明连接成功后,”USE master“。 EAutoReleasePtr HRESULT hResult = ::CoCreateInstance(CLSID_MSDAINITIALIZE, NULL, CLSCTX_INPROC_SERVER,IID_IDataInitialize,(void**)&pIDataInitialize); if(FAILED(hResult)) { return hResult; } EAutoReleasePtr hResult = pIDataInitialize->GetDataSource(NULL, CLSCTX_INPROC_SERVER,(LPCOLESTR)szInitStr,IID_IDBInitialize,(IUnknown**)&pIDBInitialize); if(FAILED(hResult)) { return hResult; } hResult = pIDBInitialize->Initialize(); if(FAILED(hResult)) { return hResult; } * ppIDBInitialize = pIDBInitialize.Detach(); return S_OK;} HRESULT CreateSession(IDBInitialize* pIDBInitialize, IOpenRowset** ppIOpenRowset){ ASSERT(pIDBInitialize!= NULL && ppIOpenRowset!= NULL); EAutoReleasePtr HRESULT hResult = pIDBInitialize->QueryInterface(IID_IDBCreateSession,(void**)&pSession); if(FAILED(hResult)) { return hResult; } EAutoReleasePtr hResult = pSession->CreateSession(NULL, IID_IOpenRowset,(IUnknown**)&pIOpenRowset); if(FAILED(hResult)) { return hResult; } * ppIOpenRowset = pIOpenRowset.Detach(); return S_OK;} HRESULT CreateCommand(IOpenRowset* pIOpenRowset, ICommand** ppICommand, ICommandText** ppICommandText){ ASSERT(pIOpenRowset!= NULL && ppICommand!= NULL && ppICommandText!= NULL); HRESULT hResult; EAutoReleasePtr { EAutoReleasePtr hResult = pIOpenRowset->QueryInterface(IID_IDBCreateCommand,(void**)&pICreateCommand); if(FAILED(hResult)) { return hResult; } hResult = pICreateCommand->CreateCommand(NULL, IID_ICommand,(IUnknown**)&pICommand); if(FAILED(hResult)) { return hResult; } } EAutoReleasePtr hResult = pICommand->QueryInterface(&pICommandText); if(FAILED(hResult)) { return hResult; } * ppICommand = pICommand.Detach(); * ppICommandText = pICommandText.Detach(); return S_OK;} HRESULT ExecuteSQL(ICommand* pICommand, ICommandText* pICommandText, LPCTSTR pszCommand, LONG* plRowsAffected){ ASSERT(pICommand!= NULL && pICommandText!= NULL && pszCommand!= NULL && pszCommand[0]!= 0); HRESULT hResult = pICommandText->SetCommandText(DBGUID_DBSQL,(LPCOLESTR)pszCommand); if(FAILED(hResult)) { return hResult; } LONG lAffected; hResult = pICommand->Execute(NULL, IID_NULL, NULL, plRowsAffected == NULL ? &lAffected : plRowsAffected,(IUnknown**)NULL); return hResult;} 以上就是写数据库的全部代码了,是不是很简单呢?下面再来读的。 // 先用与上面代码中一样的步骤获取pICommand,pICommandText。此处省略 HRESULT hResult = pICommandText->SetCommandText(DBGUID_DBSQL,(LPCOLESTR)_T(”SELECT Volume FROM 2005_1 WHERE ID = @@IDENTITY"));//取我们刚刚添加的那一条记录 if(FAILED(hResult)){ return;} LONG lAffected;EAutoReleasePtr return;} EAutoReleasePtr return;} // 一个根据表中各字段的数值类型而定义的结构,用于存储返回的各字段的值 struct CLoadLastFromDB { DBSTATUS dwdsVolume; DWORD dwLenVolume; float fVolume;}; // 此处我们只查询了一个字段。如果要查询多个字段,CLoadLastFromDB中要添加相应的字段定义,下面的dbBinding也要相应扩充。dbBinding[].iOrdinal要分别指向各个字段,dbBinding[].wType要根据字段类型赋合适的值。 DBBINDING dbBinding[1];dbBinding[0].iOrdinal = 1; // Volume 字段的位置,从 1 开始 dbBinding[0].obValue = offsetof(CLoadLastFromDB, fVolume);dbBinding[0].obLength = offsetof(CLoadLastFromDB, dwLenVolume);dbBinding[0].obStatus = offsetof(CLoadLastFromDB, dwdsVolume);dbBinding[0].pTypeInfo = NULL;dbBinding[0].pObject = NULL;dbBinding[0].pBindExt = NULL;dbBinding[0].dwPart = DBPART_VALUE | DBPART_STATUS | DBPART_LENGTH;dbBinding[0].dwMemOwner = DBMEMOWNER_CLIENTOWNED;dbBinding[0].eParamIO = DBPARAMIO_NOTPARAM;dbBinding[0].cbMaxLen = 0;dbBinding[0].dwFlags = 0;