1、数据库高级应用课外实践报告项 目 名 称: 宾馆管理系统 所 在 班 级: 小 组 成 员: 指 导 教 师: 起 止 时 间: 11月10日12月30日 项目基本信息项目名称 宾馆管理系统项目简介随着人民生活水平的提高,酒店在服务行业中占有越来越重要的地位。努力在当前服务行业日趋剧烈的竞争中脱颖而出,已成为每位经营者所追求的目的。通过数年发展,酒店管理已经逐渐由定性管理,进入到重视定量管理的科学阶段。众所周知,在定量管理的具体实现方法和手段方面,最有效的工具就是电脑管理。传统的手工操作管理存在着许多无法避免的问题,例如:一、 人工计算帐单金额容易出现差错二、 收银工作中跑单、漏单、偷钱现象普
2、遍三、 无法进行会员管理和追踪四、 无法准确迅速的解决折扣和优惠等问题五、 无法准确满足客人的个性需求六、 无论收银还是财务都需要大量的人力物力酒店管理系统就是针对以上问题设计的。系统实现了一般酒店平常营运的自动管理本管理信息系统将采用技术成熟的C#做为前台开发工具。后台数据库采用微软公司的SQL Sever数据库,它的灵活性,安全性,和易用性为数据库编程提供了良好的条件。因此,系统的软件开发平台已成熟可行。本宾馆管理系统重要功能涉及:客房管理、来客登记、客户查询、客房查询、客户结算等几大子系统。可以对宾馆平常的工作进行管理,比如客户到来后,根据客户的个性化需求查找房间并入住,还可以在客户结算
3、时根据客户种类是否为会员来进行便捷的结算。虽然该系统的功能还不太完善,其他相关的功能没有涉及,但是该系统可以支持宾馆管理和服务的过程。便于对中小型宾馆进行有效的管理,是工作人员从繁杂忙乱的工作事物中解脱出来。小组成员任务分工七、 系统设计1. 系统功能描述宾馆管理系统已经广泛应用于各种宾馆、旅馆、招待所等,为居住的户提供了更加快捷、便利的服务。一个宾馆管理系统应当的基本功能需要涉及:客房类型管理、客房信息管理、客房查询、客户查询、客户入住、客户结算等功。u 客房类型管理提供有关宾馆客房的类型状况的规范,如客房编号,类型标准间,豪华间等的设立。u 客房信息管理是管理各个客房的信息和状况,涉及客房
4、的楼层号,房间号,价钱,额定人数,实际人数等。u 客房查询是客户入住前根据客户的规定为客户查询当前客房的入住情况,尽最大也许满足客户的规定。u 客户查询重要是根据客户的身份证号或者入住的房间号俩显示客户的住宿记录,以便用户管理和用户的结算。u 客户入住就是登记客户的入住信息。u 客户结算是客户付清住宿费用并退房后注销房间。 2. 系统模块划分根据系统功能的需求分析,应当把系统的功能划分为3大模块。(1) 客房信息管理v 客房类型管理v 客房信息管理 (2) 前台操作v 客房查询v 客户查询v 客户入住v 客户结算 (3) 系统功能v 系统退出3. 系统流程分析客房管理系统查询剩余客房客户结算客
5、户入住客户查询前台操作修改客房信息删除客房信息查询客房信息添加客房标准修改客房标准删除客房标准添加客房信息设立客房标准客房信息管理设立客房信息 添加用户系统退出系统顾客房间类型房间住房退房标准mm11m14. 功能模块调用 来客登记子系统功能A. 对来客进行登记入住工作 顾客编号,顾客姓名,入住时间,离开时间,电话 B. 对来客进行分派住房工作 房间号,顾客编号,房间类型,房价该系统的流程图如下:来客登记住房信息顾客顾客档案当前住房信息更新住房信息分派住房顾客个人信息顾客离开时间八、 数据库设计 1. 创建数据库这一设计阶段是在需求分析的基础上,设计出能满足用户需求的各种实体,以及它们之间的关
6、系,为后面的逻辑结构设计打下基础。根据上面的设计规划出的实体有顾客实体、客房类型、房间实体。宾馆管理系统的数据库功能重要体现在对各种信息提供、保存、更新和查询等操作上,涉及客房信息、客房类型信息、客户入住信息、和客户信息等,各个部分的信息又有着内在的联系。针对该系统的数据特点,有以下需求:l 客房信息涉及客房的具体信息l 每个不同的客房都属于一个类型l 客户信息记录客户登记时的具体信息 数据项和数据结构设计如下: 客房类型信息,涉及客房类型编号,客房类型名称价钱等 客房信息,涉及房间号,房间楼层,额定人数等 客户信息,涉及客户编号,姓名,证件号,籍贯等 下面用E-R图来表达各个实体间的关系:房
7、间信息房间编号房间类型房间位置房间价格房间状态床位数房间信息E-R图房间类型实体属性图房间类型类型编号价格类型名称客户类型客户ID折扣价客户种类姓名客户类型E-R图客户入住信息E-R图客户入住客户编号客户名称房间编号入住日期证件号客房类型名顾客房间类型房间住房退房标准mm11m1实体联系E-R图2. 数据库逻辑结构设计l 创建数据库 启动“服务器资源管理器”,在SQL Sever 服务器节点中右击,来新建一个名为MYhotel的数据库。代码如下:CREATE DATABASE MYhotel ON PRIMARY(NAME=MYhotel,FILENAME=D:MYhotel.mdf,SIZE
8、=10MB,FILEGROWTH=1MB)LOG ON (NAME=MYhotel_log.ldf,filename=D:MYhotel.ldf,size=10MB,FILEGROWTH=1MB)GOl 创建表/字段 在数据库中要创建6张表,涉及管理员信息表、客房类型信息表、客房信息查询表、客户信息表、客户种类信息查询表、楼层信息表。各个表中各个字段的意义入表16所示。(1) 管理员信息表字段名称数据类型是否NULL说明1管理员姓名nvarchar(50)NOT NULL2管理员登陆密码nvarchar(50)NULL(2) 客房类型信息表 字段名称数据类型是否NULL说明1客房类型intNO
9、T NULL2客房类型名称nvarchar(50)NOT NULL3价格smallmoney NOT NULL(3)客房信息查询表字段名称数据类型是否NULL说明1客房编号char(50)NOT NULL类型编号2 客房号nvarchar(50)NOT NULL 房间编号3客房类型名称char(50)NULL类型名称4床位数char(50)NULL床位数5顾客数量char(50)NULL6使用状态nvarchar(50)NULL是否有人入住 (4)客户信息表 字段名称数据类型是否NULL说明1客户编号intNOT NULL2 客户姓名varchar(50)NOT NULL 3客户性别 char
10、(10)NULL4身份证号nvarchar(50)NULL5客户种类名称nvarchar(12)NULL6客房号char(12)NULL 7到达时间nvarchar(12)NULL 8联系电话nvarchar(12)NULL(5) 客户种类信息查询表 字段名称数据类型是否NULL说明1客户种类IDchar(15)NOT NULL2客户种类姓名char(15)NOT NULL3折扣价char(15) NOT NULL (6) 楼层信息表 字段名称数据类型是否NULL说明1楼层号intNOT NULL2楼层名char(50)NOT NULL建立完所有数据表后,为客房类型信息表和客房信息查询表添加关
11、系,为客户信息和客户信息查询表添加关系,为客房信息查询和客户信息查询表添加关系。其实现代码如下:CREATE TABLE 客房类型信息表 /*创建客房类型登记表*/( 客房类型 int PRIMARY KEY , 客房类型名称 nvarchar(50) NOT NULL, 价格 SMALLMONEY NOT NULL,)CREATE TABLE 楼层信息表 /*创建楼层登记表*/( 楼层号 int NOT NULL, 楼层名 nvarchar(50) NOT NULL,)CREATE TABLE 管理员信息表 /*创建管理员登记表*/( 管理员姓名 nvarchar(50) NOT NULL,
12、 管理员登陆密码 nvarchar(50)NOT NULL,) GoCREATE TABLE 客房信息查询表 /*创建客房信息表*/(客房编号 char(50)PRIMARY KEY,客房号 nvarchar(50)NOT NULL,客房类型名称 char(50) NOT NULL,床位数 char(50) NOT NULL,顾客数量 char(50) NOT NULL,使用状态 nvarchar(50) NOT NULL) Go CREATE TABLE 客户种类信息查询表 /*创建客户种类登记表*/( 客户种类ID char(15) NOT NULL, 客户种类姓名 char(15)NOT
13、 NULL, 折扣价 char(15)NOT NULL,) Go/*客户信息表*/CREATE TABLE 客户信息表 /*创建客户信息表*/(客户编号 int PRIMARY KEY,客户姓名 nvarchar(50) NOT NULL,客户性别 CHAR(10)NOT NULL,身份证号 nvarchar(50)NOT NULL,客户种类名称 nvarchar(12) NOT NULL,客房号 char(12)NOT NULL,到达时间 nvarchar(12) NOT NULL,联系电话 NVARCHAR(12) NOT NULL)Go九、 连接数据库 宾馆管理系统使用VC#和SQL S
14、ever 来进行开发。为了使系统正常工作,需要建立与数据库系统的连接来读取和写入数据。 在VC#环境下,建立MYhotel项目,在项目“MYhotelManage”上的DAl层添加DBHelps类。用于数据库连接。代码如下: public class DBHelps private static SqlConnection con; public static SqlConnection Con get string strcon = Data Source=.;Initial Catalog=MYhotel;Integrated Security=SSPI; if (con = null)
15、con = new SqlConnection(strcon); con.Open(); else if (con.State = System.Data.ConnectionState.Closed) con.Open(); else if (con.State = System.Data.ConnectionState.Broken) con.Close(); con.Open(); return con; public SqlDataAdapter Select(string sql) SqlDataAdapter inform = new SqlDataAdapter(sql, Con
16、); return inform; public int ExecuteNonQuery(string sql) SqlCommand cmd = new SqlCommand(sql,Con); int result = cmd.ExecuteNonQuery(); return result; public static int ExecuteCommand(string sql) SqlCommand cmd = new SqlCommand(sql,Con); int result = cmd.ExecuteNonQuery(); return result; public stati
17、c int GetScalar(string sql) SqlCommand cmd = new SqlCommand(sql,Con); int result = Convert.ToInt32(cmd.ExecuteScalar(); return result; public static int GetScalar(string sql, params SqlParameter values) SqlCommand cmd = new SqlCommand(sql, Con); cmd.Parameters.AddRange(values); int result = Convert.
18、ToInt32(cmd.ExecuteScalar(); return result; public SqlDataReader GetReader(string sql) using (SqlCommand cmd = new SqlCommand(sql, Con) SqlDataReader reader = cmd.ExecuteReader(); return reader; public DataTable get_table(string sql) try if (con.State = ConnectionState.Closed) con.Open(); SqlDataAda
19、pter da = new SqlDataAdapter(sql, con); DataSet ds = new DataSet(); da.Fill(ds); return ds.Tables0; catch (Exception ex) throw ex; finally con.Close(); 十、 设计工程框架十一、 创建工程并设立主界面在VC#环境下创建Windows窗体项目MYhotel,在该项目中需要涉及一下界面:系统主界面,登陆界面,客房类型管理界面,客房信息管理界面,客户查询界面,客房查询界面,客户入住界面和客户结算界面。本界面由ToolStripMenuItem控件和一个
20、图片编辑框Picture组成。当成功地通过身份验证后,系统将展示主界面。重要有七个模块:客房类型管理、客户信息管理、客房查询、客户查询、客户入住查询、客户结算、退出系统。界面如下:十二、 设计登录模块 该登录只为系统管理人员所设计,运用Label,textbox ,button 控件来实现管理员的登录。十三、 功能模块设计客房类型管理界面设计及功能实现代码管理员可以在此界面上方便地修改客房的类型及打折活动,和添加新的客房类型信息或者删除不存在的客房信息。界面设计如下:客房查询界面设计: 在界面中,系统可以根据用户输入的一个或者几个条件来进行查询。同时还可以按“空房”和“未满”按钮来直接找出空房
21、和未满的房间。界面如下:当检索到的房间被选中时按下“入住”按钮,就可以进行客户入住操作。这样的目的是,当顾客入住宾馆时一般情况下都要先查一下符合规定的房间,然后在符合规定的房间中选择某个进行入住。这样操作方便快捷,便于管理。客户入住界面设计: 当客户查询到满意客房是,点击“入住”按钮进入到客户入住界面。在入住界面输入客户的相关信息和所住房间的信息。单击“保存”时,客户入住记录被保存到数据库中,并改变相应客房的的入住人数,等客户结算时添加相关信息,结算完毕后同时减少相应客房的入住人数。界面设计如下: 客户查询界面设计: 在此界面中输入客户的名字,此客户的信息就会显示出来:当单击“结账”按钮时,就
22、会进入到客户结算界面客户结算设计: 通过输入房间号或者客户姓名进行查找显示客户的入住情况,还可以在折扣中选择是否打折,开进行客户结算,单击“结算”按钮来完毕客户结算。十四、 系统演示及使用说明 在VC#环境下运营程序,出现登陆界面: 在输入管理员的登录名和密码后进入主功能界面: 当有客户要进行入住时,可以根据他们的规定进行客房查询,查找他们所需的客房类型及是否有空房,点击“客房查询”后进入客房查询界面:假如客户满意就,选择合适的房间,单击“入住按钮”,进入客户入住界面: 在此界面中进行客户信息的填写,单击“拟定”按钮该客户就添加到数据库中,以便以后的查询可客户结算。在客房类型管理中,可以增添或
23、者删除新的客房类型,还可以查找当前客房的所有类型:当客户结算时可以进入客户结算界面,通过输入客户的姓名或者所住房间号来查该客户的住房信息在此界面中进行结算,还可以根据客户类型选择是否打折,如下所示:十五、 问题及解决方法 问题1:在运营程序中,当登陆后,出现主功能界面的窗口,这时,登录窗口应当消失,但是却还显示如下图:解决方法:在登录按钮的click 事件中将本来的: if (result = 登录成功!) 主界面f = new 主界面(); f.Show(); 改为:if (result = 登录成功!) this.Visible = false; 主界面f = new 主界面(); f.S
24、how(); 问题2: 在客户入住时,记录客户信息,应当是一个客户信息只能添加一次,但在程序运营时,当反复添加相同的信息时,不会提醒反复。 将本来的代码: Insert customer = new Insert(number, name, sex, Id, kind, r_number, s_date, phone); i=customer.Insert_customer(); if(i=1) MessageBox.Show(插入成功!); 为了使判断条件不单单是客户的姓名,我们需要添加多个条件判断,代码修改如下:Insert customer1 = new Insert(); i = cu
25、stomer1.Select_customer(name); j = customer1.Select_room(r_number); s = customer1.Select_number(r_number); w = customer1.Select_num(Id); if (i = 1&w=1) MessageBox.Show(该客户已存在!); textBox4.Clear(); textBox2.Clear(); comboBox1.Text = ; textBox3.Clear(); comboBox2.Text = ; textBox1.Clear(); textBox6.Cle
26、ar(); textBox5.Clear(); if (j != 1) MessageBox.Show(该房间不存在); textBox1.Clear(); if (s != 1) MessageBox.Show(该?房间已注满,请重新选择!); textBox1.Clear(); if (i != 1 & j = 1&s=1) Insert customer = new Insert(number, name, sex, Id, kind, r_number, s_date, phone, customerinform); k = customer.Insert_customer(); if
27、 (k = 1) int m,n; MessageBox.Show(添加成功!); textBox1.Clear(); textBox2.Clear(); textBox3.Clear(); textBox4.Clear(); textBox5.Clear(); textBox6.Clear(); comboBox1.Text = ; comboBox2.Text = ; Insertroom ins = new Insertroom(); m = ins .Select (r_number); m = m + 1; n=ins.Update(r_number ,m); 问题3: 在客户结算时
28、,可以获取客户入住时间和离开时间,但是所用的是DateTime控件获取的,不能转为整型的天数: DateTime dt = new DateTime(int.Parse(str.Substring(0, 4), int.Parse(str.Substring(5, (str.IndexOf(月) - str.IndexOf(年)-1), int.Parse(str.Substring(str.IndexOf(月) + 1, (str.IndexOf(日) - str.IndexOf(月)-1); DateTime dt2 = dateTimePicker1.Value; string tmst
29、r=(dt2 - dt).ToString(); txtDay.Text = tmstr.Substring (0,tmstr .IndexOf (.); 解决方案:用一个字符串截取函数SubString();来截取DateTime中的一部分相减,然后后转化为字符串类型,显示在入住天数的textbox中,但是DateTime中,相减后有也许出现小数的天数,为解决此问题需将天数的小数部分再用SubString()进行截取小数点之前的部分加1这样就能不满一天按一天计算了。代码修改如下: DateTime dt = new DateTime(int.Parse(str.Substring(0, 4)
30、, int.Parse(str.Substring(5, (str.IndexOf(月) - str.IndexOf(年) - 1), int.Parse(str.Substring(str.IndexOf(月) + 1, (str.IndexOf(日) - str.IndexOf(月) - 1); DateTime dt2 = dateTimePicker1.Value; string tmstr = (dt2 - dt).ToString(); if (tmstr.Contains(.) txtDay.Text = (1 + int.Parse(tmstr.Substring(0, tms
31、tr.IndexOf(.).ToString(); else txtDay.Text = 1; 问题4: 在添加客户后,只更新了客房中床位数,但是客房的使用状态未更新,在客户查询和客户结算中与数据库绑定额DataGrivdeView中都未更新,因此需要添加一个更新函数: public int Update_UseState(string number, string use) int i; string sql = update 客房信息查询表括 使用状态= + use + where 客房?号= + number + ; DBHelps db = new DBHelps(); i = db.
32、ExecuteNonQuery(sql); return i; 七、课外实践总结 系统可以扩充的功能及系统展望受开发时间的限制和对VC#编程的技术水平,本系统的开发重要是完毕酒店客房的预订、入住、退房及信息查询的管理,这只是整个酒店管理系统的一部分内容,对系统的系统权限设立方面没有设立。此外本系统的美观方面局限性,没有增长系统提醒功能,如当顾客的入住日期届时,进行相关提醒。所以系统还存在较大的继续开发空间。这在做系统设计时已经考虑到了的,重要有以下几个方面:第一,进一步完善系统功能,增长商务中心管理模块、餐饮管理模块、电话计费模块,使得客人可以凭借房卡在酒店实现“一卡式”消费。第二,随着互联网
33、上电子商务的发展,没有开展电子商务的酒店将没有生机,将失去竞争力。特别是随着国内游泳业的发展,酒店竞争和发展迫在眉睫,它规定酒店经营者不断寻找新的经济增长点、采用新的营销模式。由于Internet具有传播面广、费用低、效率高的特点,有效地通过Internet进行电子商务模式的市场营销活动,将成为酒店在于剧烈市场竞争中成功的关键之一,如网上宣传、网上订房系统,而电子商务系统也必将成为酒店MIS的延伸和拓展。总结语 酒店管理系统是一个以计算机为工具,对酒店信息进行管理和解决的人机系统,它能准确、及时地反映酒店各项业务的当前状态,能运用过去的数据记录分析,能从全局出发辅助酒店各职能部门以及经理管理酒
34、店。可见,酒店信息系统一方面必须具有强大的电子数据解决功能,能大大提高酒店管理人员和操作人员的工作效率,减轻劳动强度,同时,该系统应当采用管理模型,将仿真、优化等现代决策手段结合起来,为酒店管理层的决策提供有效的信息。关于我的设计,尚有许多的设想(动态房台状态的显示,图表汇总,菜单权限的设立等)由于时间和自身和因素无法得以实现,这不能不说是本次设计的遗憾之处。但是,至少它已经启发了自己的思维,提高了我的动手能力,这是我在课本中学不到的。通过这次毕业设计我除了在VC#程序设计水平和数据库应用能力上有了很大限度的提高,也更加进一步地理解了与数据库相关的设计中常见问题和其相关设计的意义。八、源代码
35、在三层架构中,DAL层中两个类DBHelpes的代码如下:namespace DAL public class DBHelps private static SqlConnection con; public static SqlConnection Con get string strcon = Data Source=.;Initial Catalog=MYhotel;Integrated Security=SSPI; if (con = null) con = new SqlConnection(strcon); con.Open(); else if (con.State = System.Data.ConnectionState.Closed) con.Open(); else if (con.State = System.Data.ConnectionState.Broken) con.Close(); con.Open(); return con;