数据库技术实验指导书.docx
《数据库技术实验指导书.docx》由会员分享,可在线阅读,更多相关《数据库技术实验指导书.docx(20页珍藏版)》请在冰豆网上搜索。
数据库技术实验指导书
实验7用SQL语言定义关系模式的完整性约束条件
一.实验目的:
复习创建基本表,熟悉通过SQL对数据进行完整性控制。
二.实验平台:
MicrosoftSQL_Server2000的查询分析器
三.实验内容:
在本实验中,我们将对完整性进行讨论,包括3类完整性、CHECK短语、CONSTRAIN子句、触发器。
用实验证实,当操作违反了完整性约束条件时,系统是如何处理的。
1.实体完整性
定义表的主码。
关系模型的实体完整性在CREATETABLE中用PRIMARYKEY定义。
定义主码的方法分为定义为列级约束条件和定义为表级约束条件两种。
(1)定义表Student,并将其中的Sno属性定义为主码。
CREATETABLESTUDENT(
SNOCHAR(7)PRIMARYKEY,
SNAMECHAR(8)NOTNULL,
SSEXCHAR
(2),
SAGESMALLINT,
SDEPTCHAR(20));
或者:
CREATETABLESTUDENT(
SNOCHAR(7),
SNAMECHAR(8),
SSEXCHAR
(2),
SAGESMALLINT,
SDEPTCHAR(20),
PRIMARYKEY(SNO));
(2)定义表SC,将其中的属性Sno,Cno定义为主码。
对于多个属性构成的码,只能够将其定义为表级约束条件,而无法用列级约束条件来实现。
CREATETABLESC(
SNOCHAR(7)NOTNULL,
CNOCHAR(4)NOTNULL,
GRADESMALLINT,
PRIMARYKEY(SNO,CNO));
2.参照完整性
定义表的外码。
关系模型的参照完整性是在CREATETABLE中用FOREIGNKEY语句来定义的,并用REFERENCES来指明外码参照的是哪些表的主码。
定义表SC,其中Sno参照表Student的主码Sno,Cno参照表Course的主码Cno。
(3)CREATETABLESC(
SNOCHAR(7)NOTNULL,
CNOCHAR(4)NOTNULL,
GRADESMALLINT,
PRIMARYKEY(SNO,CNO),
FOREIGNKEY(SNO)REFERENCESSTUDENT(SNO),
FOREIGNKEY(CNO)REFERENCESCOURSE(CNO));
3.用户定义完整性。
用户定义的属性上的约束条件。
(4)列值非空。
在定义SC表时,Sno、Cno和Grade属性都不允许取空值。
在不特别声明的情况下,非码属性的值是允许取空值的。
CREATETABLESC(
SNOCHAR(7)NOTNULL,/*列值非空的约束NOTNULL*/
CNOCHAR(4)NOTNULL,
GRADESMALLINTNOTNULL);
(5)列值唯一。
建立部门表DEPT,要求部门名称Dname取值唯一,部门编号Deptno属性为主码。
CREATETABLEDEPT(
DEPTNONUMERIC(7)PRIMARYKEY,
DNAMEVARCHAR(9)UNIQUE,/*UNIQUE约束要求Dname取值唯一*/
LOCATIONVARCHAR(10));
(6)CHECK短语指定列值应该满足的条件。
定义表Student,属性Ssex的值只允许取“男”或“女”;定义表SC,属性Grade的值定义在0-100之间。
CREATETABLESTUDENT(
SNOCHAR(7)PRIMARYKEY,
SNAMECHAR(8)NOTNULL,
SSEXCHAR
(2)CHECK(SSEXIN(‘男’,’女’)),/*CHECK语句约束条件*/
SAGESMALLINT,
SDEPTCHAR(20));
CREATETABLESC(
SNOCHAR(7)NOTNULL,
CNOCHAR(4)NOTNULL,
GRADESMALLINTCHECK(GRADE>0ANDGRADE<100),/*CHECK语句约束
条件*/
PRIMARYKEY(SNO,CNO),
FOREIGNKEY(SNO)REFERENCESSTUDENT(SNO),
FOREIGNKEY(CNO)REFERENCESCOURSE(CNO));
用户定义的元组上的约束条件。
CHECK短语不光能够定义属性列上的约束条件,还允许用户定义元组级的约束条件。
定义表Student,要求当学生性别为男时,其名字不能以Ms.打头。
(7)CREATETABLESTUDENT(
SNOCHAR(7)PRIMARYKEY,
SNAMECHAR(8)NOTNULL,
SSEXCHAR
(2),
SAGESMALLINT,
SDEPTCHAR(20),
CHECK(SSEX=‘女’ORSNAMENOTLIKE‘Ms.%’));
/*定义了Sname和Ssex之间的约束条件*/
4.CONSTRAINT完整性约束命名子句。
在定义表时利用约束命名子句对完整性约束条件命名,能够灵活地增加或删除一个完整性约束条件。
(8)定义表Student,要求学号在90000-99999之间,姓名不能取空值,年龄小于30,性别只能是“男”或“女”。
要求全部用约束命名子句实现。
CREATETABLESTUDENT(
SNONUMERIC(5)
CONSTRAINTC1CHECK(SNOBETWEEN90000AND99999),
SNAMEVARCHAR(20)
CONSTRAINTC2NOTNULL,
SAGENUMERIC(3)
CONSTRAINTC3CHECK(SAGE<30),
SSEXVARCHAR
(2)
CONSTRAINTC4CHECK(SSEXIN(‘男’,’女’)),
CONSTRAINTStudentKeyPRIMARYKEY(SNO));
在表Student上共定义了5个约束条件,包括主码约束以及C1、C2、C3、C4四个列级约束。
(9)修改表Student中的完整性限制,去掉对性别的限制,并将年龄的限制由小于30改
为小于40。
ALTERTABLESTUDENT/*去掉对性别的限制条件C4*/
DROPCONSTRAINTC4;
ALTERTABLESTUDENT/*先删掉原来的约束条件再增加一个新的约束条件*/
DROPCONSTRAINTC3;
ALTERTABLESTUDENT
ADDCONSTRAINTC3CHECK(SAGE<40);
5.触发器。
触发器可以看成是一类特殊的存储过程,在满足某个特定条件时自动触发执行,是提高数据库服务器性能的有力工具。
触发器分为三类,更新触发器、插入触发器和删除触发器。
能够定义触发器的用户有:
1)表的所有者;
2)系统管理员;
3)拥有创建触发器的权限,且拥有对操作对象的相应的操作权限的用户。
(10)定义表TAB,并在其上定义触发器TRI,在对TAB的插入和更新前检查,如果插入或更新的值在100-1000之间的话,将值置为50;如果值大于1000的话,则给出新值不允许大于1000的提示。
CREATETABLEtab(colint);
INSERTINTOtabVALUES(10);
INSERTINTOtabVALUES(20);
CREATETRIGGERtriBEFOREUPDATEORINSERTONtab
FOREACHROW
AS
BEGIN
IFnew.col>100ANDnew.col<1000THEN
new.col:
=50;
ENDIF;
IFnew.col>1000THEN
RAISEEXCEPTION‘Newvaluescannotmorethan1000’;
ENDIF;
END;
检测:
1)向表TAB插入数据(150)。
执行:
INSERTINTOTABVALUES(150);
结果:
插入的数据为150。
值在100-1000之间,触发器TRI自动执行,将插入的值置为50。
2)对表中的数据进行更新,将20更新为1500。
执行:
UPDATETABSETCOL=1500WHERECOL=20;
结果:
系统报出‘Newvaluescannotmorethan1000’的错误,对表进行查询后发现,表中的数据并没有发生改变。
说明在更新数据时,值大于1000则触发触发器TRI自动执行,系统报错,更新无效。
(11)删除触发器TRI。
DROPTRIGGERTRIONTAB;
删除触发器TRI之后,在对TAB进行插入和更新就不再有以上限制了。
试验8通过ODBC访问数据库
一.实验目的:
运用数据源管理工具来进行配置。
二.实验平台:
MicrosoftSQL_Server2000的查询分析器KingbaseES(SQL_Server2000的查询分析器不是KingbaseES)
三.实验内容
本实验是某项目中的一部分,目的是实现MFCODBC数据库与Access数据表格之间的相互操作。
包括用VisualC++中的MFCODBC技术实现对Access数据表格的内容的显示、添加、修改和删除的功能。
1、ODBC数据源的创建
使用的操作系统为WindowsXP,工具是VisualC++6.0。
此例中建立的Access表格取名为“plc”。
在“控制面板”中双击“管理工具”图标,然后在新出现的窗口中双击“数据源(ODBC)”,在弹出的对话框中选中“用户DSN”中的“dBASEFiles”,单击“添加”按钮,从弹出的对话框中选中“MicrosoftAccessDriver(*.mdb)”。
单击“完成”后,将弹出一个新的对话框,在数据源名及说明后的编辑框中填入表格名“plc”。
在命名数据源之后,需要把它连接到一个数据库。
单击“选择”,如图1所示,得到存储在数据目录中plc.mdb的拷贝文件,选中之,单击“确定”关闭此对话框。
然后单击“确定”,完成数据源的创建。
2、使用AppWizard创建一个数据库应用程序
一开始从AppWizard开始创建一个新的MFCAppWizard(exe)项目。
命名为Jh,然后遵从以下步骤:
1)在MFCAppWizard第一步对话框中,选择“单个文档”。
2)在MFCAppWizard第二步对话框中,选择“查看数据库不使用文件支持”,再单击“DataSource”。
3)在RecordSetType组框中,选择Dynaset。
在DataSource组框中,单击ODBC单选按钮,然后从下拉列表中选择plc,如图2所示,单击ok,在弹出的新的对话框中选中message,即为本项目所要操作的表。
以后几步接收缺省值,单击“完成”即可。
至此,已创建一个应用程序,并且在程序中自行生成一个数据源和数据源中的一个表的相关程序,其程序清单如下:
classCJhSet:
publicCrecordset//基于CRecordset的CjhSet新类
{
public:
CJhSet(CDatabase*pDatabase=NULL);
DECLARE_DYNAMIC(CJhSet)
//Field/ParamData
//{{AFX_FIELD(CJhSet,CRecordset)
//对应表中一些被绑定字段的变量
CStringm_baudrate;
CStringm_type;
CStringm_unit;
CStringm_number;
CStringm_address;
CStringm_istart;
CStringm_iend;
CStringm_ostart;
CStringm_oend;
//}}AFX_FIELD
//Overrides
//ClassWizardgeneratedvirtualfunctionoverrides
//{{AFX_VIRTUAL(CJhSet)
public:
virtualCStringGetDefaultConnect();//返回被连接的数据源名称
virtualCStringGetDefaultSQL();//返回数据源中所选表名称
virtualvoidDoFieldExchange(CFieldExchange*pFX);//RFXsupport
//}}AFX_VIRTUAL
//Implementation
#ifdef_DEBUG
virtualvoidAssertValid()const;
virtualvoidDump(CDumpContext&dc)const;
#endif};
3、实现程序的显示记录的功能
一旦AppWizard完成编写这些文件,它将启动对话框编辑器,这样就可以设计自己的表单了。
CRecordView应用程序围绕着充当应用程序主窗口的对话框而创建。
实验者也将使用像表单一样的对话框来显示存储在plc数据库记录域中的值。
如图3所示来放置静态文本框与编辑文本框。
CJHSet类的成员变量如图4所示。
所有的变量均为CString对象。
由AppWizard创建的每个变量的类型一般与相应数据库域的类型相似。
除了创建成员变量,AppWizard还编写了一组数据交换函数——类似于对话框的DDX函数——来在用来显示信息的控件与定义于CRecordSet类中的数据库域之间交换信息。
为了实现数据传输,就要把每个控件与代表数据库域的CJHSet变量联系起来。
实验者通过使用CJHView来成员变量m_pSet来指向应用程序的CJHSet对象。
选择每个资源ID(实验者这里未修改编辑框的默认ID),并单击AddVariable,从下拉表中直接选择相应的成员变量名。
全部设置好之后单击OK,至此,运行程序,就可以实现简单的与数据库之间的数据显示功能。
4、实现程序的添加、修改和删除记录的功能
在实现上述功能之前,需要按“插入->资源->DIALOG->新建”建立一个新的对话框(与图1所示对话框类似),以建立添加、修改的对象。
并为此对话框建立一个基于CDialog基础类的新的类CAddDlg。
其ID为IDD_DIALOG1。
然后在JhView.cpp中加“#include"AddDlg.h"”,并为“添加记录(IDC_ADD)”键编写程序代码如下。
其中已经作了详细的注解。
voidCJhView:
:
OnAdd()
{
//建立一个新的添加对话框
CAddDlgdlg;
if(dlg.DoModal()==IDOK)
{
//增加一条新的记录
m_pSet->AddNew();
//把对话框中的记录传递到记录集中
m_pSet->m_baudrate=dlg.m_br;
m_pSet->m_type=dlg.m_ty;
m_pSet->m_unit=dlg.m_un;
m_pSet->m_number=dlg.m_nu;
m_pSet->m_address=dlg.m_add;
m_pSet->m_istart=dlg.m_is;
m_pSet->m_iend=dlg.m_ie;
m_pSet->m_ostart=dlg.m_os;
m_pSet->m_oend=dlg.m_oe;
m_pSet->Update();//把新的记录存在数据源里
m_pSet->MoveLast();//指定当前记录为最后一条记录
UpdateData(false);//清空已输入内容
}
}
添加记录部分,应该先读出当前的记录,使其显示在添加/修改对话框中,即:
dlg.m_br=m_pSet->m_baudrate;
dlg.m_ty=m_pSet->m_type;
dlg.m_un=m_pSet->m_unit;
dlg.m_nu=m_pSet->m_number;
dlg.m_add=m_pSet->m_address;
dlg.m_is=m_pSet->m_istart;
dlg.m_ie=m_pSet->m_iend;
dlg.m_os=m_pSet->m_ostart;
dlg.m_oe=m_pSet->m_oend;
余下的与添加记录代码相同,除了不要定位“m_pSet->MoveLast();”而已。
删除记录只是需要使用Delete()成员函数删除当前记录之后移到下一个记录即可。
程序清单如下:
voidCJhView:
:
OnDel()
{
try//试着删除一条记录
{
m_pSet->Delete();
}
catch(CDBException*error)
{
AfxMessageBox(error->m_strError);
error->Delete();
m_pSet->MoveFirst();
UpdateData(FALSE);
return;
}
//移到下一个记录
m_pSet->MoveNext();
//测试是否为文件末尾,是,则使用MoveLast(),而不是使用MoveNext()
if(m_pSet->IsEOF())
m_pSet->MoveLast();
UpdateData(FALSE);
}
对多个记录集的操作与对单个记录集的操作类似,只是增加了CRecordSet类的派生类。
结束语
MFCODBC让开发人员仅仅使用很少的代码就可以完成复杂的数据库访问,并可以对数据库中的内容方便的实现添加、修改、删除等操作,从而极大地减少了软件开发的工作量,缩短了开发周期,提高了效率。
而且MFCODBC简单易学,能实现大部分ODBCAPI函数的功能,所以了解和掌握MFCODBC技术,将会给大型数据库应用软件带来清晰、快捷、方便等功能。
本文中的实例已经在VisualC++6.0环境下调试通过。
试验9jdbc访问数据库
一.实验目的:
了解并学会使用jdbc数据库连接技术
二.实验平台:
MicrosoftSQL_Server2000的查询分析器,jdk
三.实验内容
本实验介绍数据库连接的方法,首先实现了一个通用的方法,然后针对不同类型的数据库的特点,实现了更方便的连接数据库的方法。
1.配置环境变量。
(1)右键单击“我的电脑”—>“属性”,选择“高级”选项,\\
(2)单击“环境变量”,弹出名为环境变量的对话框\
(3)选择系统变量中的classpath,单击“编辑”。
在变量值中加入KingbaseESJDBC
和J2SDK的相关路径。
例如,KingbaseES的安装路径为D:
\KingbaseES,我们
需要在变量值中加入KingbaseESJDBCDriver的包D:
\KingbaseES\
jdbc\kingbasejdbc.jar;需要加入编译JDBC程序所需要的库D:
\KingbaseES\lib\。
例如,J2SDK1.4.2的安装路径为D:
\J2SDK1.4.2,我们还需要在变量值中加入
J2SDK的库D:
\J2SDK1.4.2\lib\;同时也需要加入当前目录.(dot)。
(4)选择系统变量中的Path,单击“编辑”。
在变量值中加入J2SDK的D:
\
J2SDK1.4.2\bin;KingbaseES的D:
\KingbaseES\bin。
编辑完成后
单击“确定”。
单击“系统特性”面板上的“确定”,以上四步就完成了环境变量的配置。
二.编写JDBC应用程序对数据库进行访问。
在本实验中,我们用Java语言编写一个通过JDBC访问数据库的应用程序
JDBCTest.Java,存放在D:
\下。
该程序实现的功能是:
首先在TEST数据库(需要预先创建)
中创建三个基本表,分别为学生表Student,课程表Course和选课表SC;然后往三个基本
表插入记录;最后将插入的记录显示出来。
程序的代码如下所示:
importjava.sql.*;//加载java数据连接包,该数据包基
//本包含了java所有的数据库调用。
publicclassJDBCTest{
publicstaticvoidmain(Stringargs[])throwsSQLException{
StringcreateString1;//定义三个字符型变量用于存放创
StringcreateString2;//建表的语句。
StringcreateString3;
Statementstmt;//定义语句对象stmt。
createString1="createtableStudent"+//创建表Student的语句给变量赋值。
"(学号CHAR(7)NOTNULLUNIQUE,"+
"姓名CHAR(15)NOTNULL,"+
"SSEXCHAR
(2),"+
"SAGEINT,"+
"SDEPTCHAR(5))";
createString2="createtableCourse"+//创建表Course的语句给变量赋值。
"(CNOCHAR(4)NOTNULLUNIQUE,"+
"CNAMECHAR(20),"+
"CPNOCHAR(4),"+
"CCREDITINT)";
createString3="createtableSC"+//将创建表SC的语句给变量赋值。
"(学号CHAR(7)NOTNULL,"+
"CNOCHAR(4)NOTNULL,"+
"GRADEINT)";
try{
Class.forName("com.kingbase.Driver");//加载驱动程序。
}catch(java.lang.Clas学号tFoundExceptione){//出现异常的处理。
System.err.print("Clas学号tFoundException:
");
System.err.println(e.getMessage());
}
try{
Connectioncon;//连接数据库TEST。
String