C++课程设计(简单图书管理系统)

时间:2019-05-12 01:10:27下载本文作者:会员上传
简介:写写帮文库小编为你整理了多篇相关的《C++课程设计(简单图书管理系统)》,但愿对你工作学习有帮助,当然你在写写帮文库还可以找到更多《C++课程设计(简单图书管理系统)》。

第一篇:C++课程设计(简单图书管理系统)

课 程 设 计

课程名称

C++课程设计 题目名称

图书管理系统

2016 年月 29 日

目录

一.设计内容与要求...............................................................................................................2 二.设计思路:.......................................................................................................................4 三.关键模块实现及主要代码...............................................................................................4 四.实验结果及分析.............................................................................................................13

五、心得体会.........................................................................................................................16

六、参考文献.........................................................................................................................17

一.设计内容与要求

(1)、设计一个图书管理系统,能够实现用户信息管理,图书信息的 录入、查询、删除等功能。

(2)、实现用户管理,系统具有用户注册功能。管理员的账号和密码由系统指定,登录后可进行修改。一般用户注册后才能登录使用系统。管理员具有录入、查询、删除图书信息及一般用户的功能。一般用户只有图书查询功能。

(3)、登录功能,只有注册了的用户才能进入系统,没有注册的则有提示信息出现。

(4)、图书管理功能,管理员能够录入、查询、删除图书信息。(5)、图书查询功能,管理员及一般用户能够通过图书的基本信息,如图书作者、书名、出版社、出版日期等等,进行查询。

提示:上述为基本功能,可参考实际的系统进行扩展。

二.设计思路:

为了实现用户信息以及图书信息的管理,建立一个用户CUser类与图书信息CBoodata类,其中CUser类应该包含用户账号以及密码,CBookdata类应该包含图书作者,书名,出版社,出版日期。同时应该建立两个dat文件,一个为存储用户信息,一个用来储存图书信息。程序主要分为4个页面:(1)登录页面,由Cdialog类派生出CMyprojectDlg类,用来处理账号注册与用户登录。

(2)图书查询页面。由Cdialog类派生出CSearch类。包含读取所有图书数据响应函数,以及根据作者姓名或者书名来查询图书响应函数。

(3)管理员图书管理页面。由Cdialog类派生出CBookdata类。包含读取所有图书响应函数,添加图书响应函数,修改图书响应函数,删除图书响应函数。(4)用户信息管理页面,由Cdialog类派生出CUserdata类。包含读取所有用户信息响应函数,删除用户响应函数、添加用户响应函数、修改用户信息响应函数。

因为本人能力有限,而且自己是根据老师给的教程以及结合书本内容来完成课程设计,于是我第一想到的就是应数组来存储信息,而不是用链表,所以,对于文件数据的删除与修改,难免会过于乏力。

三.关键模块实现及主要代码

(1)自己建立的类 1.用户类: class CUser { public: int num;char password[20];};

2.图书信息类:

class Book

//图书类 { public:

char author[10];

//设置作者姓名

char bname[20];

//设置图书书名

char pub_name[20];

//设置出版社名称

int pub_date;

//设置出版年月 };

(2)登录页面,由Cdialog类派生出CMyprojectDlg类,用来处理账号注册与用户登录。1.用户注册处理响应函数:

void CMyprojectDlg::OnButton3()

//用户注册 { // TODO: Add your control notification handler code here

////////////////////////////////////////////////////////////////////////////////////// //以下代码主要还是把这条记录写入文件,注意写入的格式:文件的前四个字节是保持用户记录数,//后面依次保持用户记录注意,写用户的每个信息的顺序要与读取时的顺序一致。

UpdateData(TRUE);CUser user;int n_user=0;

//用户的个数,管理员默认为第一个。自己输入为账号:1111,密码:0000。

int size=0;

fstream file(“user.dat”,ios::in|ios::out);// 建立一个文件类,关于其用法,请baidu。

file.seekg(ios::beg);

//将文件指针指向文件头。

file.read((char*)&n_user,sizeof(n_user));

//读取用户数。

n_user+=1;file.seekp(ios::beg);file.write((char*)&n_user,sizeof(n_user));//写学生记录个数

user.num=m_num;

//之前定义user.password为string,导致密码匹配时有错误。。。

memcpy(user.password,m_password.GetBuffer(m_password.GetLength()),m_password.GetLength());// 把类CString对象的内容赋值到字符数组中

user.password[m_password.GetLength()]='';//在数组末尾加结束符号

//在文件末尾,把新的记录写入。

file.seekp(4+(n_user-1)*sizeof(CUser),ios::beg);

//这里出错

file.write((char*)&user.num,sizeof(user.num));file.write((char*)&user.password,sizeof(user.password));

file.close();

///////////////////////////////////////////////////////////////////////////////////////// //用消息框提示

CString str;str.Format(“成功注册,成为第 %d 个注册用户,请按确定返回重新登录.”,n_user-1);

///因为第一个为管理员,不算为用户人数。

AfxMessageBox(str);

} 2.用户登录处理响应函数。其中包含判断是管理员,还是普通用户。void CMyprojectDlg::OnButton2()

//用户登录 { // TODO: Add your control notification handler code here

UpdateData(TRUE);

CUser m_user[100];int i;int size;int n_user=0;//文件中用户的个数

////////////////////////////////////////////////////////////////////////////////////////// //读取文件中的用户记录,注意读取顺序与写入的顺序要一致,文件最开始的4个字节是表示记录个数。

//根据记录个数,依次读取用户记录 放在成员变量m_st数组中(已在类体中声明了)

CFile file;

file.Open(“user.dat”,CFile::modeReadWrite);size=GetFileSize((void*)file.m_hFile,NULL);//读取文件大小,size==0表示是空文件

if(size>0){

file.SeekToBegin();

file.Read(&n_user,sizeof(n_user));}

if(n_user>0 && n_user<99)//实验中限定为0~100个用户记录

{

for(i=0;i

{

//请注意与写入数据的顺序要保持一样,否则会读错数据。

file.Read(&(m_user[i].num),sizeof(m_user[i].num));

file.Read(&(m_user[i].password),sizeof(m_user[i].password));

} } file.Close();///////////////////////////////////////////////// if(m_num==1111&&m_password==“0000”)

//管理员进入管理员页面

{

CAdministrators administrators;

administrators.DoModal();}

CString str_password;for(i=0;i

//普通用户,进入图书查询页面

{

str_password=m_user[i].password;

if(m_user[i].num==m_num)

{

if(str_password==m_password)

{

CSearch search;

search.DoModal();

}

else

{

CString str;

str.Format(“密码或者账号错误,请重新输入!”);

AfxMessageBox(str);

}

} } }

(3)图书查询页面。包含读取所有图书数据,以及根据作者姓名或者书名来查询图书。1.读取所有图书响应函数。

void CSearch::OnButton5()

//显示出所有图书 { // TODO: Add your control notification handler code here int i;int size;int n_book=0;//文件book的本数

////////////////////////////////////////////////////////////////////////////////////////// //读取文件中的书本记录,注意读取顺序与写入的顺序要一致,文件最开始的4个字节是表示记录个数。

//根据记录个数,依次读取书籍记录 放在成员变量m_user_book数组中(已在类体中声明了)

CFile file;

file.Open(“book.dat”,CFile::modeReadWrite);size=GetFileSize((void*)file.m_hFile,NULL);//读取文件大小,size==0表示是空文件

if(size>0){

file.SeekToBegin();

file.Read(&n_book,sizeof(n_book));}

if(n_book>0 && n_book<99)//实验中限定为0~100个书本记录

{

m_num_book=n_book;

for(i=0;i

{

//请注意与写入数据的顺序要保持一样,否则会读错数据。

file.Read(&(m_user_book[i].author),sizeof(m_user_book[i].author));

file.Read(&(m_user_book[i].bname),sizeof(m_user_book[i].bname));

file.Read(&(m_user_book[i].pub_name),sizeof(m_user_book[i].pub_name));

file.Read(&(m_user_book[i].pub_date),sizeof(m_user_book[i].pub_date));

} } file.Close();///////////////////////////////////////////////// //在列表控件中显示所有条记录

//插入每列的表头;

m_list.InsertColumn(0,“作者”,LVCFMT_LEFT,100,1);

m_list.InsertColumn(1,“书名”,LVCFMT_LEFT,100,1);m_list.InsertColumn(2,“出版社”,LVCFMT_LEFT,100,1);m_list.InsertColumn(3,“出版日期”,LVCFMT_LEFT,100,1);//每一行插入一条书本记录

for(i=0;i

CString str;

str=m_user_book[i].author;

m_list.InsertItem(i,str);//InsertItem向CListCtr控件申请一行用来存放数据,同时写入一行的头名称(即编号为0列的数据)

str=m_user_book[i].bname;

m_list.SetItemText(i,1,str);//设置第i行第1列的的数据为书名

str=m_user_book[i].pub_name;

m_list.SetItemText(i,2,str);//设置第i行第2列的的数据为出版社

str.Format(“%d”,m_user_book[i].pub_date);

///整型变为字符串,便于在控件显示

m_list.SetItemText(i,3,str);//设置第i行第3列的的数据为出版日期

} }

2.图书查询响应函数。

void CSearch::OnButton4()

//查询图书 { // TODO: Add your control notification handler code here

UpdateData(TRUE);m_list.DeleteAllItems();int num=0;//表示查找结果的个数

int i;

for(i=0;i

{

CString str;

int ret1=0,ret2=0;

str=m_user_book[i].author;

ret1=str.Find(m_author,0);//ret1>=0, 表示str中包含了m_author的字段

str=m_user_book[i].bname;

ret2=str.Find(m_bname,0);//ret2>=0, 表示str中包含了m_bname的字段

if(ret1>=0)

//按作者查询

{

str=m_user_book[i].author;

m_list.InsertItem(num,str);//InsertItem向CListCtr控件申请一行用来存放数据,同时写入一行的头名称(即编号为0列的数据)

str=m_user_book[i].bname;

m_list.SetItemText(num,1,str);//设置第i行第1列的的数据为书名

str=m_user_book[i].pub_name;

m_list.SetItemText(num,2,str);//设置第i行第2列的的数据为出版社

str.Format(“%d”,m_user_book[i].pub_date);

///整型变为字符串,便于在控件显示

m_list.SetItemText(num,3,str);//设置第i行第3列的的数据为出版日期

num+=1;//结果+1;

}

} }

(4)管理员图书管理页面。包含读取所有图书,添加图书,修改图书,删除图书的功能。1.读取所有图书功能实现与(3)的实现一样。2.添加图书响应函数。

void CBookdata::OnButton7()

//添加图书 { UpdateData(TRUE);Book book;int n_book=0;

//书本的个数

int size=0;

fstream file(“book.dat”,ios::in|ios::out);// 建立一个文件类,关于其用法,请baidu。

file.seekg(ios::beg);

//将文件指针指向文件头。

file.read((char*)&n_book,sizeof(n_book));

//读取书籍数。

////////////////////////////////////////////////////////////////////////////////////// //以下代码主要还是把这条记录写入文件,注意写入的格式:文件的前四个字节是保持书本记录数,//后面依次保持书本记录注意,写学生的每个信息的顺序要与读取时的顺序一致。

n_book+=1;file.seekp(ios::beg);file.write((char*)&n_book,sizeof(n_book));//写学生记录个数

memcpy(book.author,m_add_author.GetBuffer(m_add_author.GetLength()),m_add_author.GetLength());// 把类CString对象的内容赋值到字符数组中 book.author[m_add_author.GetLength()]='';//在数组末尾加结束符号

memcpy(book.bname,m_add_bname.GetBuffer(m_add_bname.GetLength()),m_add_bname.GetLength());// 把类CString对象的内容赋值到字符数组中

book.bname[m_add_bname.GetLength()]='';//在数组末尾加结束符号

memcpy(book.pub_name,m_add_pub_name.GetBuffer(m_add_pub_name.GetLength()),m_add_pub_name.GetLength());// 把类CString对象的内容赋值到字符数组中

book.pub_name[m_add_pub_name.GetLength()]='';//在数组末尾加结束符号

book.pub_date=m_add_pub_date;

//在文件末尾,把新的记录写入。

file.seekp(4+(n_book-1)*54,ios::beg);

file.write((char*)&book.author,sizeof(book.author));file.write((char*)&book.bname,sizeof(book.bname));file.write((char*)&book.pub_name,sizeof(book.pub_name));file.write((char*)&book.pub_date,sizeof(book.pub_date));

file.close();///////////////////////////////////////////////////////////////////////////////////////// //用消息框提示

CString str;str.Format(“文件中已有 %d 本书籍记录.”,n_book);AfxMessageBox(str);}

3.修改图书响应函数。

void CBookdata::OnButton5()

//修改图书,,必须先读取图书才能修改图书。{ // TODO: Add your control notification handler code here UpdateData(TRUE);m_list.DeleteAllItems();m_list.InsertColumn(0,“作者”,LVCFMT_LEFT,100,1);

m_list.InsertColumn(1,“书名”,LVCFMT_LEFT,100,1);m_list.InsertColumn(2,“出版社”,LVCFMT_LEFT,100,1);m_list.InsertColumn(3,“出版日期”,LVCFMT_LEFT,100,1);

CString str_author,str_bname,str_pub_name,str;

//将book类的字符串数组赋值为字符串变量,方便比较。

CFile file;// 建立一个文件类,关于其用法,请baidu。

file.Open(“book.dat”,CFile::modeReadWrite);//打开文件

file.SeekToBegin();

file.Write(&m_num_book,sizeof(m_num_book));//写书本记录本数

for(int i=0;i

{

str_author=m_book[i].author;

str_bname=m_book[i].bname;

str_pub_name=m_book[i].pub_name;

if(str_author==m_author||str_bname==m_bname||str_pub_name==m_pub_name||m_book[i].pub_date==m_pub_date)

{

memcpy(m_book[i].author,m_modify_author.GetBuffer(m_modify_author.GetLength()),m_modify_author.GetLength());// 把类CString对象的内容赋值到字符数组中

m_book[i].author[m_modify_author.GetLength()]='';//在数组末尾加结束符号

memcpy(m_book[i].bname,m_modify_bname.GetBuffer(m_modify_bname.GetLength()),m_modify_bname.GetLength());// 把类CString对象的内容赋值到字符数组中

m_book[i].bname[m_modify_bname.GetLength()]='';//在数组末尾加结束符号

memcpy(m_book[i].pub_name,m_modify_pub_name.GetBuffer(m_modify_pub_name.GetLength()),m_modify_pub_name.GetLength());// 把类CString对象的内容赋值到字符数组中

m_book[i].pub_name[m_modify_pub_name.GetLength()]='';//在数组末尾加结束符号

m_book[i].pub_date=m_modify_pub_date;

}

////////////////////////////////////////////////////////////////////////////////////// //以下代码主要还是把这条记录写入文件,注意写入的格式:文件的前四个字节是保持学生记录数,//后面依次保持学生记录注意,写学生的每个信息的顺序要与读取时的顺序一致。

file.Write(&m_book[i].author,sizeof(m_book[i].author));

file.Write(&m_book[i].bname,sizeof(m_book[i].bname));

file.Write(&m_book[i].pub_name,sizeof(m_book[i].pub_name));

file.Write(&m_book[i].pub_date,sizeof(m_book[i].pub_date));

///////////////////////////////////////////////////////////////////////////////////////// //在列表控件中显示所有条记录

str=m_book[i].author;

m_list.InsertItem(i,str);//InsertItem向CListCtr控件申请一行用来存放数据,同时写入一行的头名称(即编号为0列的数据)

str=m_book[i].bname;

m_list.SetItemText(i,1,str);//设置第i行第1列的的数据为书名

str=m_book[i].pub_name;

m_list.SetItemText(i,2,str);//设置第i行第2列的的数据为出版社

str.Format(“%d”,m_book[i].pub_date);

///整型变为字符串,便于在控件显示

m_list.SetItemText(i,3,str);//设置第i行第3列的的数据为出版日期

}

file.Close();

//用消息框提示

str.Format(“成功修改书籍记录.”);AfxMessageBox(str);}

4.删除图书响应函数。

void CBookdata::OnButton6()

//删除图书,,读取了图书数据后才能删除图书 { // TODO: Add your control notification handler code here UpdateData(TRUE);m_list.DeleteAllItems();m_list.InsertColumn(0,“作者”,LVCFMT_LEFT,100,1);

m_list.InsertColumn(1,“书名”,LVCFMT_LEFT,100,1);m_list.InsertColumn(2,“出版社”,LVCFMT_LEFT,100,1);m_list.InsertColumn(3,“出版日期”,LVCFMT_LEFT,100,1);

CString str_author,str_bname,str_pub_name,str;

//将book类的字符串数组赋值为字符串变量,方便比较。

int n_book,n_flag=0;

// n_flag为删除标志,1为有元素删除了

CFile file;// 建立一个文件类,关于其用法,请baidu。

file.Open(“book.dat”,CFile::modeReadWrite);//新建一个文件并且打开文件

file.SeekToBegin();

file.Write(&m_num_book,sizeof(m_num_book));//写书本记录本数,先填入本来的书本数。

for(int i=0;i

{

str_author=m_book[i].author;

str_bname=m_book[i].bname;

str_pub_name=m_book[i].pub_name;

if(str_author==m_del_author||str_bname==m_del_bname||str_pub_name==m_del_pub_name||m_book[i].pub_date==m_del_pub_date)

{

n_flag=1;

//删除标志置1

i+=1;

//第i个元素为要删除元素,跳过

}

////////////////////////////////////////////////////////////////////////////////////// //以下代码主要还是把这条记录写入文件,注意写入的格式:文件的前四个字节是保持 学生记录数,//后面依次保持学生记录注意,写学生的每个信息的顺序要与读取时的顺序一致。

file.Write(&m_book[i].author,sizeof(m_book[i].author));

file.Write(&m_book[i].bname,sizeof(m_book[i].bname));

file.Write(&m_book[i].pub_name,sizeof(m_book[i].pub_name));

file.Write(&m_book[i].pub_date,sizeof(m_book[i].pub_date));

}

if(n_flag==1)

{

n_book=m_num_book-1;

//表示删除了一本书,则将文件的书本数减1。

file.SeekToBegin();

file.Write(&n_book,sizeof(n_book));//写书本记录本数,先填入本来的书本数。

//用消息框提示

str.Format(“成功删除书籍记录.”);

AfxMessageBox(str);

}

else

{

//用消息框提示

str.Format(“没有这一本书的记录,不能删除.”);

AfxMessageBox(str);

}

file.Close();}

(5)、用户信息管理页面,包含读取所有用户信息,删除、添加、修改用户信息。1.读取所有用户信息以(4)基本相同。

2.删除用户信息实现基本方法与(4)基本相同。3.添加用户信息实现基本方法与(4)基本相同。4.修改用户信息实现基本方法与(4)基本相同。

四.实验结果及分析

(1.)登录页面 成功注册

普通用户成功登录页面

查询结果

管理员登录页面

图书管理页面

成功添加图书。

用户信息管理页面

分析:基本功能是可以实现的,但是因为是用数组来存放图书信息与用户信息,所以对于数据大了之后处理能力不够方便以及效率不高。而且删除信息的时候只是删除该条数据的信息,数据后面的信息往上移动,所以最后面会有两条重复的信息,虽然文件开头储存信息数目已经减一,读取数据是按照文件开头储存的信息数目来读取信息,但是有时候读取会有乱码。我在程序中找不到那个隐藏的bug,五、心得体会

这次C++课程设计学到了很多,懂得了C++看起来虽然简单,可是要用这个计算机语言来实现一些有用的功能,怎么运用确实是一门挺高深的学问,我们学习计算机语言不能只是看书看概念,要多上机实验,这样才能对计算机语言有比较深的了解,才能够提高自己的编程以及调试找BUG的能力。现在来总结一下编程过程中遇到的一些值得注意的问题。

1.派生出一个类时,为编辑框增加变量名后,然后在类声明中自己增加类成员,如果再想在对话框中增加编辑框并且添上变量名会出现错误。(如下,在Csearch 类中自己添加下面箭头指向的代码后,会出现下图右的错误,解决方法是把箭头指向的代码放到//}}AFX_DATA后面,因为此语句为MFC对话框自行添加编辑变量的结束,如果我们将自己定义的变量也添加到此语句前,编译器不清楚是MFC自行添加的变量还是用户自行添加的变量。)2.遇到编译器没有出错,可是运行结果与自己想象的不一样,很可能是逻辑错误。如: 在用户注册时,我是将用户数据直接存到文件尾,这是不正确的,因为管理员页面有删除用户的功能,这个功能的原理是先读文件头的用户数(假定为10个),然后将用户的数据先读取出来,然后经过一个判断,再储存重新储存回文件,而文件中储存的用户数据大小是没有变化的,也就是说文件尾会有两份最后一个用户的数据(即如果删除的是第七个,文件中最后会有两份第十个用户的数据,文件头的记录用户数为9个),如果添加用户直接储存在文件尾则会储存在第11个用户的位置,可是以后读取的话只是读取到第10个。所以会出现读取错误,密码不匹配的问题。应该根据记录的用户数让文件指针指向最后一个用户数据后面。file.seekp(4+(n_user-1)*sizeof(CUser),ios::beg);

以上两个问题是困扰我比较久的,其他问题经过百度还有自己的调试,解决还算快,不值得重点说。

六、参考文献

1.C++面向对象程序设计(第二版)

谭浩强 编著 2.成绩管理系统MFC教程

3.CNDN论坛,关于文件操作的指针运算。

第二篇:C++课程设计(教务管理系统)

#include using namespace std;#include #include #include #include #include #include“01.h” class University;

void menu(University uni);//菜单函数声明

class Student//学生类 { public: string name;int age;string sex;int number;string major;

public: void disp_stu();

friend void file_in(University &uni);

friend void file_out(University uni);};void Student::disp_stu(){

}

class Institute//学院类 { public: string name;cout<<“学生姓名:”< head;//封装学生信息

public: void add_stu();

//添加学生

bool delete_stu(int i);

// 删除学生

bool modefy_stu(int i);

//修改学生信息

void disp_ins_1();

// 显示本院学生信息

friend void file_in(University &uni);

friend void file_out(University uni);};void Institute::add_stu(){

} Student *p=new Student;cout<<“学生名字:”;cin>>(*p).name;cout<<“学生年龄:”;cin>>(*p).age;cout<<“学生性别:”;cin>>(*p).sex;cout<<“学生学号:”;cin>>(*p).number;cout<<“学生专业:”;cin>>(*p).major;head.Add(p);//在链表末尾增加一个节点

bool Institute::delete_stu(int i){

} head.Remove(i);//删除链表指定位置节点 return true;bool Institute::modefy_stu(int i){

Student *p=new Student;cout<<“学生名字:”;cin>>(*p).name;cout<<“学生年龄:”;cin>>(*p).age;cout<<“学生性别:”;cin>>(*p).sex;cout<<“学生学号:”;cin>>(*p).number;cout<<“学生专业:”;cin>>(*p).major;head.Remove(i);//删除链表指定位置节点 head.Insert(i,p);//在链表指定位置插入一个新节点

return true;} void Institute::disp_ins_1(){

}

class University//学校类 { public: string name;int age;string addr;List head;//封装学院信息 public:

void design_stu();//学生信息设置 int i;Node *q;q=head.pHead;//q指向学生节点双向链表头指针

cout<<“学院名字:”<

} cout<<“-------”<pData->disp_stu();q=q->pNext;

void add_ins();

//添加学院

bool delete_ins(int n);

// 删除学院

void design_cqut();

//设置学校信息 bool modefy_cqut();

//修改学校信息 void disp_cqut();

//显示学校信息 void design_ins();

//学院信息设置 bool modefy_ins(int n);

//修改学院 void disp_ins();

//显示学院信息

void search_menu();void search_name(string n);//姓名

void search(string n);//性别//函数重载

void search(int n);//学号

bool search_age(int n);//年龄

friend void file_in(University &uni);};friend void file_out(University uni);

void University::design_stu(){

int i,m,j;int n;cout<<“

★★★★★★学生信息设置★★★★★★

”<>i;system(“cls”);//清屏 switch(i){ case 1:

{

disp_ins();

cout<

cout<<“输入学生所在学院序号:”<

cin>>m;system(“cls”);//清屏

head.pCurrent=head.pHead;//当前指针指向双向链表头指针

for(j=1;j

{

}

} head.pCurrent=head.pCurrent->pNext;//当前指针指后移

cout<<“输入要添加的学生信息:”;head.pCurrent->pData->add_stu();cout<<“按任意键返回上一级菜单:”<

disp_ins();

cout<

cout<<“输入学生所在学院序号:”<

cin>>m;system(“cls”);//清屏

head.pCurrent=head.pHead;//当前指针指向双向链表头指针

for(j=1;j

{

head.pCurrent=head.pCurrent->pNext;//当前指针指后移

} } head.pCurrent->pData->disp_ins_1();cout<>n;head.pCurrent->pData->delete_stu(n);cout<<“按任意键返回上一级菜单:”<

{

disp_ins();

cout<

cout<<“输入学生所在学院序号:”<

cin>>m;system(“cls”);//清屏

head.pCurrent=head.pHead;//当前指针指向双向链表头指针

for(j=1;j

{

}

}

head.pCurrent=head.pCurrent->pNext;//当前指针指后移

head.pCurrent->pData->disp_ins_1();cout<

} cin>>n;head.pCurrent->pData->modefy_stu(n);cout<<“按任意键返回上一级菜单:”<

void University::add_ins(){

}

bool University::delete_ins(int n){

}

bool University::modefy_ins(int n){

Institute *p=new Institute;cout<<“学院名字:”;cin>>(*p).name;head.Remove(n);//删除链表指定位置节点 head.Insert(n,p);//在指定位置插入节点信息 return true;head.Remove(n);//删除链表指定位置节点 return true;Institute *p=new Institute;cout<<“学院名字:”;cin>>(*p).name;head.Add(p);//在链表末尾增加一个节点

}

void University::disp_ins(){

int i;Node *q;q=head.pHead;//q指向学院节点双向链表头指针

for(i=1;i<=head.size;i++){

cout<pData->name<pData->head.size<

}

void University::design_ins(){

int i;int j;cout<<“

★★★★★★学院信息设置★★★★★★

”<pNext;

cout<>i;system(“cls”);//清屏 switch(i){ case 1:

{

} disp_ins();cout<<“按任意键返回上一级菜单:”<

disp_ins();

add_ins();

cout<<“按任意键返回上一级菜单:”<

getch();system(“cls”);//清屏 design_ins();

break;} case 3: {

} disp_ins();cout<<“输入删除学院序号:”;cin>>j;delete_ins(j);cout<<“按任意键返回上一级菜单:”<

disp_ins();cout<<“输入修改学院序号:”;cin>>j;modefy_ins(j);cout<<“按任意键返回上一级菜单:”<

} case 5:menu(*this);break;} }

bool University::modefy_cqut(){ cout<<“学校名字:”;cin>>name;cout<<“创建年代:”;cin>>age;cout<<“学校地址:”;cin>>addr;return true;}

void University::design_cqut(){ int i;

University uni;cout<<“

★★★★★★学校信息设置★★★★★★ cout<>i;system(”cls“);//清屏

switch(i){

case 1:

{

disp_cqut();

cout<<”按任意键返回上一级菜单:“<

getch();system(”cls“);//清屏

design_cqut();

break;

}

case 2:

{

modefy_cqut();

cout<<”按任意键返回上一级菜单:“<

getch();system(”cls“);//清屏

design_cqut();break;”<

}

} } case 3:menu(uni);break;

void University::disp_cqut(){

cout<<“学校有关信息为:”<

}

void University::search_name(string n){

int i,j,m=0;head.pCurrent=head.pHead;//当前指针指向学院节点头指针 for(i=0;ipData->head.pCurrent=head.pCurrent->pData->head.pHead;//当前指cout<<“学校名字:”<

for(j=0;jpData->head.size;j++)

{

if(n==head.pCurrent->pData->head.pCurrent->pData->name)

{

} head.pCurrent->pData->head.pCurrent->pData->disp_stu();m++;head.pCurrent->pData->head.pCurrent=head.pCurrent->pData->head.pCurrent->pNext;//学生当前指针后移

}

bool University::search_age(int n){

int i,j,m=0;head.pCurrent=head.pHead;for(i=0;ipNext;//学院当前指针后移

} cout<<“有”<

}

head.pCurrent->pData->head.pCurrent=head.pCurrent->pData->head.pHead;for(j=0;jpData->head.size;j++){ if(n==(head.pCurrent->pData->head.pCurrent->pData->age)){

} head.pCurrent->pData->head.pCurrent->pData->disp_stu();m++;head.pCurrent->pData->head.pCurrent=head.pCurrent->pData->head.pCurrent->pNext;} head.pCurrent=head.pCurrent->pNext;} cout<<“有”<

void University::search(string n){

} int i,j,m=0;head.pCurrent=head.pHead;for(i=0;ipData->head.pCurrent=head.pCurrent->pData->head.pHead;

for(j=0;jpData->head.size;j++){

if(n==head.pCurrent->pData->head.pCurrent->pData->sex){ head.pCurrent->pData->head.pCurrent->pData->disp_stu();} m++;

head.pCurrent->pData->head.pCurrent=head.pCurrent->pData->head.pCurrent->pNext;

} cout<<“有”<pNext;void University::search(int n){

int i,j,m=0;head.pCurrent=head.pHead;for(i=0;i

head.pCurrent->pData->head.pCurrent=head.pCurrent->pData->head.pHead;

for(j=0;jpData->head.size;j++)

{

if(n==head.pCurrent->pData->head.pCurrent->pData->number)

{

head.pCurrent->pData->head.pCurrent->pData->disp_stu();

m++;

}

head.pCurrent->pData->head.pCurrent=head.pCurrent->pData->head.pCurrent->pNext;

}

head.pCurrent=head.pCurrent->pNext;} cout<<“有”<

/****************************************信息查询菜***********************************************/

void University::search_menu(){ int i;cout<<“

★★★★★信息查询显示★★★★★”<>i;system(“cls”);//清屏

switch(i){ case 1: {

disp_ins();

cout<<“按任意键返回上一级菜单:”<design_ins();break;} case 2:

{

} head.pCurrent=head.pHead;//当前指针指向学院节点头指针 for(i=0;i

} head.pCurrent->pData->disp_ins_1();head.pCurrent=head.pCurrent->pNext;cout<<“按任意键返回上一级菜单:”<search_menu();break;case 3: {

} int j;disp_ins();cout<<“请输入学生所在学院序号:”;cin>>i;system(“cls”);//清屏 head.pCurrent=head.pHead;for(j=1;jpNext;head.pCurrent->pData->disp_ins_1();cout<<“按任意键返回上一级菜单:”<search_menu();break;

case 4:

{

string n;cout<<“输入要查询的姓名:”;cin>>n;system(“cls”);//清屏 search_name(n);

} cout<<“按任意键返回上一级菜单:”<search_menu();break;case 5:

{

} int n1;cout<<“输入要查询的年龄:”;cin>>n1;search_age(n1);cout<<“按任意键返回上一级菜单:”<search_menu();break;

system(“cls”);//清屏

case 6: {

} string n;cout<<“输入要查询的性别:”;cin>>n;system(“cls”);//清屏 search(n);cout<<“按任意键返回上一级菜单:”<search_menu();break;case 7: {

} int n;cout<<“输入要查询的学号:”;cin>>n;system(“cls”);//清屏 search(n);cout<<“按任意键返回上一级菜单:”<search_menu();break;case 8: {

menu(*this);

}

} } break;/**********************************************************************/ {

int i,j;ifstream inf(“cqutData.txt”,ios::in);inf>>uni.name;inf>>uni.age;inf>>uni.addr;inf>>uni.head.size;//学院个数 for(i=0;i>p->name;

导出文件数据void file_in(University &uni)

Node *m=new Node;//建立学院信息节点 m->pData=p;//把输入的学院信息节点赋给建立的学院信息节点 m->pNext=0;if(i==0)uni.head.pHead=m;//把节点m赋给学院信息节点

else uni.head.pEnd->pNext=m;//把节点m赋给下一个学院信息节点 m->pPrev=uni.head.pEnd;//节点m指向学院信息的尾节点

uni.head.pCurrent=uni.head.pEnd=m;//学院信息的尾节点始终指向m节点 inf>>uni.head.pCurrent->pData->head.size;//学生个数 for(j=0;jpData->head.size;j++){

Student *q=new Student;inf>>q->name;inf>>q->age;inf>>q->sex;inf>>q->number;inf>>q->major;

Node *n=new Node;n->pData=q;n->pNext=0;if(j==0)uni.head.pCurrent->pData->head.pHead=n;else uni.head.pCurrent->pData->head.pEnd->pNext=n;

n->pPrev=uni.head.pCurrent->pData->head.pEnd;

uni.head.pCurrent->pData->head.pCurrent=uni.head.pCurrent->pData->head.pEnd=n;//学生信息的尾节点始终指向n节点

} } }

/************************************************************************************/ void file_out(University uni){

ofstream ouf(“cqutData.txt”,ios::out);int i,j;ouf<

导入文件数据ouf<

uni.head.pCurrent=uni.head.pHead;//当前指针指向学院节点头指针 for(i=0;i

ouf<pData->name<

ouf<pData->head.size<

uni.head.pCurrent->pData->head.pCurrent=uni.head.pCurrent->pData->head.pHead;//当前指针指向学生节点头指针

for(j=0;jpData->head.size;j++){

ouf<pData->head.pCurrent->pData->name<pData->head.pCurrent->pData->age<pData->head.pCurrent->pData->sex<pData->head.pCurrent->pData->number<pData->head.pCurrent->pData->major<

uni.head.pCurrent->pData->head.pCurrent=uni.head.pCurrent->pData->head.pCurrent->pNext;//学生当前指针后移

}

} } uni.head.pCurrent=uni.head.pCurrent->pNext;//学院当前指针后移

/************************退出系统菜单****************************/

void exit(University uni){

} int i;cout<<“是否保存修改内容:”<>i;system(“cls”);//清屏 switch(i){ case 1:

{

} file_out(uni);exit(0);break;case 2:{exit(0);break;} case 3:

{ menu(uni);break;} case 4:

{

file_out(uni);

}

} menu(uni);break;

/***************************************************************************************/ void menu(University uni){

system(“cls”);/*清屏*/ int i;cout<

主菜单 cout<<“★★★★★★★★★★★★★主菜单★★★★★★★★★★★★★”<

cout<

cout<

cout<>i;system(“cls”);//清屏

}

int main(){ University u;

} file_in(u);menu(u);return 0;switch(i){

case 1:uni.design_cqut();break;case 2:uni.design_ins();break;case 3:uni.design_stu();break;

case 4:uni.search_menu();break;

case 5:exit(uni);break;}

第三篇:c++超市管理系统课程设计报告

c++超市管理系统课程设计报告

第1章

任务描述

本次C++实践课题为“超市管理系统”。要求功能有

A、添加商品信息,有商品编号、商品名、供应商代号、进货价、售出价、存货数等。进货:若商品已存在,只需修改存货数;若不存在,需增加新纪录。B、售出:输入商品编号,修改相应的存货数与销售额。C、查询:查询商品,销售额。

第2章

系统需求及主要功能

本系统为超市管理系统的设计与实现,可供超市管理者对超市商品信息的查询和修改,适用于各种小型超市,有效地提高了工作效率。若查询不符合实际情况,则会提示错误。Enter键确认。

本系统实现以下功能:

(1)进入系统后提示适用方法,键入相应数字依次将商品代码(由阿拉伯数字组成)、商品名称、商品产地、商品单价以及库存量等商品信息存入并保存。

(2)键入商品名称,可将要求删除商品调出,并予以删除。

(3)键入相应数字选项,可修改超市商品的所有信息。

(4)键入相应数字选项,可查询需要查询的商品的所有信息。

(5)键入相应数字选项,可显示超市所有商品的所有信息。

(6)键入数字0退出系统。

第3章

系统概要

3.1主界面流程图

设计超市管理系统的主界面,主界面相应的现实有下列菜单:增加商品、删除商品、修改商品、查询商品、统计商品、显示商品、退出。

超市管理系统

商品类

超市类

查询商品

统计商品

修改商品

增加商品

删除商品

找到

开始

开始

3.1主界面流程图

3.2

超市管理模块设计

(1)

超市初始化模块

类名为Goods和Supermarket,分别定义了商品的名称,代码,产地,单价和库存数量,以及需要在链表里面寻找的指针。

(2)增加商品的函数模块

在文件中写入产品的信息,加入链表。

(3)删除商品的函数模块

删除结点已达到删除产品的目的。

(4)修改商品的函数模块

载入商品的全部数据,并且放入内存,并且可以重新写入修改。如果没有找到商品,则返回。

(5)统计商品的函数模块

统计结点数以记录商品的数量,载入所有商品的数量和单价计算商品的总价值。

(6)数据存储的函数模块

将链表的所有数据写入文件,然后关闭文件。

(7)数据读入的函数模块

打开文件,然后将文件中的数据写入内存以备用。

第4章

系统设计过程

4.1

主界面流程图

设计超市管理系统的主界面,主界面相应的现实有下列菜单:增加商品、删除商品、修改商品、查询商品、统计商品、显示商品、退出。

查询商品

超市管理系统

商品类

超市类

统计商品

修改商品

增加商品

删除商品

找到

开始

结束

4.1主界面流程图

4.2清除内存中的商品函数

在超市管理系统中,商品出售出去,库存中的商品信息必须清除。

类外定义一个函数clear,在函数中定义一个指针p,讲物品goods赋给p,为了使函数能够不断地清除内存中的数据,要使指针移动,首先将p->next赋予goods,然后删除p中的数据,清空p中的数据,然后将goods赋给p,依次循环,从而实现删除库存中的一个或多个商品。

流程图如图

开始

定义指针

goods赋值p给p

将p的next赋值给goods

删除p中的数据

goods赋值给p

是否有需要删除的商品

结束

YES

NO

图4.2清除内存商品流程图

4.3增加商品信息

类外定义一个函数add,首先在函数中定义变量商品代码

num

和商品数量count,都为double类型,商品名name和产地address为char类型,价格price

为int类型,首先要求用户输入商品信息,依次输入商品的代码、商品名称、商品产地、商品单价,判断单价是否在0~65535之间,如果不在范围内重新输入直到在范围之内再继续向下面执行,输入商品库存量,库存在0~99999之间,如果超出范围重新输入,在范围之内继续执行,保存数据。

开始

定义变量

输入商品代码名称产地

输入商品价格

(0~65535)

输入商品库存

(0~99999)

保存

No

No

Yes

Yes

图4.3

增加商品流程图

4.4删除商品信息的过程

(1)在Supermarket类下定义一个Delete函数作为删除商品信息的函数,然后定义商品名,输入商品信息。

(2)查找要删除的结点(节点中包含所有该商品的信息:商品代码、名称、产地、数量、单价),分别定义两个指针,原商品表信息指针p1和输入的商品信息指针p2,在p1循环的过程中比较输入的商品名与原有的商品名是否一致,如果一致则结束本次循环,否则p2指向p1,使得两指针同化,p1指针接着指向下一指针,这样依次向后查询。

(3)删除结点,如果找到要删除的结点则删除,在这个条件下,如果删除的结点是第一个结点,则继续将指针后移删除第一结点,如果删除的结点是后续结点,则将p2下一指针指向p1下一指针,则删除相应的后续结点。

输出的结果是:找到并删除或者sorry,未找到!

流程图如图4.5

查找要删除的结点

定义指针p1

p2

比较输入商品名和商品表已知商品名是否一致

是否找到结点

继续向后查找

p2=p1;p1=p1->next

是否为第一结点

找到则删除成功

查找后续结点

开始

结束

图4.5

删除商品流程图

4.5修改商品信息的过程

(1)定义各参数变量的类型,然后是输入要查找等待修改的商品名称

(2)查找要修改的结点,定义p1、p2指针,p1为指向goods商品表指针,p2为输入的商品指针,判断p1指针,如果输入的商品名和原有的商品名一致,则结束本次循环,否则,p1和p2指针同化,p1接着指向p1的下一指针。

(3)修改结点,若找到相应的要修改的结点,则p1指向Output函数,接着输出要修改的信息,利用Switch语句来调用相应的修改信息。

(4)创建新商品的结点,把原来要修改的结点删除并重新替换要创建的商品结点。如果找到等待修改的结点则修改,否则保持商品表信息不变。

流程图如图4.6

输入要查的商品名

查找要修改的结点

比较输入商品名和商品表已知商品名是否一致

是否找到第一结点

继续向后查找

p2=p1;p1=p1->next

继续查找后续结点

删除并替换

开始

结束

图4.6

修改商品流程图

4.6查询商品的过程:

(1)在Supermarket类下定义一个Query函数作为查询商品信息的函数,输入商品名。

(2)查找要查询的结点(结点中包含所有该商品的信息:商品代码、名称、产地、数量、单价),定义一个原商品表信息指针p1,在p1循环的过程中比较

输入的商品名与原有的商品名是否一致,如果一致则结束本次循环,否则

p1指针接着指向下一指针,这样依次向后查询。

(3)查询结点,如果找到要查询的结点则输出:查询成功并输出其所有信息,若没有找到输出:sorry未找到!

流程图如图4.7

定义指针p1

比较输入商品名和商品表已知商品名是否一致

是否找到商品

继续向后查找

p1=p1->next

输入要查询商品的名字

开始

结束

图4.7查询商品流程图

4.7统计商品的过程

(1)是在Supermarket类下定义一个Add_up函数作为统计商品信息的函数,然后定义两个double型变量Amount和Value分别表示要求统计商品的总量和总价值,输入商品名字name。

(2)查找要统计的结点(结点中包含所有该商品的信息:商品代码、名称、产地、数量、单价),定义一个指针p1,原商品表信息指针p1,在p1循环的过程中比较输入的商品名与原有的商品名是否一致,如果一致则结束本次循环,p1指针接着指向下一指针,这样依次向后查询。没找到则输出:sorry,未找到!

(3)统计商品,每当找到一个商品后就将Amount与p1所指count相加存入Amount,并将此时p1所指的count与price相乘再加上Value存入Value,循环查找相加,最后分别输出。

流程图如图4.8

开始

查找要统计的结点

定义指针p1

比较输入商品名和商品表已知商品名是否一致

是否找到结点

继续向后查找

p1=p1->next

Amount+=p1->count;

Value+=p1->count*p1->price

Value+=p1->count*p1->price

当前指针p1

输出

结束

图4.8

统计商品流程图

第4章

系统测试

打开软件后见到如图所示的界面正式进入超市管理系统

图5.1

系统主界面

该软件有增加商品、删除商品、修改商品、查询商品、统计商品、显示商品六大功能。

(1)增加商品

选择1

进入商品录入界面

图5.2

新增商品信息界面

依次录入商品代码、商品名称、商品产地、商品单价、商品的库存量并按Y保存。

(2)删除商品

图5.3

删除商品界面

首先输入商品的名称,然后选择是Y

或者N。

(3)修改商品

选择3

进入修改商品界面

图5.4

修改商品界面

输入商品的名称,系统会显示商品代码、名称、产地、价格、库存量,然后分别选择1

改商品代码、2改商品名称、3改商品产地、4改商品单价、5

改商品库存量、7改全部信息。

(4)查询商品

图5.5

查询商品界面

输入商品名称后,系统会显示你所查询的商品信息,有商品的代码、商品的名称、商品的产地、商品的单价和库存量等。

(5)统计商品

图5.6

统计商品界面

选择5后进入统计商品,输入商品名称后,会显示出商品的数量和总价值。

(6)显示所有商品

选择6后

系统会显示所有商品的信息

图5.7

显示所有商品信息界面

第6章

在xx老师的耐心指导下,本组成员结各人之长,集集体智慧,终于基本完成了超市管理系统的设计与实现。

在实训期间,各成员按时完成各自的分配任务,及时交付组长进行整理融合。整理完毕后进行调试发现有不少有待改善之处,如商品价格和商品库存量不能为负数,也不能高的离谱等。在李杰老师的严格要求下,最后还增加了一个显示栏,通过该显示函数的实现可对超市所有商品一目了然。本着认真学习,对自己负责的态度,本组成员共同努力,对该系统程序的不足之处尽力修改,尽量达到程序的健壮性等。

但是尽管本组成员都非常努力,但该程序仍有不足之处,如对于商品代码num和商品库存量count若输入英文字母,按回车键后屏幕便会闪烁不停,重新打开系统后前面所输入的商品信息不能保存,在保存商品时按Y以外的键也可保存等。

总之,在XX老师的悉心指导下,我们收获颇丰!不仅深刻掌握了课本知识,而且加强了团队意识,在以后各自的人生发展道路上抹下了浓重的一笔!

参考文献:

[1]《C++面向对象程序设计》(第一版)

谭浩强

北京:清华大学出版社

2006年1月

[2]《C程序设计

》(第三版)

谭浩强

北京:清华大学出版社2005年7月

课程分工:

XX:主界面的设计与实现,商品的显示,程序的整合。

XX:商品的删除,商品的修改。

XX:清除内存中商品的数据,增加商品,创建商品类节点。

XX:查询商品,统计商品数量与价值。

XX:数据存盘与装入。

系统的测试由五人共同完成。

第四篇:c++课程设计:教务管理系统源代码

#include #include using namespace std;class Person { public: Person(string n):name(n){} virtual void show(){} ~Person(){} protected:

string name;};class Student:public Person { public:

Student(string n,int num,string ss):Person(n),number(num),address(add),str1(ss){}

virtual void show();

void input_stu();

void display_stu();

void display_qu();

~Student(){} protected:

string str1;

int number;

string address;};void Student::show(){ cout<<“向老师提出的问题是:”;cin>>str1;}

void Student::display_qu(){ cout<

void Student::input_stu(){ cin>>Student::name;cin>>Student::number;cin>>Student::address;} void Student::display_stu(){

add,string cout<<“姓名:”<

Teacher(string n,string sub,string sdf):Person(n),subject(sub),str2(sdf){}

virtual void show();

void input_t();

void display_t();

void display_an();

~Teacher(){} protected:

string subject;

string str2;};void Teacher::display_an(){ cout<

void Teacher::show(){ cout<<“我的回答是:”;cin>>str2;} void Teacher::input_t(){ cin>>Teacher::name;cin>>Teacher::subject;} void Teacher::display_t(){ cout<<“姓名:”<

Admin(string n,int tel,string ssfs):Person(n),telphone(tel),str3(ssfs){}

virtual void show();

void input_ad();

void display_ad();

void display_gg();

~Admin(){} protected:

int telphone;

string str3;};void Admin::display_gg(){ cout<<“公告:”;cout<

void Admin::show(){

cout<<“公告是:”;cin>>str3;} void Admin::input_ad(){ cin>>Admin::name;cin>>Admin::telphone;} void Admin::display_ad(){ cout<<“姓名是:”<

int main(){ int z,h,m;z=0;h=0;m=0;

Student stu(“guochun”,20150311,“qlu”,“sdss”);

Teacher tea(“cuiyu”,“math”,“dsdf”);

Admin ad(“steve jobs”,178641,“sdfs”);

while(1)

{

int x;

cout<<“*******************”<

cout<<“1.学生”<

cout<<“2.教师”<

cout<<“3.管理员”<

cout<<“*******************”<

cout<<“选择你的身份”<

cin>>x;

if(x<=0||x>3)

cout<<“输入错误!”<

else

{

switch(x)

{

case 1:

cout<<“请选择你要干什么”<>y;if(y<=0||y>3)cout<<“发生错误!”;else { switch(y){

case 1:stu.display_stu();break;

case 2:stu.input_stu();

} cout<<“修改后的个人信息为:”<

{

stu.Student::show();

z=1;} break;

}

break;

case 2:

cout<<“请选择你要干什么”<

cout<<“学生有问题提问”<

ad.display_gg();} cout<<“___________________”<>q;if(q<=0||q>3)

cout<<“发生错误!”;else {

switch(q)

{

case 1:tea.display_t();break;

case 2:tea.input_t();

cout<<“修改后的个人信息为:”<

tea.display_t();break;

case 3:

{

if(z==1)

{

cout<<“学生的问题是:”;

stu.display_qu();

tea.Teacher::show();

h=1;

}

}

break;

}

}

break;

case 3:

cout<<“请选择你要干什么”<

cout<<“___________________”<

cout<<“1.显示个人信息”<>l;if(l<=0||l>3)

cout<<“发生错误!”;

else

{

switch(l)

{

case 1:ad.display_ad();break;

case 2:ad.input_ad();

cout<<“修改后的个人信息为:”<

ad.display_ad();break;

case 3:

{

ad.Admin::show();

m=1;

}

break;

}

}

break;

}

}

}

return 0;}

第五篇:Oracle课程设计 图书管理系统

数据库课程设计

设计名称:图书管理系统

组员:尚靖伟(122068)

张红凯(122072)班级:计G121班

信息工程学院计算机系

2013年6月27日

“Oracle数据库应用设计”指导书

Oracle数据库管理与设计

目 录

目录.........................................................................................................................I 前言.......................................................................................................................II 第1部分

Oracle管理技术........................................................................................1

实验1 实验2 实验3 实验4 实验5 实验6 实验7 实验8 第2部分

数据库管理................................................................................................................1 角色和用户管理........................................................................................................6 表和视图管理............................................................................................................8 索引和序列管理......................................................................................................12 PL/SQL编程...........................................................................................................14 使用游标、存储过程和触发器..............................................................................22 表空间管理..............................................................................................................26 文件管理..................................................................................................................30

Oracle开发技术......................................................................................36

I

Oracle数据库管理与设计

前 言

数据库技术是计算机科学中发展最快的领域之一。随着网络技术的不断发展,数据库技术与网络技术相结合,已经广泛应用于工作和生活的各个领域。同时,数据库技术及其应用已经成为国内外高校计算机专业和许多非计算机专业的必修或选修课程。

Oracle是当前最流行的大型关系数据库之一,支持包括32位Windows、64位Windows、OS、HP-UX、AIX5L、Solaris和Linux等多种操作系统,拥有广泛的用户和大量的应用案例,已成为大型数据库应用系统的首选后台数据库系统。

本实验课程要求学生全面了解Oracle数据库的特点和功能。从安装配置、安全性、可用性、互操作性、PL/SQL、可开发性、商业智能等多个方面,对Oracle数据库的各项技术进行学习和实验。

通过学习Oracle数据库安装、管理及开发,为今后从事Oracle数据库管理和开发工作打下良好的基础。

本实验课程共分2个部分。第1部分为Oracle的管理技术,由实验1至实验8组成,内容包括:(1)数据库管理;(2)角色和用户管理;(3)表和视图管理;(4)索引和序列管理;(5)PL/SQL编程;(6)使用游标、存储过程和触发器;(7)表空间;(8)文件管理。第2部分为Oracle开发技术,要求完成基于一定背景的管理信息系统的数据库设计,如学生信息管理系统、图书管理系统、人事信息管理系统、网上购物系统等。

II

第1部分 Oracle管理技术

第1部分 Oracle管理技术

实验1 数据库管理

目的和要求

(1)了解Oracle数据库的逻辑结构和物理结构;(2)了解Oracle Enterprise Manager的使用情况;(3)学习关闭和启动数据库实例的方法;(4)学习使用SQL语句创建数据库的方法;(5)学习使用SQL语句删除数据库的方法。

实验准备

首先要了解Oracle数据库的逻辑结构,包括方案(schema)对象、数据块(data block)、区间(extent)、段(segment)和表空间(tablespace)等。数据库由若干个表空间组成,表空间由表组成,段由区间组成,区间则由数据块组成。Oracle数据库的物理结构由构成数据库的操作系统文件所决定。每个Oracle数据库都由3种类型的文件组成:数据文件、日志文件和控制文件。这些数据库文件为数据库信息提供真正的物理存储。

Enterprise Manager 9i是Oracle 9i提供的新的管理工具,简称EM。使用它可以完成启动、关闭数据库,创建、删除数据库等功能。只有系统管理员或拥有CREATE DATABASE权限的用户才能创建数据库。可以在Enterprise Manager中通过图形界面创建数据库,也可以使用CREATE DATABASE语句创建数据库。

实验内容

本实验主要包括以下内容。

(1)练习使用不同方法启动和关闭数据库实例。

(2)练习使用不同方法创建和删除数据库,要使操作的数据库为用户管理数据库UserMan。

1.使用SHUTDOWN命令关闭数据库实例

练习使用SHUTDOWN命令关闭数据库实例,分别按以下方式启动数据库实例。

(1)正常关闭。等待当前所有已连接的用户断开与数据库的连接,然后关闭数据库。正常关闭的语句如下:

SHUTDOWN NORMAL

(2)立即关闭。回退活动事务处理并断开所有已连接的用户,然后关闭数据库。立即关闭的语句如下:

SHUTDOWN IMMEDIATE

第1部分 Oracle管理技术

(3)事务处理关闭。完成事务处理后断开所有已连接的用户,然后关闭数据库。事务处理关闭的语句如下:

SHUTDOWN TRANSACTIONAL

(4)中止关闭。中止数据库实例,立即关闭数据库。中止关闭的语句如下:

SHUTDOWN ABORT

每次执行SHUTDOWN语句关闭数据库实例之前,请执行STARTUP命令启动数据库。2.使用STARTUP命令启动数据库实例

练习使用STARTUP命令启动数据库实例,分别按以下方式启动数据库实例。(1)启动数据库实例时不装载数据库。执行此操作的命令如下:

STARTUP NOMOUNT

(2)启动数据库实例,装载数据库,但不打开数据库。通常在数据库维护时执行此操作,对应的命令如下:

STARTUP MOUNT

(3)启动数据库实例,装载数据库,打开数据库。执行此操作的命令如下:

STARTUP OPEN

第1部分 Oracle管理技术

(4)强制实例启动。在遇到特殊异常的情况时,可以强制启动实例。强制启动实例的语句如下:

STARTUP FORCE

该语句将数据库强行启动到OPEN模式。

(5)启动后限制对数据库实例的访问。执行此操作的命令如下:

STARTUP RESTRICT

每次执行STARTUP语句启动数据库实例之前,请执行SHUTDOWN命令关闭数据库。3.使用ORACLE Enterprise Manager关闭数据库实例 按照下面的步骤关闭数据库实例。

(1)在数据库处于打开状态时,使用SYS用户以SYSDBA身份登录到Enterprise Manager。在主目录页面的“一般信息”栏目中,可以看到“关闭”按钮。

(2)单击“关闭”按钮,可以打开“主机和目标数据库身份证明”页面。用户需要拥有管理员的权限才能关闭数据库实例,包括主机操作系统的管理员和当前数据库实例的SYSDBA用户。

(3)输入完成后,单击“确定”按钮,打开“确认关闭”页面。

(4)单击“是”按钮,开始关闭数据库。关闭操作完成后,单击“刷新”按钮,打开“启动数据库实例”页面。

4.使用ORACLE Enterprise Manager启动数据库实例 按照下面的步骤启动数据库实例。

第1部分 Oracle管理技术

(1)使用SYS用户以SYSDBA身份登录到Enterprise Manager。

(2)单击“启动”按钮,打开“主机和目标数据库身份证明”页面。用户需要拥有管理员的权限才能启动数据库实例,包括主机操作系统的管理员和当前数据库实例的SYSDBA用户。

(3)输入完成后,单击“确定”按钮,打开“确认打开”页面。(4)单击“是”按钮,开始打开数据库。5.使用SQL语句创建数据库

按照如下条件创建数据库OracleDB(以SYSDBA的用户身份连接到数据库)。

(1)设置SYS用户的密码为SYSPWD,设置SYSTEM用户的密码为SYSTEMPWD。(2)使用已有的控制文件。

(3)指定日志文件组redo01.log,大小为100MB;指定日志文件组redo02.log,大小为100MB。设置最大的日志文件数量为10。

(4)定义日志文件组中最大的日志文件数量为5。(5)定义最大的数据文件数量为100。(6)定义数据库中最大的实例数量为1。(7)定义存储数据的字符集为US7ASCII。

(8)定义数据文件名称为SYS01.dbf,初始大小为100MB。(9)定义默认的表空间为tbs_1。(10)定义临时表空间为tempts1。

(11)定义临时文件为temp01.dbf,大小为10MB。CREATE DATABASE语句实例:

CREATE DATABASE OracleDB

USER SYS IDENTIFIED BY bipt123

USER SYSTEM IDENTIFIED BY bipt123

CONTROLFILE REUSE MAXLOGFILES 10

MAXLOGMEMBERS 5

MAXDATAFILES 100

MAXINSTANCES 1

LOGFILE GROUP 1(‘E:redo01.log’)SIZE 100M ,GROUP 2(E:redo02.log’)SIZE 100M ,CHARACTER SET US7ASCII

DATAFILE ‘E:sys01.dbf’ SIZE 100M REUSE

EXTENT MANAGEMENT LOCAL

DEFAULT TABLESPACE tbs_1

DEFAULT TEMPORARY TABLESPACE tempts1

TEMPFILE ‘E:temp01.dbf’ SIZE 10M REUSE;6.使用SQL语句删除数据库

按照如下步骤删除数据库UserMan。

(1)在删除数据库之前,需要用户以SYSDBA或SYSOPER身份登录,代码如下:

CONNECT SYS/SYSPWD AS SYSDBA;其中SYSPWD为SYS用户的密码,请根据实际情况输入。(2)关闭数据库,再以MOUNT模式启动数据库,代码如下:

第1部分 Oracle管理技术

SHUTDOWN IMMEDIATE;STARTUP MOUNT;(3)删除数据库,代码如下:

DROP DATABASE;

第1部分 Oracle管理技术

实验2 角色和用户管理

目的和要求

(1)了解Oracle数据库用户和角色的概念;(2)学习使用SQL语句创建Oracle用户;(3)学习使用SQL语句创建Oracle角色;(4)学习使用SQL语句指定用户的角色。

实验准备

(1)了解Oracle数据库用户可以分为6种类型,即数据库管理员、安全官员、网络管理员、应用程序开发员、应用程序管理员和数据库用户;

(2)了解角色是对用户的一种分类管理办法,不同权限的用户可以分为不同的角色;(3)了解使用CREATE ROLE语句创建角色的方法;(4)了解使用DROP ROLE语句删除角色的方法;(5)了解使用GRANT语句指定用户角色的方法;(5)了解使用CREATE USER语句创建用户的方法;(4)了解使用DROP USER语句删除用户的方法。

实验内容

本实验主要包括以下内容。

(1)练习使用SQL语句创建数据库角色;

(2)练习使用SQL语句为数据库角色授予权限;(3)练习使用SQL语句指定用户角色;(4)练习使用SQL语句创建数据库用户。

1.使用SQL语句创建数据库角色

参照下面的步骤练习使用CREATE ROLE语句创建数据库角色。(1)以SYSTEM用户登录到SQL*PLUS。

(2)使用CREATE ROLE语句创建角色UserManRole,密码为myrolepwd,代码如下:

CREATE ROLE UserManRole IDENTIFIED BY myrolepwd;

2.使用SQL语句为数据库角色授权

参照下面的步骤练习使用GRANT语句为数据库角色授权。(1)以SYSTEM用户登录到SQL*PLUS。

第1部分 Oracle管理技术

(2)使用GRANT语句将角色UserManRole授予CONNECT和RESOURCE权限,代码如下:

--设置角色权限

GRANT CONNECT TO UserManRole;GRANT RESOURCE TO UserManRole;

3.使用SQL语句创建数据库用户

参照下面的步骤练习使用CREATE USER语句创建数据库用户。(1)以SYSTEM用户登录到SQL*PLUS。

(2)使用CREATE USER语句创建用户UserManAdmin,密码为UserPwd,代码如下:

CREATE USER UserManAdmin IDENTIFIED BY UserPwd

DEFAULT TABLESPACE USERS

TEMPORARY TABLESPACE TEMP;

(3)使用GRANT语句对用户UserManAdmin授予系统权限UNLIMITED TABLESPACE,代码如下:

--设置系统权限

GRANT UNLIMITED TABLESPACE TO UserManAdmin;

4.使用SQL语句指定用户角色

参照下面的步骤将用户UserMan指定为角色UserManRole。(1)以SYSTEM用户登录到SQL*PLUS。

(2)使用GRANT语句将用户UserMan指定为角色UserManRole,代码如下:

GRANT UserManRole TO UserManAdmin;

第1部分 Oracle管理技术

实验3 表和视图管理

目的和要求

(1)了解Oracle表和视图的概念;(2)学习使用SQL语句创建表;

(3)学习使用SELECT语句查询数据;(4)学习使用SQL语句创建视图。

实验准备

(1)了解表是数据库中最常用的数据存储单元,它包括所有用户可以访问的数据。作为关系型数据库,Oracle表由行和列组成。

(2)视图是一个虚拟的表,它在物理上并不存在。视图可以把表或其它视图的数据按照一定的条件组合起来,所以也可以把它看成是一个存储的查询。视图并不包含数据,它只是从基表中读取数据。

(3)了解使用CREATE TABLE语句创建表的方法。(4)了解使用SELECT语句查询数据的方法。(5)了解使用SQL语句创建视图的方法。

实验内容

本实验主要包括以下内容。

(1)练习使用SQL语句创建表;

(2)练习使用SQL语句向表中插入数据;(3)练习使用SQL语句修改表中的数据;(4)练习使用SQL语句删除表中的数据;(5)练习使用SELECT语句查询数据;(6)练习使用SQL语句创建视图。

1.使用SQL语句创建表

使用CREATE TABLE语句创建用户信息表Users,结构如表1所示。

表1 表Users的结构

号 1 2 3 4 字段名称 UserId UserName UserType UserPwd

数据结构 NUMBER VARCHAR2 40 NUMBER 1 VARCHAR2 40

用户编号 用户名

用户类型(1 管理员用户,2 普通用户)

参照下面的步骤练习使用CREATE TABLE语句创建表Users。

(1)以实验2中创建的UserManAdmin用户登录到SQL*PLUS。(2)使用CREATE TABLE语句创建表Users,代码如下:

CREATE TABLE UserManAdmin.Users(UserId

UserName UserType

Number Primary Key, Varchar2(40)NOT NULL, Number(1),第1部分 Oracle管理技术

UserPwd);Varchar2(40)使用CREATE TABLE语句创建用户登录信息表LoginInfo,结构如表2所示。

表2 表LoginInfo的结构

号 1 2

字段名称 UserId LoginTime

数据结构 NUMBER CHAR(20)

明 用户编号 登录时间

参照下面的步骤练习使用CREATE TABLE语句创建表LoginInfo。(1)以实验2中创建的UserManAdmin用户登录到SQL*PLUS。(2)使用CREATE TABLE语句创建表LoginInfo,代码如下:

CREATE TABLE UserManAdmin.LoginInfo(UserId

LoginTime);Number, CHAR(20)NOT NULL 2.使用SQL语句向表中插入数据

使用INSERT语句向表Users中插入用户数据,内容如表3所示。

表3 表Users中的数据

UserId 1 2 3 4

UserName Admin User Zhangsan Lisi

UserType 2 2 2

UserPwd AdminPwd UserPwd ZhangsanPwd LisiPwd 参照下面的步骤练习使用INSERT语句向表Users中插入数据。(1)以实验2中创建的UserManAdmin用户登录到SQL*PLUS。(2)使用INSERT语句向表Users中插入数据,代码如下:

INSERT INTO UserManAdmin.Users VALUES(1, ‘Admin’, 1, ‘AdminPwd’);INSERT INTO UserManAdmin.Users VALUES(2, ‘User’, 2, ‘UserPwd’);INSERT INTO UserManAdmin.Users VALUES(3, ‘Zhangsan’, 2, ‘ZhangsanPwd’);INSERT INTO UserManAdmin.Users VALUES(4, ‘Lisi’, 2, ‘LisiPwd’);COMMIT;使用INSERT语句向表LoginInfo中插入数据。内容如表4所示。参照下面的步骤练习使用INSERT语句向表LoginInfo中插入数据。(1)以实验2中创建的UserManAdmin用户登录到SQL*PLUS。(2)使用INSERT语句向表LoginInfo中插入数据,代码如下:

INSERT INTO UserManAdmin.LoginInfo VALUES(1, ‘2012-5-15 10:33:02’);INSERT INTO UserManAdmin.LoginInfo VALUES(1, ‘2012-5-16 08:34:13’);INSERT INTO UserManAdmin.LoginInfo VALUES(1, ‘2012-5-17 09:13:11’);INSERT INTO UserManAdmin.LoginInfo VALUES(2, ‘2012-5-15 07:35:02’);INSERT INTO UserManAdmin.LoginInfo VALUES(2, ‘2012-5-16 08:11:54’);INSERT INTO UserManAdmin.LoginInfo VALUES(2, ‘2012-5-17 09:13:11’);INSERT INTO UserManAdmin.LoginInfo VALUES(3, ‘2012-5-15 08:34:02’);INSERT INTO UserManAdmin.LoginInfo VALUES(3, ‘2012-5-16 09:34:13’);

第1部分 Oracle管理技术

INSERT INTO UserManAdmin.LoginInfo VALUES(3, ‘2012-5-17 10:13:09’);INSERT INTO UserManAdmin.LoginInfo VALUES(4, ‘2012-5-15 11:34:02’);INSERT INTO UserManAdmin.LoginInfo VALUES(4, ‘2012-5-16 13:34:13’);INSERT INTO UserManAdmin.LoginInfo VALUES(4, ‘2012-5-17 15:13:12’);COMMIT;

表4 表LoginInfo中的数据

UserId 1 1 1 2 2 2 3 3 3 4 4 4

LoginTime 2012-5-15 10:33:02 2012-5-16 08:34:13 2012-5-17 09:13:11 2012-5-15 07:35:02 2012-5-16 08:11:54 2012-5-17 09:13:11 2012-5-15 08:34:02 2012-5-16 09:34:13 2012-5-17 10:13:09 2012-5-15 11:34:02 2012-5-16 13:34:13 2012-5-17 15:13:12 3.使用SQL语句修改表中的数据

使用UPDATE语句可以修改表Users中的数据。参照下面的步骤练习将表Users中Admin用户的密码修改为AdminPassword。

(1)以SYSTEM用户登录到SQL*PLUS。

(2)使用UPDATE语句将表Users中Admin用户的密码修改为AdminPassword,代码如下:

UPDATE UserManAdmin.Users SET UserPwd=‘AdminPassword’ WHERE UserName=‘Admin’

(3)使用SELECT语句查看用户Admin的密码,代码如下:

SELECT UserPwd FROM UserManAdmin.Users WHERE UserName=‘Admin’

修改表

ALTER TABLE USERMANADMIN.LOGININFO MODIFY(LOGINTIME DATE)4.使用SQL语句删除表中的数据

使用DELETE语句可以删除表Users中的数据。参照下面的步骤练习将表Users中Zhansan用户的记录删除。

(1)以SYSTEM用户登录到SQL*PLUS。

(2)使用DELETE语句将表Users中Zhangsan用户的记录删除,代码如下:

DELETE FROM UserManAdmin.Users WHERE UserName=‘Zhangsan’

(3)使用SELECT语句查看表Users中的数据,确认用户Zhangsan的记录是否被删除,代码如下:

SELECT * FROM UserManAdmin.Users 5.使用SELECT语句查询数据

使用SELECT语句查询数据库中的用户数据,分别按以下方式查询数据库。

第1部分 Oracle管理技术

(1)查询表Users中的所有数据。

以SYSTEM用户登录到SQL*PLUS,然后执行如下代码:

SELECT * FROM UserManAdmin.Users *代表UserManAdmin.Users中的所有字段。(2)在返回结果中使用自定义标题。

以SYSTEM用户登录到SQL*PLUS,然后执行如下代码:

SELECT UserName AS 用户名, UserPwd AS 密码 FROM UserManAdmin.Users(3)设置查询条件。

查询所有普通用户的信息。以SYSTEM用户登录到SQL*PLUS,然后执行如下代码:

SELECT * FROM UserManAdmin.Users WHERE UserType=2 查询用户Admin的密码信息。以SYSTEM用户登录到SQL*PLUS,然后执行如下代码:

SELECT UserPwd FROM UserManAdmin.Users WHERE UserName=‘Admin’

(4)对查询结果进行排序。

查询所有普通用户的信息,并按用户名的降序排列结果集。以SYSTEM用户登录到SQL*PLUS,然后执行如下代码:

SELECT * FROM UserManAdmin.Users ORDER BY UserName DESC(5)对记录进行统计。

统计表Users中共有多少个用户记录。以SYSTEM用户登录到SQL*PLUS,然后执行如下代码:

SELECT COUNT(*)FROM UserManAdmin.Users(6)实现连接查询。

查看每个用户的登录记录。以SYSTEM用户登录到SQL*PLUS,然后执行如下代码:

SELECT u.UserName, 1.LoginTime FROM Users u INNER JOIN LoginInfo 1 ON u.UserId=1.UserID 在上面的SELECT语句中涉及两个表:表Users和表LoginInfo。在FROM子句中,为每个表指定一个别名,表Users的别名为u,表LoginInfo的别名为1。

6.使用SQL语句创建视图

使用CREATE VIEW语句创建用户登录信息表UserLogin,代码如下:

CREATE VIEW UserLogin AS SELECT u.UserName,l.LoginTime

FROM

UserManAdmin.Users

u

INNER

JOIN UserManAdmin.LoginInfo l ON u.UserId=l.UserID;

SELECT * FROM UserLogin;

第1部分 Oracle管理技术

实验4 索引和序列管理

目的和要求

(1)了解索引的概念和作用;(2)了解序列的概念和作用;

(3)学习使用SQL语句创建索引;(4)学习使用SQL语句创建序列。

实验准备

(1)了解索引是对数据库表中一个或多个列的值进行排序的结构。可以利用索引快速访问数据库表中的特定信息。

(2)了解序列号是一个Oracle整数,最多可有38个数字。序列的作用是自动生成整型数值,作为表中标识字段的值。有许多表在创建时定义了一个标识字段,此字段的值需要由系统自动生成,每当插入一条新记录时,此字段的值自动加1。在Oracle中,这个功能由序列来实现。

(3)了解使用CREATE INDEX语句创建索引的方法。

(4)了解使用CREATE SEQUENCE语句创建序列的方法。

实验内容

本实验主要包括以下内容。

(1)练习使用SQL语句创建索引;(2)练习使用SQL语句创建序列;

1.使用SQL语句创建索引

使用CREATE INDEX语句在Users表的UserName字段上创建索引。代码如下:

CREATE INDEX index_username ON UserManAdmin.Users(UserName)TABLESPACE Users;

2.在创建表的同时创建索引

在使用CREATE TABLE语句创建表的同时,可以为指定字段创建索引。创建表Employees,在字段EmpName上创建索引。表Employees的结构如表5所示。

表5 表Employees的结构

号 1 2 3 4

字段名称 EmpId EmpName Sex UserId

数据结构 NUMBER VARCHAR2(50)CHAR(2)NUMBER

明 编号 姓名 性别 用户编号

代码如下:

CREATE TABLE UserManAdmin.Employees(EmpId

EmpName Sex

Number, VARCHAR2(50)UNIQUE, CHAR(2),第1部分 Oracle管理技术

UserId);Number 3.使用SQL语句创建序列

使用CREATE SEQUENCE语句创建序列。序列的最小值为1,并且没有最大值限制。序列的初始值为1,序列间隔为1。代码如下:

CREATE SEQUENCE EMP_S MINVALUE 1 NOMAXVALUE START WITH 1 INCREMENT BY 1 NOCYCLE CACHE 20;2.在插入数据时使用序列

在使用INSERT语句向表Employees中插入数据时,可以使用序列EMP_S生成字段EmpId的值,代码如下:

INSERT INTO UserManAdmin.Employees(EmpId, EmpName)VALUES(EMP_S.NEXTVAL, ‘Employee1’);INSERT INTO UserManAdmin.Employees(EmpId, EmpName)VALUES(EMP_S.NEXTVAL, ‘Employee2’);INSERT INTO UserManAdmin.Employees(EmpId, EmpName)VALUES(EMP_S.NEXTVAL, ‘Employee3’);COMMIT;SELECT * FROM UserManAdmin.Employees

第1部分 Oracle管理技术

实验5 PL/SQL编程

目的和要求

(1)了解PL/SQL语言的结构;

(2)了解PL/SQL变量和常量的声明和使用方法;(3)学习条件语句的使用方法;(4)学习分支语句的使用方法;(5)学习循环语句的使用方法;(6)学习使用Oracle系统函数。

实验准备

首先要了解PL/SQL语言是结构化程序设计语言。块(Block)是PL/SQL程序中最基本的结构,所有PL/SQL程序都是由块组成的。PL/SQL的块由变量声明、程序代码和异常处理代码3部分组成。在PL/SQL中,常量和变量在使用前必须声明,可以使用DECLARE对变量进行声明。

实验内容

本实验主要包括以下内容。

(1)练习条件语句的使用方法;(2)练习分支语句的使用方法;(3)练习循环语句的使用方法;(4)练习使用Oracle系统函数。

1.使用条件语句

参照下面的步骤练习使用条件语句。

(1)以SYSTEM用户登录到SQL*PLUS。(2)执行如下程序,观察结果。

SET ServerOutput ON;DECLARE

Num INTEGER :=-11;BEGIN

IF Num < 0 THEN

dbms_output.put_line(‘负数’);

ELSIF Num > 0 THEN

dbms_output.put_line(‘正数’);

ELSE

dbms_output.put_line(‘0’);

END IF;END;

第1部分 Oracle管理技术

2.使用分支语句

参照下面的步骤练习使用分支语句。

(1)以SYSTEM用户登录到SQL*PLUS。(2)执行如下程序,观察结果。

SET ServerOutput ON;DECLARE

varDAY INTEGER := 3;

Result VARCHAR(20);BEGIN

Result := CASE varDAY

WHEN 1 THEN ‘星期一’

WHEN 2 THEN ‘星期二’

WHEN 3 THEN ‘星期三’

WHEN 4 THEN ‘星期四’

WHEN 5 THEN ‘星期五’

WHEN 6 THEN ‘星期六’

WHEN 7 THEN ‘星期日’

ELSE ‘数据越界’

END;

dbms_output.put_line(Result);END;

第1部分 Oracle管理技术

3.使用循环语句

LOOP…EXIT…END语句:此语句的功能是重复执行循环体中的程序块,直到执行EXIT语句,退出循环。

LOOP…EXIT WHEN…END:此语句的功能是重复执行循环体中的程序块,直到满足EXIT WHEN后面的判断语句时,退出循环。

WHILE…LOOP…END LOOP语句:此语句的功能是当WHILE后面的条件语句成立时,重复执行循环体中的程序块。

参照下面的步骤练习使用循环语句。

(1)以SYSTEM用户登录到SQL*PLUS。(2)执行如下程序,观察结果。

程序一:

SET ServerOutput ON;DECLARE

v_Num INTEGER := 1;

v_Sum INTEGER := 0;BEGIN

LOOP

v_Sum := v_Sum + v_Num;

dbms_output.put_line(v_Num);

IF v_Num = 3 THEN

EXIT;

END IF;

dbms_output.put_line(‘+’);

v_Num := v_Num + 1;

END LOOP;

dbms_output.put_line(‘=’);

dbms_output.put_line(v_Sum);END;

程序二:

SET ServerOutput ON;DECLARE

v_Num INTEGER := 1;

v_Sum INTEGER := 0;BEGIN

LOOP

v_Sum := v_Sum + v_Num;

第1部分 Oracle管理技术

dbms_output.put_line(v_Num);

EXIT WHEN v_Num = 3;

dbms_output.put_line(‘+’);

v_Num := v_Num + 1;

END LOOP;

dbms_output.put_line(‘=’);

dbms_output.put_line(v_Sum);END;

程序三:

SET ServerOutput ON;DECLARE

v_Num INTEGER := 1;

v_Sum INTEGER := 0;BEGIN

WHILE v_Num <=3

LOOP

v_Sum := v_Sum + v_Num;

dbms_output.put_line(v_Num);

IF v_Num < 3 THEN

dbms_output.put_line(‘+’);

END IF;

v_Num := v_Num + 1;

END LOOP;

dbms_output.put_line(‘=’);

dbms_output.put_line(v_Sum);END;

第1部分 Oracle管理技术

4.使用系统函数(1)数值型函数

·ABS:返回给定数字表达式的绝对值。

·CEIL:返回大于或等于所给数字表达式的最小整数。·FLOOR:返回小于或等于所给数字表达式的最大整数。·POWER:返回给定表达式指定次方的值。

·ROUND:返回数字表达式并四舍五入为指定的长度或精度。(2)字符型函数

·ASCII:返回字符表达式最左端字符的ASCII代码值。·LENGTH:返回给定字符串表达式的字符(而不是字节)个数,其中不包含尾随空格。·UPPER:返回将小写字符数据转换为大写的字符表达式。(3)日期型函数

·SYSDATE:返回当前日期和时间。·TO_CHAR:转换日期为字符串。

·LAST_DAY:返回指定日期所在月份的最后一天的日期。这个函数可以被用来确定当前月中还剩下多少天。

·MONTHS_BETWEEN:返回两个日期之间月的数目。(4)统计函数

·COUNT:返回组中项目的数量。·MAX:返回表达式的最大值。·MIN:返回表达式的最小值。

参照下面的步骤练习使用系统函数。

(1)以SYSTEM用户登录到SQL*PLUS。(2)执行如下程序,观察结果。

程序一:

SET ServerOutput ON;BEGIN

dbms_output.put_line(ABS(-4));END;

程序二:

SET ServerOutput ON;BEGIN

dbms_output.put_line(CEIL(116.24));

dbms_output.put_line(CEIL(-112.75));

dbms_output.put_line(CEIL(0));END;

第1部分 Oracle管理技术

程序三:

SET ServerOutput ON;BEGIN

dbms_output.put_line(FLOOR(116.24));

dbms_output.put_line(FLOOR(-112.75));

dbms_output.put_line(FLOOR(0));END;

程序四:

SET ServerOutput ON;BEGIN

dbms_output.put_line(POWER(15, 4));END;

程序五:

SET ServerOutput ON;BEGIN

dbms_output.put_line(ROUND(123.456, 2));

dbms_output.put_line(ROUND(123.456, 1));

dbms_output.put_line(ROUND(123.456, 0));

dbms_output.put_line(ROUND(123.456,-1));

dbms_output.put_line(ROUND(123.456,-2));

dbms_output.put_line(ROUND(123.456,-3));END;

程序六:

SET ServerOutput ON;BEGIN

dbms_output.put_line(ASCII(‘ABC’));END;

第1部分 Oracle管理技术

程序七:

SELECT UserName, LENGTH(UserName)FROM UserManAdmin.Users WHERE UserType = 1;程序八:

SET ServerOutput ON;BEGIN

dbms_output.put_line(UPPER(‘abc’));END;

程序九:

SET ServerOutput ON;BEGIN

dbms_output.put_line(SYSDATE);END;

程序十:

SET ServerOutput ON;BEGIN

dbms_output.put_line(TO_CHAR(SYSDATE));END;

程序十一:

SET ServerOutput ON;BEGIN

dbms_output.put_line(LAST_DAY(SYSDATE));END;

第1部分 Oracle管理技术

程序十二:

SET ServerOutput ON;DECLARE

date1 VARCHAR(20):= ‘2010-05-17’;

date2 VARCHAR(20):= ‘2010-10-17’;BEGIN

dbms_output.put_line(END;

MONTHS_BETWEEN(TO_DATE(date2,‘yyyy-mm-dd’), TO_DATE(date1, ‘yyyy-mm-dd’)));

程序十三:

SELECT COUNT(UserName)FROM UserManAdmin.Users;

程序十四:

SELECT MAX(UserId)FROM UserManAdmin.Users;

程序十五:

SELECT MIN(UserId)FROM UserManAdmin.Users;

第1部分 Oracle管理技术

实验6 使用游标、存储过程和触发器

目的和要求

(1)了解游标的概念和工作原理;(2)了解存储过程的分类和使用方法;(3)了解触发器的概念;

(4)学习编写和执行自定义过程;(5)学习编写和执行自定义函数;(6)学习创建和使用触发器。

实验准备

首先要了解游标是映射在结果集中一行数据上的位置实体,有了游标,用户就可以访问结果集中的任意一行数据了。将游标放置到某行后,即可对该行数据进行操作,最常见的操作是提取当前行数据。

了解PL/SQL包括3种存储过程,即过程、函数和程序包。

了解触发器是一种特殊的存储过程,当指定表中的数据发生变化时自动运行。

实验内容

本实验主要包括以下内容。

(1)练习创建和使用游标的方法;

(2)练习编写和执行自定义过程的方法;(3)练习编写和执行自定义函数的方法;(4)练习创建和使用触发器的方法。

1.创建和使用游标

创建游标MyCursor,从表LoginInfo中读取指定用户的登录信息,操作步骤如下:(1)以UserManAdmin用户登录到SQL*PLUS。(2)执行如下程序:

/*打开显示模式*/ SET ServerOutput ON;DECLARE

CURSOR Mycursor(varUserName VARCHAR2)IS

SELECT u.UserName,l.LoginTime

FROM

UserManAdmin.Users

u, UserManAdmin.LoginInfo l

WHERE u.UserId =l.UserId;BEGIN

FOR var_LoginRecord IN MyCursor(‘Admin’)LOOP

dbms_output.put_line(‘用户名:’ || var_LoginRecord.UserName || ‘, 登录时间:’ || var_LoginRecord.LoginTime);

END LOOP;END;

第1部分 Oracle管理技术

2.编写和执行自定义过程

参照下面的步骤练习编写和执行自定义过程:(1)以UserManAdmin用户登录到SQL*PLUS。(2)执行如下程序,观察结果。

/*创建示例过程ResetPwd,此过程的功能是将表User中指定用户的密码重置为111111*/ CREATE OR REPLACE PROCEDURE UserManAdmin.ResetPwd(u_UserId IN NUMBER)AS BEGIN UPDATE UserManAdmin.Users SET UserPwd = ‘111111’ WHERE UserId = u_UserId;END;

/*使用EXEXUTE命令可以调用过程。如,要将编号为1(用户Admin)的用户密码重置*/ EXECUTE UserManAdmin.ResetPwd(1);SELECT UserName, UserPwd FROM Users;

第1部分 Oracle管理技术

/*使用DROP PROCEDURE命令可以删除过程*/ DROP PROCEDURE UserManAdmin.ResetPwd;

3.编写和执行自定义函数

参照下面的步骤练习编写和执行自定义函数GetLastLogin,获取指定用户最后一次登录的时间。

(1)以SYSTEM用户登录到SQL*PLUS。(2)执行如下程序:

CREATE OR REPLACE FUNCTION GetLastLogin(n_name IN UserManAdmin.Users.UserName%Type)RETURN UserManAdmin.LoginInfo.LoginTime%Type AS outTime UserManAdmin.LoginInfo.LoginTime%Type;BEGIN

SELECT MAX(l.LoginTime)INTO outTime FROM UserManAdmin.Users u join UserManAdmin.LoginInfo l on u.UserId = l.UserId

WHERE u.UserName = ‘’|| n_name ||’’

ORDER BY l.LoginTime DESC;

RETURN outTime;END;

4.创建和使用触发器

参照下面的步骤创建一个触发器MyTrigger,它的作用是当表Users中的记录被删除后,自动删除表LoginInfo中对应的用户登录记录,从而保证数据的完整性。

(1)以SYSTEM用户登录到SQL*PLUS。(2)执行如下程序,观察结果。

CREATE OR REPLACE TRIGGER UserManAdmin.MyTrigger AFTER DELETE ON UserManAdmin.Users FOR EACH ROW BEGIN

DELETE FROM UserManAdmin.LoginInfo WHERE UserId = :old.UserId;END;

第1部分 Oracle管理技术

(3)执行下面的语句,观察删除用户Users后,在表LoginInfo中是否还存在其登录的记录。

DELETE FROM UserManAdmin.Users WHERE UserName =’User’;

SELECT * FROM UserManAdmin.LoginInfo

第1部分 Oracle管理技术

实验7 表空间管理

目的和要求

(1)了解表空间的概念和工作原理;

(2)学习创建、修改、查询和删除用户表空间;

(3)学习创建、修改、查询、切换和删除撤销表空间。

实验准备

首先要了解表空间是Oracle数据库最高层次的逻辑存储结构,其中保存着由段、区和块等逻辑存储结构描述的各种模式对象。

Oracle表空间分为系统表空间、临时表空间、撤销表空间和用户表空间4种类型。用户表空间主要用来保存用户数据,其包含的数据文件称为用户数据文件,是DBA管理的主要表空间。

保存撤销记录的存储空间是撤销表空间。利用撤销表空间可以实现撤销事务、数据库恢复和数据的读一致性等功能。

实验内容

本实验主要包括以下内容。

(1)练习创建和使用用户表空间的方法;(2)练习创建和使用撤销表空间的方法。

1.创建本地管理方式的用户表空间

为Oracle数据库新建一个用户表空间,该表空间中包括2个数据文件,区的分配管理方式为AUTOALLOCATE或UNIFORM,段的存储管理方式为MANUAL或AUTO。操作步骤如下:

(1)在SQL*Plus中执行CREATE TABLESPACE语句创建新的用户表空间,并通过查询V$TABLESPACE视图查看新建用户表空间情况。

Create tablespace newspace Datafile ‘D:oracleoradatanew01.dbf’ size 10m

第1部分 Oracle管理技术

(2)通过OEM控制台创建新的临时表空间,并查看新建用户表空间情况。

2.创建本地管理方式的临时表空间

为Oracle数据库新建一个临时表空间,该表空间中包括1个数据文件,并设置该表空间为默认临时表空间。操作步骤如下:

(1)在SQL*Plus中执行CREATE TEMPORARY TABLESPACE语句创建新的临时表空间,设置该表空间为默认临时表空间,并通过查询V$TABLESPACE视图查看新建临时表空间情况。

CREATE TEMPORARY TABLESPACE newtemp tempfile 'D:oracleoradatanewtemp01.dbf' size 10m;

select * from V$tablespace;

(2)通过OEM控制台创建新的临时表空间,设置该表空间为默认临时表空间,并查看新建临时表空间情况。

3.改变表空间的可用性

将新建的用户表空间设置为脱机状态,之后再将其改为联机状态。操作步骤如下:(1)在SQL*Plus中执行ALTER TABLESPACE语句设置表空间为脱机状态,并通过查询DBA_TABLESPACES视图查看表空间的状态,之后再执行ALTER TABLESPACE语句设置表空间为联机状态。

Alter tablespace newspace Add datafile ‘D:oracleoradatanew02.dbf’ size 10m

第1部分 Oracle管理技术

(2)通过OEM控制台设置表空间为脱机状态或联机状态,并查看修改之后的表空间状态。

4.删除表空间

删除无用的表空间及其在磁盘上的数据文件。操作步骤如下:

(1)在SQL*Plus中执行DROP TABLESPACE语句删除表空间及其在磁盘上的数据文件。

Drop tablespace newspace;

(2)通过OEM控制台删除表空间及其在磁盘上的数据文件。

5.查询表空间的各种信息

查询表空间的各种信息。操作步骤如下:(1)在SQL*Plus中查询V$TABLESPACE、DBA_TABLESPACES、DBA_SEGMENTS、DBA_EXTENTS、DBA_FREE_SPACE、V_$DATAFILE和V$TEMPFILE动态性能视图获得表空间的信息。

(2)在OEM控制台中查询表空间的信息。

6.创建撤销表空间

在数据库建立后创建一个撤销表空间,并设置该表空间为默认撤销表空间。操作步骤如

第1部分 Oracle管理技术

下:

(1)在SQL*Plus中执行CREATE UNDO TABLESPACE语句创建一个撤销表空间,并执行ALTER SYSTEM语句修改初始化参数UNDO_TABLESPACE,设置该撤销表空间为默认撤销表空间。

CREATE UNDO TABLESPACE undotb datafile 'D:oracleoradataundotb01.dbf' size 2m reuse;

(2)通过OEM控制台向某一撤销表空间中添加新的数据文件,并查看新的数据文件情况。

7.查询撤销表空间的各种信息

查询表空间的各种信息。操作步骤如下:

(1)在SQL*Plus中查询V$UNDOSTAT、V$ROLLSTAT、V$TRANSACTION、DBA_UNDO_EXTENTS动态性能视图获得撤销表空间的信息。

select * from V$tablespace;

(2)利用V$UNDOSTAT动态性能视图计算撤销表空间所需要的存储空间。

第1部分 Oracle管理技术

实验8 文件管理

目的和要求

(1)了解初始化参数文件、控制文件、重做日志文件和数据文件的概念;(2)学习创建和使用初始化参数文件;

(3)学习创建、备份、查询和删除控制文件;(4)学习创建和使用重做日志文件;

(5)学习添加、移动、查询和删除数据文件。

实验准备

首先要了解初始化参数文件是Oracle实例运行所需的参数配置文件,Oracle数据库的物理结构、实例中的内存结构,以及启动后台进程的种类和数量等参数,都需要在初始化参数文件中设置,是数据库运行和性能调整的重要文件。初始化参数文件分为两类:PFILE和SPFILE。PFILE是文本形式的初始化参数文件,可以利用任何文本编辑器对它进行查看或编辑。SPFILE的作用同PFILE一样,但是该文件是二进制的,无法用文本编辑器查看或修改。

控制文件是一个非常小的二进制文件,其中存放有Oracle数据库物理结构(数据文件和重做日志文件等)的信息,是Oracle启动和运行必备的文件。

重做日志文件中保存着事物对数据库进行的修改的重做项,是数据库进行恢复的必要部分。重做日志文件分为联机重做日志文件和归档重做日志文件。

数据文件是Oracle主要的物理存储结构之一。一个表空间可以有多个数据文件,一个数据文件只属于一个表空间。数据文件可分成系统数据文件、撤销数据文件、临时数据文件和用户数据文件。

实验内容

本实验主要包括以下内容。

(1)练习创建和使用初始化参数文件;(2)练习创建和使用控制文件;(3)练习创建和使用重做日志文件;(4)练习添加和使用数据文件。

1.创建初始化参数文件

创建PFILE和SPFILE文件。操作步骤如下:

(1)找到已有的PFILE文件,使用COPY或者在Windows资源管理器中使用复制/粘贴功能,创建一个新的PFILE文件。

(2)使用CREATE PFILE FROM SPFILE命令创建一个新的PFILE文件。

第1部分 Oracle管理技术

(3)利用OEM创建一个新的PFILE文件。

(4)使用CREATE SPFILE FROM PFILE命令创建一个新的SPFILE文件。create spfile='D:oracleora92databaseininew01.ora' pfile='D:oracleadminBIPT921pfile init.ora.23201322748';

from

(5)利用OEM创建一个新的SPFILE文件。

2.修改初始化参数

修改SPFILE文件中的初始化参数。操作步骤如下:

(1)在SQL*Plus中使用动态性能视图V$SYSTEM_PARAMETER查看初始化参数值和属性。

(2)使用ALTER SYSTEM SET 参数名=参数值 SCOPE=SPFILE | MEMORY | BOTH

第1部分 Oracle管理技术

命令修改其中的动态或静态的初始化参数。

(3)再使用动态性能视图V$SYSTEM_PARAMETER或在OEM中查看初始化参数值是否被修改。

(4)或者在OEM中修改其中的初始化参数,并查看初始化参数值和属性。3.备份控制文件

为Oracle数据库备份一个控制文件。操作步骤如下:

(1)使用ALTER DATABASE BACKUP CONTROLFILE TO命令备份控制文件。

(2)在OEM控制台中备份控制文件。

4.查询控制文件信息

查询控制文件中的各种信息。操作步骤如下:(1)在SQL*Plus中查询V$CONTROLFILE、V$CONTROLFILE_RECORD_SECTION、V$PARAMETER动态性能视图获得控制文件的基本信息和记录文档段信息。

第1部分 Oracle管理技术

(2)在OEM控制台中查询控制文件的基本信息和记录文档段信息。

5.创建多路联机重做日志文件组

为Oracle数据库新建一个联机重做日志组,该组包含2个成员。操作步骤如下:(1)使用SYSDBA身份登录SQL*Plus。

(2)查询V$LOGLFILE视图,了解目前的重做日志文件组情况。

(3)执行ALTER DATABASE ADD LOGFILE命令增加一个重做日志文件组,该组包含2个成员。

(4)重新查询V$LOGLFILE视图,查看新建重做日志文件组情况。

6.使用LogMiner Viewer工具对重做日志文件进行分析

使用LogMiner Viewer工具分析重做日志文件,获得指定用户在规定的时间段内对数据库所进行的更改。操作步骤如下:

(1)启动OEM控制台,登录Oracle管理服务器。(2)启动LogMiner Viewer。(3)设置查询条件。

(4)执行并分析查询结果。(5)保存分析结果。

7.向表空间中添加数据文件

向表空间中添加一个新的数据文件。操作步骤如下:(1)在SQL*Plus中使用ALTER TABLESPACE...ADD DATAFILE语句向某一表空间中添加一个数据文件,并通过查询DBA_DATA_FILES视图查看新建数据文件的情况。

ALTER TABLESPACE dtf add datafile 'D:oracleadminBIPT921pfileinit.ora.23201322748' size 10m reuse;

第1部分 Oracle管理技术

(2)通过OEM控制台添加新的数据文件,并查看新的数据文件情况。

8.移动单个数据文件

将表空间中某个数据文件从一个物理磁盘移动到另一个磁盘。操作步骤如下:

(1)在SQL*Plus中使用ALTER TABLESPACE语句将包含有需要移动数据文件的表空间脱机。

ALTER TABLESPACE dtf offline;

(2)在操作系统中,将数据文件复制到另一个磁盘上。

(3)使用ALTER TABLESPACE语句对表空间中的数据文件重命名。alter tablespace XDB rename datafile'XDB01.DBF'to'XDB02.DBF'(4)使用ALTER TABLESPACE语句重新使该表空间联机。ALTER TABLESPACE dtf online;

(5)通过查询DBA_DATA_FILES视图获得移动后的数据文件信息。9.删除数据文件

删除无用的数据文件。操作步骤如下:

(1)在SQL*Plus中使用ALTER DATABASE语句删除某一数据文件。

(2)通过OEM控制台删除某一数据文件。

10.查询数据文件的各种信息

查询数据文件的各种信息。操作步骤如下:

第1部分 Oracle管理技术

(1)在SQL*Plus中查询DBA_DATA_FILES、DBA_EXTENTS、DBA_FREE_SPACE、V$DATAFILE、V$DATAFILE_HEADER动态性能视图获得数据文件的信息。

(2)在OEM控制台中查询数据文件的信息。

第2部分 Oracle开发技术

第2部分 Oracle开发技术

设计目的

利用所学的有关数据库设计知识,设计一个基于Oracle数据库的信息管理系统。通过该部分的操作与实践,使学生能够在完成第一部分任务的基础上,进一步巩固Oracle数据库应用的方法和技术,提高基于Oracle数据库的应用程序综合设计能力。

设计任务

 数据库设计:

(1)通过对应用系统的数据库需求分析,确定系统的服务范围,绘制系统业务流程图,设计系统功能和绘制系统功能图,设计数据流图和数据字典;

(2)采用自底向上的方法设计E-R图;

(3)依据关系规范化原则设计应用系统数据库全局关系模式;(4)依照数据库全局关系模式设计数据库中各表的表结构。 界面设计:(1)数据库准备;

(2)创建工程并添加所需控件;(3)主要功能模块的界面设计。

设计题目

1.图书管理系统

图书管理系统包括对所有图书基本信息的维护,实现图书管理的需求,包括图书档案、图书查询、图书资料统计和图书借阅、归还等功能。

图书管理系统读者信息用户图书信息管理图书借阅管理读者号读者名已借数量最大借阅数量用户名密码ISBN书名作者出版社数量图书借阅图书归还

第2部分 Oracle开发技术

建立角色:

CREATE ROLE br IDENTIFIED BY asd;GRANT CONNECT TO br;GRANT RESOURCE TO br;

建立用户:

CREATE USER Book IDENTIFIED BY asd DEFAULT TABLESPACE USERS TEMPORARY TABLESPACE TEMP;授权:

GRANT UNLIMITED TABLESPACE TO Book;GRANT br TO Book;

建立bookusers表

CREATE TABLE Book.BookUsers(UserId Number Primary Key, UserName Varchar2(40)NOT NULL, UserType Number(10), UserPwd Varchar2(40));

create table book.reader

第2部分 Oracle开发技术

(reader_id varchar(20)primary key, reader_name varchar(20), maxlend int, alreadylen int)

create table borrow(reader_id varchar(20), ISBN varchar(20), lendtime date, returntime date, primary key(reader_id,ISBN))foreign key(reader_id)references book.reader(reader_id), foreign key(ISBN)references book(ISBN)

插入数据:

INSERT INTO Book.BookUsers VALUES(1, ‘shang’, 1, ‘123’);INSERT INTO Book.BookUsers VALUES(2, ‘zhang’, 2, ‘456’);

INSERT INTO Book.BookUsers VALUES(3, ‘shangjingwei’, 2, ‘asd123’);INSERT INTO Book.BookUsers VALUES(4, ‘zhanghongkai’, 2, ‘asd123’);COMMIT;

第2部分 Oracle开发技术

//创建序列

CREATE SEQUENCE userid MINVALUE 1 NOMAXVALUE START WITH 1 INCREMENT BY 1 NOCYCLE NOCACHE

//触发器创建

CREATE OR REPLACE TRIGGER Book.NewMyTrigger before Insert ON Book.BookUsers FOR each row begin select userid.nextval into :new.userid from dual;END;

string cmdString = “insert into Book.BookUsers(UserId,UserName,UserPwd)(xl_1.nextval,'” + student_numer.Text + “','” + password.Text + “')”;登录窗口:

values 第2部分 Oracle开发技术

String oraString = “ Data Source=(DESCRIPTION=(ADDRESS_LIST=(ADDRESS=(PROTOCOL=TCP)(HOST=localhost)(PORT=1521)))(CONNECT_DATA=(SERVER=DEDICATED)(SERVICE_NAME=BOOK)));User ID=system;Password=asd”;//数据库连接语句

查询图书:

String bookname = “";String bookisbn = ”“;String bmark = ”“;if(textBox1.Text!= ”“)bookisbn =(”ISBN = '“ + textBox1.Text + ”'“);if((textBox2.Text!= ”“)&&(textBox1.Text!= ”“))bookname =(”AND book_name='“ + textBox2.Text + ”'“);else if(textBox2.Text!= ”“)bookname =(”book_name='“ + textBox2.Text + ”'“);bmark = bookname + bookisbn;

if(radioButton2.Checked){ //添加精确查询的代码 if(bmark!= ”“)dataCommand.CommandText = ”SELECT * FROM book.book WHERE “ + bmark;else if(bmark == ”“)

第2部分 Oracle开发技术

MessageBox.Show(”请输入查询数据!“);} else if(radioButton1.Checked){ if(textBox1.Text!= ”“)MessageBox.Show(”不支持ISBN的模糊查询!“);else { //添加模糊查询的代码 if(textBox2.Text!= ”“){ bookname =(”书名 like '%“ + textBox2.Text + ”%'“);dataCommand.CommandText = ”SELECT * FROM book.book WHERE “ + bookname;} else//查询所有图书 { dataCommand.CommandText = ”SELECT * FROM book.book“;} } } else MessageBox.Show(”请选择查询方式!“);

OracleDataReader dataReader = dataCommand.ExecuteReader();

第2部分 Oracle开发技术

BindingSource bs = new BindingSource();bs.DataSource = dataReader;this.dataGridView1.DataSource = bs;if(dataReader.Read()){ lnum = dataReader.GetInt32(3);ynum = dataReader.GetInt32(6);} dataConnection.Close();}

SqlConnection dataConnection;//数据库连接类 SqlCommand dataCommand;//数据库命令类

读者信息:

dataConnection.Open();

dataCommand.CommandText = ”SELECT * FROM book.reader WHERE reader_id='“ + uID + ”'“;OracleDataReader dataReader = dataCommand.ExecuteReader();

第2部分 Oracle开发技术

BindingSource bs = new BindingSource();bs.DataSource = dataReader;this.dataGridView4.DataSource = bs;dataReader.Close();dataConnection.Close();

maxnum =(int)dataGridView4.Rows[0].Cells[”maxlend“].Value;dnum =(int)dataGridView4.Rows[0].Cells[”alredylend“].Value;ymaxnum =(int)dataGridView4.Rows[0].Cells[”maxyuyue“].Value;ydnum =(int)dataGridView4.Rows[0].Cells[”yiyuyue“].Value;}

还书:

dataConnection.Open();String bookisbn;bookisbn = textBox5.Text;if(bookisbn!= ”“){ dataCommand.CommandText = ”DELETE FROM book.borrow WHERE ISBN='“ + bookisbn + ”'“;dataCommand.ExecuteNonQuery();dataCommand.CommandText = ”UPDATE book SET incount=incount+1 WHERE ISBN='“ + bookisbn + ”'“;

第2部分 Oracle开发技术

dataCommand.ExecuteNonQuery();dataCommand.CommandText = maxyuyue=maxyuyue-1 WHERE ISBN='” + bookisbn + “'”;dataCommand.ExecuteNonQuery();dataCommand.CommandText = “UPDATE alredylend=alredylend-1 WHERE reader_id='” + uID + “'”;dataCommand.ExecuteNonQuery();textBox5.Text = “";MessageBox.Show(”归还成功!“);dnum--;

实验总结:

通过这次课程设计,我收获了很多,对oracle数据库从一片空白到现在的有所了解。界面设计和代码用的是C#通过本次课程设计,我们对数据库的应用有了更深刻的体会。网络系统都是离不开数据库的支持的。数据库设计的是否合理,直接影响到系统的性能。数据库理论对于实际应用有很大的指导意义。

本次课程设计的名称是图书管理系统,由于我们能力有限,加之近期课程任务比较紧迫,所以我们负责的这个项目还有许多不完善的地方。可以说我们的这次系统是做的比较丑陋,功能还有很多不完善的地方。但是总的来说还是收获很大的,因为通过这次的团队合作,首先对数据库和C#有了进一步的了解,并且深深体会到团队合作的重要性,还有合理的团队分工是非常重要的。并且能在最后将前台程序和后台数据库连接起来运行,也对我们是一个比较大的挑战,而且我们也成功的做到了这一点。本次的图书管理系统,在功能上仅实现了图书,用户,图书类别和用户的注册管理,只是一些非常基础的功能,没有设计添加图书的功能。此外,该系统原先计划设计的一些功能也没有实现。系统完全实现的功能实现图书信息的删除、更改和查看等。

最后也非常感谢向胜军老师对我们本次课程设计的指导及最后验收的评价。我们也会吸取本次设计经验,为以后的设计继续努力。

reader

SET

”UPDATE

book

SET

下载C++课程设计(简单图书管理系统)word格式文档
下载C++课程设计(简单图书管理系统).doc
将本文档下载到自己电脑,方便修改和收藏,请勿使用迅雷等下载。
点此处下载文档

文档为doc格式


声明:本文内容由互联网用户自发贡献自行上传,本网站不拥有所有权,未作人工编辑处理,也不承担相关法律责任。如果您发现有涉嫌版权的内容,欢迎发送邮件至:645879355@qq.com 进行举报,并提供相关证据,工作人员会在5个工作日内联系你,一经查实,本站将立刻删除涉嫌侵权内容。

相关范文推荐

    图书管理系统 数据结构 课程设计

    《数据结构》 课程设计报告书 一.课程设计题目 图书借阅管理系统 二.课程设计内容 实现图书管理信息系统的设计 (一)管理员功能: ①登录:输入管理员密码,若密码错误则不得执......

    图书管理系统课程设计摘要

    摘要 摘要 随着计算机技术的飞速发展,电子信息化慢慢替代了企业管理的传统管理手法,采用管理系统是能够有效提高管理效率的。图书馆作为一种信息资源的集散地,图书和用户借阅资......

    图书管理系统课程设计绪论

    绪论 1.1 课题背景意义 在学校现代化的管理中,图书馆管理系统也是其中非常重要的一部分,然而,用大型软件系统来于小型的图书管理,不啻于“杀鸡用牛刀”,因此小型的的软件对于这种......

    图书管理系统课程设计(5篇范文)

    秦皇岛职业技术学院课程设计论文设计题目: 图书管理系统 学生姓名:蔡昆 指导教师:刘学超,李旺彦 专业名称: 计算机应用技术专业 所在院系:信息工程系2007 年 7 月5日 摘要 随着人......

    数据库课程设计 图书管理系统(精选)

    课 程 设 计 软件工程与数据库 课程设计 任务书 学院名称:数学与计算机学院 课程代码:_6014419_ 专业: 年级:一、设计题目 图书管理系统 二、主要内容 一个简单的图书管理系统......

    C++课程设计学生成绩管理分析系统

    五、解决方案 C++程序设计实践教学环节任务书 1. 分析程序的功能要求,划分程序功能模块。 2. 画出系统流程图。 一、题目: 学生成绩管理分析系统 3. 代码的编写。定义类和各......

    C++课程设计电话簿管理

    C++课程设计 ————简单电话簿管理 报告内容: 一.程序功能简介 二.课程设计要求 三.课程设计说明 四.参考数据结构 五.具体功能及实现六.源程序及注释 七.感想与心得 学号:05093010......

    C++课程设计公司人事管理系统

    C++程序设计实践教学环节任务书 承接的项目额(10%)提成,业务经理既拿固定月薪(2000元)也领取提成,财务人员固定工资(2000元),文秘为固定工资(1500元)。 (4) 可按姓名显示、查找、......