数据库应用课程设计

更新时间:2023-12-21 15:53:01 阅读量: 教育文库 文档下载

说明:文章内容仅供预览,部分内容可能不全。下载后的文档,内容与下面显示的完全一致。下载之前请确认下面内容是否您想要的,是否完整无缺。

计算机科学与技术 专业《数据库应用系统》课程设计任务书

学生姓名 题 目 课题性质 指导教师 专业班级 计科0501 学号 20054140102 个人书库管理系统 其它 课题来源 同组姓名 自拟课题 无 个人书库管理系统主要实现个人书籍的管理,针对个人藏书太多,不容易集中管理分类的需求。实现的功能如下: (1)实现个人系统的登录。 主要内容 (2)实现书籍的显示,入库添加存储,查询,删除,统计,出借查询功能。 (3)实现书库管理员的添加,删除,显示功能。 (4)系统的退出。 综合运用所学的数据库基本知识,采用一种前台开发工具,并能通过查阅任务要求 相关文献材料,独立完成该课题的设计开发工作。要求根据本课题设计出合理的数据结构,并实现书籍综合管理模块、管理员管理模块等其他功能模块。 开发工具自选。 1 杨得新。SQL server 2000 开发与应用。北京:机械工业出版社 2003.6 2 王珊,萨师煊。数据库系统概论。北京:高等教育出版社 2006.5 参考文献 3 李律松,马传宝,李婷。数据库开发与实例(C#)。北京:清华大学出版社2006.8 4 李乃文,傅游,沈学利,任建华。C#程序设计。北京:清华大学出版社 2007.2 5 肖慎勇。SQL SERVER数据库管理与开发。北京:清华大学出版社 2006.10 指导教师签字: 审查意见 教研室主任签字: 2007 年12月 3 日 1 需求分析

现代科学技术突飞猛进的今天,各种电子数码化产品如雨后春笋般被发明制造出来,其中就关于书籍的产品如可携带式电子书等等。但是相比于体积上更小,重量上更轻,数量上更多的电子式书籍来说,人们还是喜爱相对比较传统的纸制书籍。这就出现了一个问题,当一个书籍收藏家或有太多书籍的人想对如此众多的书籍进行管理时该怎么办?本次课程设计就是针对这个问题进行开发设计。

针对上述问题,我设计了一个‘个人书库管理系统’,目的是为了方便用户管理书籍。该系统主要包含了2个模块,书籍综合管理模块和管理员管理模块,书籍综合管理模块的功能包括:

(1)入库,添加书籍加入数据库的书籍表。 (2)删除,从书库中删除不存在,有错误的书籍。 (3)显示,在操作界面的表中显示所有已有的书籍。 (4)查询,通过关键字查找书库中的书籍。

(5)出借查询,通过出借号查询出借的书籍和出借人 管理员操作模块的功能包括:

(1)添加,添加管理员,并设置管理类别。

(2)删除,删除已有的管理员。

(3)修改,修改管理员的资料,包括用户名,密码,类别。 (4)显示, 使用几个按钮在文本框中显示用户。 此外,本系统还应包括一个登录模块和用户表连接。

2 概要设计

2.1数据库中的表。

(1)BooK表,用来存储书籍信息。其实体型为:

Book(BookName,BookNum,BookType,BookPub,BookBro);

其中,BookNum(书号)为主键,其余的分别是BookName(书名),BookNum(书类),BookPub(出版社),BooKBro(是否借出)。

以下是Book表在数据库中的定义,包括各属性的数据类型和长度等。 表2-1 Book表

列名 BookName BookNum BookType BookPub BookBro

数据类型 Nvarchar Int Nvarchar Nvarchar Nvarchar 长度 50 4 50 50 50 允许空 否 是 是 是 是 主键 是 否 否 否 否 (2)BookBro表,用来存储出借书籍数据,其实体型为: BookBro(BookName,BroName,BroNum,PhoneNum,BookNum);

其中,BroNum(出借号)为主键,BookName(书名),BookNum(书

号),,BroName(出借人) ,PhoneNum(出借人电话号码)。 以下是BookBro表在数据库中的定义。 表2-2,BookBro表

列名 BroNum BookName PhoneNum BookNum BookName

数据类型 Int Nvarchar Nvarchar Int Nvarchar 长度 4 50 50 4 50 允许空 否 是 是 是 是 主键 是 否 否 否 否 (3)User表,用来存储用户信息,其实体型为: User(UserID,UserPassword,UserSort);

其中UserID(用户名)为主键,UserPassword(用户密码),UserSort(用户类型)

以下是User表在数据库中的定义。 表3-3, User表

列名 UserID UserPassword UserSort

数据类型 Char Char Char 长度 10 10 10 允许空 是 否 否 主键 否 是 是

2.2程序流程图和各模块功能分布:

图2-1,程序流程图和各功能分部图

图2-2,E-R图

3 运行环境

软件:Windows XP操作系统。 硬件:微机,CPU P4 2.8HZ。

1G内存,80G硬盘和128M显卡。

4 开发工具和编程语言

开发工具:visual studio.net,SQL2000。 编程语言:面向数据库C#语言。

5 详细设计

(1)登录界面设计:

图5-1,登录界面

登录界面实现代码:

namespace library.cs {

public partial class LoginForm : Form {

public LoginForm() {

InitializeComponent(); //窗体代码设计必备

}

public void ErrorHandle(System.Exception E) {

MessageBox.Show(E.ToString()); //调用异常处理 }

private void button2_Click(object sender, EventArgs e) {

this.textUserID.Text = \;

this.textUserPassword.Text = \; //清空 }

private void button1_Click(object sender, EventArgs e) {

if(UserCheck(this.textUserID.Text,this.textUserPassword.Text)==\m\) //调用检测函数并识别 {

this.Visible=false;

Form mainform=new MainForm(); //调用主窗体 mainform.ShowDialog(); //调用显示函数

this.Close(); //关掉正在打开的界面 } else

if(UserCheck(this.textUserID.Text,this.textUserPassword.Text)==\)

{

this.Visible=false;

Form mainform=new MainForm();

mainform.ShowDialog(); this.Close(); } else

{

if(MessageBox.Show(\输入用户密码有误,是否重新登陆\,\输入有误

\,MessageBoxButtons.OKCancel,MessageBoxIcon.Question)==DialogResult.OK) //输入错误,调用窗体并提示错误 {

this.textUserID.Clear();

this.textUserPassword.Clear(); } else {

this.Close(); } } }

string UserCheck(string username, string userpassword)//判断 {

string txtSql, usersort; usersort = \;

txtSql = \;

SqlCommand checkuser = new SqlCommand(txtSql, this.sqlConnection1); try {

this.sqlConnection1.Open(); //打开数据库链接

SqlDataReader sqlreader = checkuser.ExecuteReader(); while (sqlreader.Read()) {

if ((sqlreader[0].ToString().Trim() == username) && (sqlreader[1].ToString().Trim() == userpassword)) //输入数据与数据库中的数据进行比较判断 {

usersort = sqlreader[2].ToString().Trim(); break; } } }

catch (Exception e) {

MessageBox.Show(e.ToString()); }

sqlConnection1.Close(); return usersort; }

(2)主控制窗体界面:

图5-2,主控制窗体

主控制窗体代码:

namespace library.cs {

public partial class MainForm : Form {

public MainForm() {

InitializeComponent(); }

private void button4_Click(object sender, EventArgs e) {

this.Close(); //退出系统 }

private void button3_Click(object sender, EventArgs e) {

this.Visible = false;

Form mainform = new User();

mainform.ShowDialog(); //打开管理员管理模块 this.Close(); }

private void button2_Click(object sender, EventArgs e) {

this.Visible = false;

Form Xinshu = new xinshu();

Xinshu.ShowDialog(); //打开书籍综合管理模块 this.Close(); } } }

(3)书籍综合管理模块窗体设计:

图5-3,综合功能窗口

图5-4, 出借查询窗口 书籍综合管理模块代码实现: namespace library.cs {

public partial class xinshu : Form {

public xinshu() {

InitializeComponent(); }

private void btnClear_Click(object sender, EventArgs e) {

this.textName.Text = \;//清空 this.textNum.Text = \; }

private void btnBack_Click(object sender, EventArgs e) {

this.Visible = false;

Form mainform=new MainForm();

mainform.ShowDialog();//返回主窗体 this.Close(); }

private void btnAdd_Click(object sender, EventArgs e) { //添加新数据进入Book表 SqlConnection con = new

SqlConnection(\); con.Open();

SqlCommand cmd=new SqlCommand(\('\+textName.Text.Trim()+\+textNum.Text.Trim()+\+textType.Text.Trim()+\+textPub.Text.Trim()+\+textBro.Text.Trim()+\,con);

cmd.ExecuteNonQuery();

MessageBox.Show(\成功入库!\); printf();//新数据入库后刷新 }

private void xinshu_Load(object sender, EventArgs e) {

printf(); //调用显示函数 }

private void printf() //显示函数 {

this.sqlDataAdapter1.Fill(this.dataSetBook); this.dataGrid1.DataSource =

this.dataSetBook.Tables[0].DefaultView;

}

private void btnCheck_Click(object sender, EventArgs e) { //查询按钮功能实现 SqlConnection conn = new

SqlConnection(\);

SqlCommand com = new SqlCommand(); conn.Open();

com.Connection = conn;

com.CommandType = CommandType.Text; if (textName2.Text != null) {

com.Parameters.Add(\书号\, SqlDbType.Int);

com.Parameters[\书号\].Value = textName2.Text;//取在文本框中输入的数据值

com.CommandText = \书号\; //对比

DataSet dataSet2 = new DataSet();

SqlDataAdapter qlcom2 = new SqlDataAdapter(com); qlcom2.Fill(dataSet2, \); dataGrid2.DataSource =

dataSet2.Tables[\].DefaultView;//把查询结果放入第二DataGrid }

conn.Close(); //关闭连接 }

private void btnClear2_Click(object sender, EventArgs e) {

this.textName2.Text = \;//清空 }

private void btnDelete_Click(object sender, EventArgs e) {//删除界面代码

SqlConnection conn = new

SqlConnection(\);

SqlCommand com = new SqlCommand(); conn.Open();

com.Connection = conn;

com.CommandType = CommandType.Text;

com.Parameters.Add(\书号\, SqlDbType.Int);

com.Parameters[\书号\].Value = textName2.Text;//取输入值 com.CommandText = \书号\;//删除关键字相同的键值

com.ExecuteNonQuery();

MessageBox.Show(\删除成功!\);

com.CommandText = (\); com.CommandType = CommandType.Text;

SqlDataAdapter Adapter = new SqlDataAdapter(com); DataTable de = new DataTable();

Adapter.Fill(de);

this.dataGrid1.DataSource=de;//显示结果在显示窗体1 }

private void btncount_Click(object sender, EventArgs e) {//统计按钮功能实现 int datarows;

SqlConnection conn = new

SqlConnection(\); //打开数据库

SqlCommand com = new SqlCommand(); //SQL命令集 conn.Open(); com.Connection = conn;

com.CommandType = CommandType.Text;

com.CommandText = \;

SqlDataAdapter dapter = new SqlDataAdapter(com); //适配器 DataSet con = new DataSet(); //容器 datarows = sqlDataAdapter1.Fill(con);

MessageBox.Show(\总共有\+datarows.ToString()+\本书\); }

private void btnBro_Click(object sender, EventArgs e) {//打开出借查询界面

this.Visible = false;

Form formbro = new FormBro(); formbro.ShowDialog(); this.Close(); } } }

出借查询代码实现

private void butOK_Click(object sender, EventArgs e) {//通过出借号查询并显示

SqlConnection conn = new

SqlConnection(\);//打开数据库链接

SqlCommand com = new SqlCommand(); conn.Open();

com.Connection = conn;

com.CommandType = CommandType.Text;

com.Parameters.Add(\借出号\, SqlDbType.Int); com.Parameters[\借出号\].Value = BroNum.Text; com.CommandText = \* from bookbro where BroNum=@

借出号\;

DataSet dataSet2 = new DataSet();

SqlDataAdapter qlcom2 = new SqlDataAdapter(com);

qlcom2.Fill(dataSet2, \); dataGrid1.DataSource =

dataSet2.Tables[\].DefaultView;

conn.Close(); }

private void button2_Click(object sender, EventArgs e) {

this.BroNum.Text = \; //清空 }

private void button1_Click(object sender, EventArgs e) { //返回上一级窗体

this.Visible = false;

Form xinshu = new xinshu(); xinshu.ShowDialog(); this.Close(); }

private void button3_Click(object sender, EventArgs e) { //显示所有出借的书籍

SqlConnection conn = new

SqlConnection(\);

SqlCommand com = new SqlCommand(); conn.Open();

com.Connection = conn;

com.CommandType = CommandType.Text;

com.CommandText = \; DataSet dataSet2 = new DataSet();

SqlDataAdapter qlcom2 = new SqlDataAdapter(com); qlcom2.Fill(dataSet2, \); dataGrid1.DataSource = dataSet2.Tables[\].DefaultView; conn.Close(); }

(5)管理员管理模块界面:

图5-5,管理员管理模块界面

代码实现(在这个模块中手动设置数据连接,用到了VS.net数据库连接控件): ‘上一个’代码:

private void btnPrevious_Click(object sender, System.EventArgs e) {

this.BindingContext[this.objDataSetUser1, \].Position -= 1; // 指针减一

this.ButtonPositonChange(); this.DatasetPostionChange();

}

‘表头’代码:

private void btnFirst_Click(object sender, System.EventArgs e) {

this.BindingContext[this.objDataSetUser1, \].Position = 0;//回到数据集中表头的地址 this.ButtonPositonChange(); this.DatasetPostionChange(); }

说明:文本框功能冻结和打开代码(这里只举程序中个别例子,大部分都通过专门的函数调用来实现其功能冻结):

private void ButtonPositonChange() {

this.btnPrevious.Enabled = true;//功能打开

this.btnNext.Enabled = true; this.btnFirst.Enabled = true; this.btnLast.Enabled = true;

if (this.BindingContext[this.objDataSetUser1, \].Position == 0) {

this.btnFirst.Enabled = false; this.btnPrevious.Enabled = false; }

if (this.BindingContext[this.objDataSetUser1, \].Position == this.BindingContext[this.objDataSetUser1, \].Count - 1) {

this.btnNext.Enabled = false; this.btnLast.Enabled = false; } }

‘添加‘按钮:

private void btnAdd_Click(object sender, System.EventArgs e) {

try {

this.BindingContext[this.objDataSetUser1, \].AddNew();//调用添加函数 }

catch (System.Exception E) {

this.ErrorHandle(E); }

this.DatasetPostionChange(); this.ButtonPositonChange(); this.TextEnableControl(true); this.ButtonEnableControl(true); }

‘删除’按钮:

private void btnDelete_Click(object sender, EventArgs e) {

if ((this.BindingContext[this.objDataSetUser1, \].Count > 0) &

(MessageBox.Show(\真的要删除此记录吗\, \确定删除\, MessageBoxButtons.OKCancel,

MessageBoxIcon.Question).Equals(DialogResult.OK))) {

try

{

int currentPosition =

this.BindingContext[this.objDataSetUser1, \].Position;

this.objDataSetUser1.user.Rows[currentPosition].Delete(); }

catch (System.Exception E) {

this.ErrorHandle(E); }

this.ButtonPositonChange(); this.DatasetPostionChange(); } else

return; }

‘修改’按钮:

public void UpdateDataSet() {

this.BindingContext[this.objDataSetUser1, \].EndCurrentEdit();

DataSetUser objDataSetTemp = new DataSetUser(); objDataSetTemp =

(DataSetUser)(this.objDataSetUser1.GetChanges()); try {

this.UpdateDataSource(objDataSetTemp);

this.objDataSetUser1.Merge(objDataSetTemp); this.objDataSetUser1.AcceptChanges(); }

catch (System.Exception E) {

this.ErrorHandle(E); } }

private void btnModify_Click(object sender, System.EventArgs e) {

this.TextEnableControl(true); this.ButtonEnableControl(true); }

6 调试分析

6.1测试数据

图6-1,Book表中的测试数据

图6-2,BookBro表的 测试数据

图6-3,User表的测试数据

6.2问题分析与解决方法

实验中的个别问题与解决方法:

(1)工具栏中的控件有些在自定义条件下没有显现出来,必须到“工具“菜单中的”添加/移除工具箱项“中添加。

(2)进行数据连接不但可以用代码的方法,还可以使用工具箱中的后台数据库连接控件来实现。在实现个别特殊功能时,可以在数据库中定义存储过程,视图或者函数等等再通过在代码中调用实现之。

(3)在用代码实现数据库后台连接时,不要忘了创建和设置正确的参数,并

且弄清他们之间的关系如sqlconnect,sqlcommand,sqladapter,dataset等等, 曾因为弄反了适配器和数据集的关系而把连接这个步骤弄得乱七八糟。

(4)程序中有这样一段代码

SqlConnection(\); 如果把程序移植到其他机子上,一定要把SQL 2000中安全设置中改为允许WINDOWS和SQL数据库用户登录,把默认用户SA的密码改为123。这样实现数据库连接很笨拙,本人主要是想测试用不同参数和方法实现之。

(5)在进行数据库连接时,经常会碰到这样的问题,“找不到类型或者是名称空间名称“SQLCOMMAND”(是否缺少USING指令或是程序集的引用)“。在引用的类中加入using System.Data;System.Data.SqlClient;”后问题解决。

(6)区别关键字大小写,VS。NET下的C#编程对大小写很敏感,有些系统函数如果写错了会无法识别。

(7)因为本系统是在VS。NET 2005环境下编写的,所以用低版本的VS。NET无法打开项目。

7 测试结果

7.1登录窗口

运行程序,输入用户名和密码,如果错误,出现以下提示:

图7-1,登录错误

7.2综合操作窗口

的新书入库窗口中输入数据并点击添加,如图:

图7-2,添加成功 查询功能:输入书号,点击查询

删除功能:输入书号,点击查询后再点击删除,或直接输入书号再点击查询 。如图

图7-3.1,查询和删除成功

点击删除,删除成功,在显示窗口1中已没有数据,数据库中的数据也已删除。

图7-3.2,查询和删除成功

统计按扭实现:

图7-4,统计成功

出借查询功能:

输入出借号并点击查询。点击显示全部:

图7-5,出借查询功能实现

7.3管理员管理模块功能实现:

点击下一个并删除order2000,表中的数据已经被删除:

图7-6,管理员管理模块实现

添加和修改功能,点击添加,输入并点击确定可通过’上一个’或’下一个’来确定添加是否成功。点击修改,对想要修改的数据进行修改:

添加 修改

图7-7,添加和修改功能

数据库中的表:

图7-8,添加和修改后的User表

参考文献

[1] 杨得新,SQL server 2000 开发与应用。北京,机械工业出版社 2003.6 [2]王珊 萨师煊,数据库系统概论。北京,高等教育出版社 2006.5

[3]李律松 马传宝 李婷,数据库开发与实例(C#)。北京,清华大学出版社2006.8 [4]李乃文 傅游 沈学利 任建华,C#程序设计。北京,清华大学出版社 2007.2 [5]肖慎勇 ,SQL SERVER数据库管理与开发。北京,清华大学出版社 2006.10

总结

本系统主要实现个人书库的管理,能实现书籍添加、显示、查询、删除、统计和出借书籍的查询,以及实现管理员数据的查询、删除、显示、修改等等。

界面主要包括登录界面、主窗体截面、书籍综合管理界面和管理员管理设置截面。模块快主要包括2个,一个是书籍综合管理模块和管理员管理模块。

系统中还包括一些小功能,包括系统退出,按钮功能冻结等。

我在数据库设计有问题,在一开始,我设计的数据库没有任何结构性,并且太过于简单,而后在进行数据连接和操作时发现了很多问题,比如,2个表有什么联系关系,在数据库前台对一个表操作,会不会对另一个表有影响,以及怎么实现的问题。我把数据库中的表进行关联后测试,发现会出现很多问题。经过分析我认为是数据库的设计上出了问题。所以我对数据库进行了改进,首先先画好E-R图,在对数据库进行关联,接着是用户需求分析,解决好用户到底需要什么,不需要什么,我原先的数据库应用系统就是因为没有按照步骤来设计才出了很多问题,虽然之后的改进版好了很多,但是还是有很多不足。

在前台设计上,有几个方面需要改进。 (1)登录界面应该添加退出系统功能。

(2)整个系统功能偏简单,内容偏少,应该可以加入比如,书籍查阅次数,作者相关资料连接,书籍阅读模块等等。

(3)整个操作界面不够灵活,这主要是我本身对很多控件不熟悉,不会使用更多更方便更人性化的控件。

心得体会

持续一周的课程设计终于结束了,这是匆匆忙忙的一周,辛苦与快乐并存 的一周,充满收获的一周。

一周的时间对于课程设计来说有些太短,所以老师一开始就提醒我们要前 准备。因为我一开始没重视老师的建议,所以在这一周我显得十分匆忙,忙着构 思,查阅资料,以及思考如何用工具实现功能。

我走了很多弯路,这只能怪自己一开始没做好充足的准备和实践能力太差 ,而且还抱着一种藐视的心态来做这项工作,这些到最后验收时只能证明我的失败。由于没有按照步骤来一步一步完成,第一次的数据库设计失败了,这影响到我的前台设计,我不得不一切重新开始。

第一次失败了,我又浪费了一部分时间,时间对我来说更急迫了。我没有放弃,检讨了自己,从头开始。第二次我吸取了教训,不是一味地想实现前台操作。基本上,我第一次查阅的资料都是关于如何实现前台功能,这一次我回头把教材上的关于数据库设计的知识迅速梳理了一遍,又通过向同学和老师提问,最后基本上知道实现的方法和实现步骤。

在了解了方法后,我埋头苦干,争取在剩下的时间里完成课程设计。在这一过程中,我又碰到了不少困难和犯了不少错误,但那都是小困难和小错误,不至于像第一次一样功亏一篑,要重头开始。比如,像一个特殊修改功能如何实现、数据库连接方法有几种,每一种有什么区别等等。这些问题我都通过向老师和在这一方面擅长的同学请教,问题最终得以解决。

一周的课程设计是很辛苦的,特别是还赶上了期末复习,但是我却学到很

多东西,同时也发现自己的很多缺点。人最可悲的事情就是不肯承认自己的失败,第一次失败后我曾一度自暴自弃,但是我最后还是站了起来,勇敢面对自己,最后完成了课程设计。虽然我顺利完成了,但是我还应该看到这其中的很多不足点,包括整个设计的缺陷,以及个人能力的不足,对于代码的熟悉程度不够等等,这些都要在我以后的学习生涯中去克服。我彻底明白了一个道理:一个没有计划,恒心,信心,懒惰的人不可能成功!

本文来源:https://www.bwwdw.com/article/e185.html

Top