首页 酒店客房管理系统

酒店客房管理系统

举报
开通vip

酒店客房管理系统酒店客房管理系统 1.1.2 ADO.NET组件 328 1.1.3 数据绑定控件 339 1.2 概 述 339 1.3 需 求 分 析 341 1.3.1 理解需求 341 1.3.2 需求分析 341 1.4 UML系统建模 343 1.4.1 酒店客房管理系统的用例分析 343 1.4.2 酒店客房管理系统的域类分析 343 1.4.3 酒店客房管理系统的设计 344 1.5 系 统 配 置 346 1.5.1 软件配置 347 1.5.2 硬件配置 347 1.5.3 网络配置 348...

酒店客房管理系统
酒店客房 管理 档案管理制度成本管理项目成本管理财务成本管理档案管理制度及流程 系统 1.1.2 ADO.NET组件 328 1.1.3 数据绑定控件 339 1.2 概 述 339 1.3 需 求 分 析 341 1.3.1 理解需求 341 1.3.2 需求分析 341 1.4 UML系统建模 343 1.4.1 酒店客房管理系统的用例分析 343 1.4.2 酒店客房管理系统的域类分析 343 1.4.3 酒店客房管理系统的设计 344 1.5 系 统 配 置 346 1.5.1 软件配置 347 1.5.2 硬件配置 347 1.5.3 网络配置 348 1.6 数据库分析 349 1.6.1 E-R图分析 349 1.6.2 表与字段分析和SQL Server数据库建模 350 1.7 数据库设计 351 1.7.1 创建数据库 351 1.7.2 创建表 353 1.7.3 创建存储过程 357 1.8 连接数据库 361 1.9 页面设计及相关代码分析 363 1.9.1 酒店客房管理系统首页设计及其代码分析 363 1.9.2 客房信息管理页面设计及其代码分析 365 1.9.3 客房信息添加/修改页面设计及其代码分析 367 1.9.4 客房经营管理页面设计及其代码分析 371 1.9.5 订房/退房管理页面设计及其代码分析 374 1.9.6 经营状况统计页面设计及其代码分析 377 1.10 实 例 演 示 379 1.11 小 结 381 Microsoft .NET作为一种面向网络、支持各种用户终端的开发平台环境,推动新一代 因特网的发展,真正地让人们可以在任何时间、任何地点、通过任何设备得到信息。 C#是专门为.NET应用而开发出的语言,它能够建造所有的.NET应用。其固有的特性保证了它是一种高效、安全、灵活、面向对象的现代程序设计语言。从最普通的应用到大规模 的商业开发,C#与 .NET平台的结合将为用户提供完整的解决 方案 气瓶 现场处置方案 .pdf气瓶 现场处置方案 .doc见习基地管理方案.doc关于群访事件的化解方案建筑工地扬尘治理专项方案下载 。 ASP .NET是建立在.NET平台架构上,使用通用语言运行时(Common Language Runtime) 在服务器后端为用户提供建立强大的企业级Web应用服务的编程框架。 现代化的酒店组织庞大、服务项目多、信息量大,要想提高劳动生产、降低成本、提高 服务质量和管理水平,进而促进经济效益,必须借助计算机来进行现代化的信息管理。酒店 管理系统正是为此而设计的。优秀的酒店客房管理系统操作方便,灵活性好,系统安全性高, 运行稳定。本章将以典型的酒店客房管理系统作为实例,向读者详细讲述如何设计和使用C#和ASP .NET开发企业酒店客房管理系统。 1.1 .NET对数据库开发的支持 大多数C# 应用程序都是围绕读取和更新数据库中的信息展开的。为了允许在分布式、 可缩放应用程序中实现数据集成,Visual Studio .NET 提供对新一代数据访问技术 ADO .NET的支持。 1.1.1 ADO .NET概述 在介绍ADO .NET之前,先澄清一个概念:ADO .NET是一项超越ADO的重要技术,ADO .NET这个名字并不代表实际的内容—— ADO。ADO原来是表示ActiveX Data Objects,Microsoft已经将ADO .NET作为一种技术的名称。 ADO .NET是一组向.NET程序员公开数据访问服务的类。ADO .NET为创建分布式数据共享应用程序提供了一组丰富的组件。它提供了对关系数据、XML和应用程序数据的访问,因 此是.NET Framework中不可缺少的一部分。ADO .NET支持多种开发需求,包括创建由应用 程序、工具、语言或Internet浏览器使用的前端数据库客户端和中间层业务对象。 ADO .NET提供对Microsoft SQL Server等数据源以及通过OLE DB和XML公开的数在介绍如何实现ADO .NET访问SQL Server 2000数据库前,有必要介绍一下ADO .NET中的一个核心元素,它是.NET Framework数据提供程序,其组件的设计目的相当明确:为了实 现数据操作和对数据的快速、只进、只读访问。Connection对象提供与数据源的连接。 Command对象使用户能够访问用于返回数据、修改数据、运行存储过程以及发送或检索参 数信息的数据库命令。DataReader从数据源中提供高性能的数据流。最后,DataAdapter提供连接DataSet对象和数据源的桥梁。DataAdapter使用Command对象在数据源中执行SQL命令,以便将数据加载到DataSet中,并使对DataSet中数据的更改与数据源保持一致。 .NET Framework提供了4个.NET Framework数据提供程序,其中SQL Server .NET Framework数据提供程序就是用于实现对SQL Server 2000的连接访问,下面给出SQL Server .NET Framework的框架图,如图1-1所示。 图1-1 SQL Server .NET Framework结构 1.1.2 ADO.NET组件 为了实现对数据库的访问,ADO .NET定义了两个核心组件:DataSet和.NET Framework数据提供程序,后者是一组包括Connection,Command,DataReader和DataAdapter对象在内的组件。 1. DataSet DataSet对象是支持ADO.NET的断开式、分布式数据方案的核心对象。DataSet的设计目的很明确:为了实现独立于任何数据源的数据访问。因此,它可以用于多种不同的数据源, 用于XML数据,或用于管理应用程序本地的数据。DataSet包含一个或多个DataTable对象的集合,这些对象由数据行和数据列以及主键、外键、约束和有关DataTable对象中数据的关系信息组成。图10-2将显示DataSet对象模型。 图1-2 DataSet对象模型 (1) DataTablesCollection对象 DataSet里的表(Table)是用DataTable来表示的。一个DataSet包含DataTable对象所表示的零个或更多个表的集合。DataTableCollection包含DataSet中的所有DataTable对象。 DataTable在System.Data命名空间中定义,表示内存驻留数据表。它包含 DataColumn Collection所表示的列和ConstraintCollection所表示的约束的集合,这些列和约束一起定义 了该表的架构。DataTable还包含DataRowCollection所表示的行的集合,而DataRow Collection则包含表中的数据。除了其当前状态之前,DataRow还会保留其当前版本和初始版本,以标 识对行中存储的值的更改。 (2) RelationsCollection对象 DataSet在其DataRelationCollection对象中包含关系。关系由DataRelation对象来表示,它使一个DataTable中的行与另一个DataTable中的行相关联。关系类似于可能存在于关系 数据库中的主键列和外键列之间的联接路径。DataRelation标识DataSet中两个表的匹配列。 关系使用户能够在DataSet中从一个表导航至另一个表。DataRelation的基本元素为关系的名称、相关表的名称以及每个表中的相关列。关系可以通过一个表的多个列来生成,方 法是将一组DataColumn对象指定为键列。当关系被添加到DataRelationCollection中时,如果已对相关列值作出更改,它可能会选择添加一个UniqueKeyConstraint和一个Foreign KeyConstraint来强制完整性约束。 (3) ExtendedProperties对象 DataSet(以及DataTable和DataColumn)具有ExtendedProperties属性。ExtendedProperties是一个PropertyCollection,用户可以在其中放置自定义信息,例如用于生成结果集的SELECT语句或表示数据生成时间的日期/时间戳。ExtendedProperties集合与DataSet(以及DataTable和DataColumn)的架构信息一起保持。 2. .NET Framework数据提供程序 .NET Framework数据提供程序用于连接到数据库、执行命令和检索结果。用户可以直 接处理检索到的结果,或将其放入DataSet对象,以便与来自多个源的数据或在层之间进行 远程处理的数据组合在一起,以特殊方式向用户公开。 下表概括了组成.NET Framework数据提供程序的4个核心对象。 表1-1 .NET Framework 数据提供程序的核心对象 对 象 说 明 建立与特定数据源的连接 Connection 对数据源执行命令。公开Parameters,并且可以从Connection在Transa Command ction的范围内执行 从数据源中读取只进且只读的数据流 DataReader 用数据源填充DataSet并解析更新 DataAdapter (1) Connection对象 Connection对象有3种:SqlConnection,OleDbConnection和OdbcConnection。其中,SqlConnection主要用于连接SQL Server数据库。 表1-2 SqlConnection属性 表1-2显示了部分SqlConnection属性。 属 性 类 型 描 述 获取或设置用来打开数据库的字符串 ConnectionString string 获取重试建立数据库连接时等待的秒数 ConnectionTimeout int 获取当前数据库名 Database string 获取数据库服务器名 DataSource string 获取与SQL Server通信的网络分组的大小 PacketSize int 获取包含SQL Server版本的字符串 ServerVersion string 获取当前连接状态 State Connection 获取字符串,此字符串标识连接SQL ServerWorkstationId string 的计算机 表1-3显示了部分SqlConnection 方法 快递客服问题件处理详细方法山木方法pdf计算方法pdf华与华方法下载八字理论方法下载 。 表1-3 SqlConnection方法 方 法 返 回 类 型 描 述 重载,开始数据库事务 BeginTransaction() SqlTransaction 改变打开连接的当前数据库 ChangeDatabase() Void 关闭数据库连接 Close() Void 生成并返回一个命令对象 CreateCommand() SqlCommand 用连接字符串属性指定的属性设置打开数据库连接 Open() Void 下面介绍如何使用SqlConnection对象连接SQL Server数据库。 为了使用SqlConnection对象,首先需要导入System.Data.SqlClient命名空间。 using System.Data.SqlClient; 使用SqlConnection()构造函数生成SqlConnection对象。这个构造函数是重载的。 SqlConnection()如下: SqlConnection() SqlConnection(string connectionString) 其中,connectionString包含数据库连接的细节。 这里,我们使用下面语句生成新的SqlConnection对象: SqlConnection myConn = new SqlConnection(); 然后,可以使用myConn的连接字符串属性设置数据库连接的细节,如下所示。 myConn.ConnectionString = " server=localhost;uid=sa;pwd=;database=student "; 其中:server指定运行SQL Server的计算机名;database指定数据库名;uid指定数据 库用户名;pwd指定用户密码。 或者,可以将连接字符串直接传入SqlConnection()构造函数,来生成新的SqlConnection 对象。例如: String connectionString = " server=localhost;uid=sa;pwd=;database=student "; SqlConnection myConn = new SqlConnection(connectionString); 建立了对数据源的连接后,就可以打开数据库连接。只有打开它,才可以使用 SqlCommand或SqlDataAdapter对象对连接的数据源执行SQL命令或查询打开数据表。 下例调用myConn对象的Open()方法: myConn.Open(); 完成数据库操作之后,可以调用myConn对象的Close()方法,关闭数据库连接。例如: myConn. Close(); (2) Command对象 Command对象有3种:SqlCommand,OleDbCommand和OdbcCommand。其中, SqlCommand主要用于对SQL Server数据库执行命令。 表1-4显示了部分SqlCommand属性。 表1-4 SqlCommand属性 属 性 类 型 描 述 获取或设置要对数据源执行的 Transact-SQL CommandText string 语句或存储过程 获取或设置在终止执行命令的尝试并生成错CommandTimeout int 误之前的等待时间 获取或设置一个值,该值指示如何解释CommandType CommandType CommandText属性 获取或设置SqlCommand的此实例使用的数Connection string 据库连接名 获取或设置一个值,该值指示命令对象是否DesignTimeVisible bool 应在Windows窗体设计器控件中可见 获取提供给命令的参数 Parameters SqlParameterCollection 获取或设置将在其中执行SqlCommand的数Transaction SqlTransaction 据库事务 获取或设置命令结果在由DbDataAdapter的UpdatedRowSource UpdateRowSource Update方法使用时如何应用于DataRow 表1-5显示了部分SqlCommand方法。 表1-5 SqlCommand方法 方 法 返 回 类 型 描 述 试图取消SqlCommand的执行 Cancel() Void 创建SqlParameter对象的新实例 CreateParameter() SqlParameter 对连接执行Transact-SQL语句并返回受影响ExecuteNonQuery() int 的行数 已重载。将CommandText发送到 ConnectionExecuteReader() SqlDataReader 并生成一个SqlDataReader (续表) 方 法 返 回 类 型 描 述 执行查询,并返回查询所返回的结果集中第ExecuteScalar() object 一行的第一列。忽略额外的列或行 将CommandText发送到Connection并生成一ExecuteXmlReader() XmlReader 个XmlReader对象 在SQL Server的实例上创建命令的一个准备Prepare() void 版本 将CommandTimeout属性重置为其默认值 ResetCommandTimeout() void 对数据源的连接建立并打开后,必须使用Command对象执行SQL命令才能从数据库中取得所需的数据表。所以Command对象就是对数据源执行SQL命令的工具,包括:Select,Update,Insert,Delete等,也可以调用存储过程。例如: 生成SqlCommand对象有两种办法:一是使用SqlCommand构造函数,二是调用SqlConnection对象的CreateCommand()方法。 若使用SqlCommand构造函数,首先要有创建一个SqlConnection对象,用于和SQL Server数据库通信。这里,我们继续使用前面创建的myConn对象。 可以用下面语句生成新的SqlCommand对象: SqlCommand myCommand = new SqlCommand(); 然后,将myCommand对象的Connection属性设置为myConn: myCommand.Connection = mySqlConnection; 到此,myConn对象就可以使用myCommand对象与数据库通信了。 如果不用构造函数,也可以调用SqlConnection对象的CreateCommand()方法生成Sql Command对象。例如: SqlCommand myCommand = myConn.CreateCommand(); 若要执行SQL命令,可以通过CommandText属性来设置。下例将myCommand对象的CommandText属性设置为Update语句,如下: myCommand.CommandText = "Update StudentsInfo Set Sage=21 Where Sname='南潇' "; 最后,用ExecuteNonQuery()方法执行SELECT语句: myCommand.ExecuteNonQuery(); 如果执行成功,便可将南潇的年龄改成21。 (3) DataReader对象 DataReader对象用Command对象从数据库中读取记录。DataReader对象有3种: SqlDataReader,OleDbDataReader和OdbcDataReader。其中,SqlDataReader主要用于从SQL Server数据库中读行。 表1-6显示了部分SqlDataReader属性。 表1-6 SqlDataReader属性 属 性 类 型 描 述 获取一个值,该值指示当前行的嵌套深度 Depth int 获取当前行中的列数 FieldCount int 获取一个值,该值指示数据读取器是否已关闭 IsClosed bool 获取执行Transact-SQL语句所更改、插入或RecordsAffected int 删除的行数 表1-7显示了部分SqlDataReader方法。 表1-7 SqlDataReader方法 方 法 返 回 类 型 描 述 获取指定列的布尔值形式的值 GetBoolean() bool 获取指定列的字节形式的值 GetByte() byte 以指定的列偏移量将字节流读入缓冲区,并将其GetBytes() long 作为从给定的缓冲区偏移量开始的数组 获取指定列的单个字符串形式的值 GetChar() char 以指定的列偏移量将字符流作为数组从给定的GetChars() long 缓冲区偏移量开始读入缓冲区 获取源数据类型的名称 GetDataTypeName() string 获取指定列的DateTime对象形式的值 GetDateTime() DateTime 获取指定列的Decimal对象形式的值 GetDecimal() decimal 获取指定列的双精度浮点数形式的值 GetDouble() double 获取是对象的数据类型的 Type GetFieldType() Type 获取指定列的单精度浮点数形式的值 GetFloat() float 获取指定列的全局惟一标识符(GUID)形式的值 GetGuid() Guid 获取指定列的16位有符号整数形式的值 GetInt16() Short 获取指定列的32位有符号整数形式的值 GetInt32() int 获取指定列的64位有符号整数形式的值 GetInt64() long (续表) 方 法 返 回 类 型 描 述 获取指定列的名称 GetName() string 在给定列名称的情况下获取列序号 GetOrdinal() int 返回一个DataTable,它描述SqlDataReader的列GetScheduleTable () DataTable 元数据 获取指定列的SqlBinary形式的值 GetSqlBinary() SqlBinary 获取指定列的SqlBoolean形式的值 GetSqlBoolean() SqlBoolean 获取指定列的SqlDecimal形式的值 GetSqlDecimal() SqlDecimal 获取指定列的SqlDouble形式的值 GetSqlDouble() SqlDouble 获取指定列的SqlGuid 式的值 GetSqlGuid() SqlGuid 获取指定列的SqlInt16形式的值 GetSqlInt16() Int16 获取指定列的SqlInt32形式的值 GetSqlInt32() Int32 获取指定列的SqlInt64形式的值 GetSqlInt64() SqlInt64 获取指定列的SqlMoney形式的值 GetSqlMoney() SqlMoney 获取指定列的SqlSingle形式的值 GetSqlSingle() SqlSingle 获取指定列的SqlString形式的值 GetSqlString() SqlString 获取一个表示基础SqlDbType变量的Object GetSqlValue() object 获取当前行的集合中的所有属性列 GetSqlValues() int 获取指定列的字符串形式的值 GetSqlString() SqlString 获取以本机格式表示的指定列的值 GetValue() object 获取当前行的集合中的所有属性列 GetValues() int 获取一个值,该值指示列中是否包含不存在的或IsDBNull() bool 缺少的值 当读取批处理Transact-SQL语句的结果时,使NextResult() bool 数据读取器前进到下一个结果 使SqlDataReader前进到下一条记录 Read bool 生成DataReader对象只能通过Command对象的ExecuteReader()方法。例如,下列代码 生成所要的对象并执行一个Select语句,从数据库Student的StudentsInfo表中读取所有记 录,将返回的行存放在SqlDataReader对象中。 String connectionString = " server=localhost;uid=sa;pwd=;database=student "; SqlConnection myConn = new SqlConnection(connectionString); SqlCommand myCommand = myConn.CreateCommand(); myCommand.CommandText = " Select Stu_Id, Sname, Sgender, Sage, Sdept " +" From StudentsInfo " +" Order By Stu_Id"; myConn.Open(); SqlDataReader myReader = myCommand.ExecuteReader(); 如果要从DataReader对象中取行,可以使用Read()方法。这个方法在还有可读行时返 回布尔值true,否则返回布尔值false。 可以从DataReader中读取一行中单独的列值,方法是在方括号中传递列名。例如,要 读取Stu_Id,使用myReader["Stu_Id"]。也可以指定需要的列,方法是在括号中传递一个数 值。例如,myReader["Stu_Id"]也返回Stu_Id列值。 while ( myReader.Read() ) 下面的代码演示了这两种读取列值的方法。使用列名读取列值: { Console.WriteLine( myReader["Stu_Id"] ); Console.WriteLine( myReader["Sname"] ); Console.WriteLine( myReader["Sgender"] ); Console.WriteLine( myReader["Sage"] ); Console.WriteLine( myReader["Sdept"] ); } 使用数字列位置读取列值: while ( myReader.Read() ) { Console.WriteLine( myReader[0] ); Console.WriteLine( myReader[1] ); Console.WriteLine( myReader[2] ); Console.WriteLine( myReader[3] ); Console.WriteLine( myReader[4] ); } 完成读取操作之后,可以调用Close()方法关闭myReader对象: myReader. Close(); (4) DataAdapter对象 DataAdapter对象有3种:SqlDataAdapter,OleDbDataAdapter和OdbcDataAdapter。其 中,SqlDataAdapter对象同步DataSet对象中存储的数据与SQL Server数据库中的数据。 表1-8显示了部分SqlDataAdapter属性。 表1-8 SqlDataAdapter属性 属 性 类 型 描 述 获取或设置一个值,该值指示在任何 FillAcceptChangesDuringFill bool 操作过程中,在将AcceptChanges添加到 DataTable之后是否针对DataRow调用它 获取或设置一个值,该值指定在行更新ContinueUpdateOnError bool 过程中遇到错误时是否生成异常 获取或设置一个Transact-SQL语句或存SelectCommand SqlCommand 储过程,用于在数据源中选择记录 获取或设置一个Transact-SQL语句或存InsertCommand SqlCommand 储过程,以在数据源中插入新记录 获取或设置一个Transact-SQL语句或存DeleteCommand SqlCommand 储过程,以从数据集删除记录 获取或设置一个Transact-SQL语句或存UpdateCommand SqlCommand 储过程,用于更新数据源中的记录 确定传入数据没有匹配的表或列时需要MissingMappingAction MissingMappingAction 执行的操作 确定现有DataSet架构与传入数据不匹MissingSchemaAction MissingSchemaAction 配时需要执行的操作 获取一个集合,它提供源表和DataTableTableMappings DataTableMapping- 之间的主映射 Collection 表1-9显示了部分SqlDataAdapter方法。 表1-9 SqlDataAdapter方法 方 法 返 回 类 型 描 述 已重载。已重写。在DataSet中添加或刷新行以Fill() int 匹配数据源中的行 已重载。已重写。将DataTable添加到DataSet FillSchema() DataTable[ ] 中,并配置架构以匹配数据源中的架构 已重写。获取当执行SQL SELECT语句时由用GetFillParameters() IDataParameter[ ] 户设置的参数 已重载。为DataSet中每个已插入、已更新或已Update() int 删除的行调用相应的INSERT、UPDATE 或 DELETE语句 使用SqlDataAdapter ()构造函数生成SqlDataAdapter对象。这个构造函数是重载的。 SqlDataAdapter ()如下: SqlDataAdapter () SqlDataAdapter (SqlCommand mySqlCommand) SqlDataAdapter (String selectCommandString, SqlConnection mySqlConnection) SqlDataAdapter (String selectCommandString, String connectionString) 其中,mySqlCommand指定SqlCommand对象,selectCommandString指定Select语句 或存储过程调用,mySqlConnection指定SqlConnection,connectionString指定连接数据库的 连接字符串。 下例使用SqlDataAdapter ()构造函数生成SqlDataAdapter对象: SqlDataAdapter myAdapter = new SqlDataAdapter (); 用myAdapter建立DataSet对象之前,要将其SelectCommand属性设置为包含Select语 句或存储过程的SqlCommand对象。下面将生成SqlCommand对象,并将CommandText属 性设置为Select语句,从StudentsInfo表中读取所有记录,将myAdapter的Select Command属 SqlCommand myCommand = myConn.CreateCommand(); 性设置为这个SqlCommand对象。 myCommand.CommandText = " Select Stu_Id, Sname, Sgender, Sage, Sdept " +" From StudentsInfo " +" Order By Stu_Id"; myAdapter.SelectCommand = myCommand; 下例使用SqlDataAdapter (SqlCommand mySqlCommand)构造函数生成SqlDataAdapter对象: SqlDataAdapter myAdapter = new SqlDataAdapter (myCommand); 下例使用SqlDataAdapter (String selectCommandString, SqlConnection mySqlConnection) 构造函数生成SqlDataAdapter对象: SqlConnection myConn = new SqlConnection( " server=localhost;uid=sa;pwd=;database=student " ); String selectCommandString = " Select Stu_Id, Sname, Sgender, Sage, Sdept " +" From StudentsInfo " +" Order By Stu_Id"; SqlDataAdapter myAdapter = new SqlDataAdapter (selectCommandString, myConn); 最后,使用SqlDataAdapter (String selectCommandString, String connectionString)构造函数生成SqlDataAdapter对象: String selectCommandString = " Select Stu_Id, Sname, Sgender, Sage, Sdept " +" From StudentsInfo " +" Order By Stu_Id"; String connectionString = " server=localhost;uid=sa;pwd=;database=student "; SqlDataAdapter myAdapter = new SqlDataAdapter (selectCommandString, connectionString); 创建DataAdapter对象之后,就可以使用Fill()方法填充DataSet对象了。例如: DataSet myDataSet = new DataSet(); myAdapter.Fill(myDataSet, " StudentsInfo"); 上例中,我们将StudentsInfo表中的行填充到了DataSet对象中。 1.1.3 数据绑定控件 使用ADO.NET连接数据库并创建DataSet,主要是为了显示和操作数据库中的数据。 要在Web程序中实现数据的显示和操作,则必须将数据与页面中的控件绑定起来,通过控 件来显示和处理数据。 ASP.NET提供了Repeater,DataList和 DataGrid 3种服务器端控件。这些控件将数据集 合表现为基于HTML的界面。 Repeater,DataList,DataGrid控件是System.Web.UI.WebControls命名空间(Namespace)里几个相关的页面组件。这些控件把绑定到它们的数据通过HTML表现出来,它们又被称为“列表绑定控件”(list-bound controls)。 和其他Web组件一样,这些组件不仅提供了一个一致的编程模型,而且封装了与浏览 器版本相关的HTML逻辑。这种特点使得程序员可以针对这个对象模型编程,而无须考虑 各种浏览器版本的差别和不一致性。 这三个控件具有把它们的相关数据“翻译”成各种外观的能力。这些外观包括表格、多 列列表或者任何的HTML流。同时,它们也允许创建任意的显示效果。除此之外,它们还 封装了处理提交数据、状态管理、事件激发的功能。最后,它们还提供了各种级别的 标准 excel标准偏差excel标准偏差函数exl标准差函数国标检验抽样标准表免费下载红头文件格式标准下载 操 作,包括选择、编辑、分页、排序,等等。使用这些控件,可以轻松地完成如下的Web应 用:报表、购物推车、产品列表、查询结果显示、导航菜单,等等。 因篇幅所限,这三个控件的工作机理就不再进行介绍了,读者可以查阅相应的技术文 档。 1.2 酒店客房管理系统的主要任务是对酒店的客房进行管理,使用户能轻松地找到所需要的 客房信息,提供订房和退房服务,并对酒店客房的业绩进行统计。图10-3是一个典型的酒店客房管理系统的界面。 图1-3 典型的酒店客房管理系统界面 在不同的酒店之间,酒店客房管理系统会存在一些差异。通常,酒店客房管理系统的主 要功能包括以下几个方面。 (1) 用户信息管理:对酒店客房管理系统的使用员工进行管理,包括对员工的基本信息 (如用户姓名、所属部门、用户类型等)进行检索、录入和修改。 (2) 客房类型管理:用户可自定义客房类型,并对其进行管理,包括对客房类型的基本 信息(如类型名称、面积、床位、价格等)进行检索、录入和修改。 (3) 客房信息管理:用户对客房信息进行管理,包括对客房的基本信息(如客房号、客房类型、客房位置等)进行检索、录入和修改。 (4) 客房经营管理:实现对客房的订房和退房管理,包括对客房的业务信息(如客房号、入房时间、退房时间、金额等)进行检索、录入和修改。 (5) 客户信息查询:用户可对入住过酒店的客户信息进行查询,包括对客户的基本信息 (如身份证号、客户姓名、联系电话)进行检索。 (6) 经营状况统计:根据酒店客房的业务记录,用户可选择不同的统计方式对营业额进 行统计。 从功能描述的内容来看,本实例可以实现六大功能。我们根据这些功能,设计出系统的 功能模块,如图1-4所示。 图1-4 酒店客房管理系统功能模块示意图 读者只要根据本酒店的具体情况,补充完善上述功能,就可以应用到实际应用中去。酒 店客房管理系统作为当前使用非常广泛的数据库应用系统之一,其开发过程包括需求分析、 UML系统建模、数据库分析和设计以及各功能模块的实现。我们将在后面几节中详细讲述。 1.3 需求分析阶段是酒店客房管理系统开发最重要的阶段。开发者首先要了解和澄清用户的 需求,然后严格地定义该系统的需求规格说明书。这里我们将需求分析分为两个过程,一是 理解需求,二是分析需求,下面分别讲解。 1.3.1 理解需求 理解需求是在问 快递公司问题件快递公司问题件货款处理关于圆的周长面积重点题型关于解方程组的题及答案关于南海问题 及其最终解决方案之间架设桥梁的第一步。开发者只有和客户充分理 解了需求之后才能开始设计系统,否则,对需求定义的任何改进,在设计上都必须大量的返 工。下面是经过双方调研后得到的需求规格说明。 (1) 系统界面采用Web方式,界面应简洁明了,用户可方便浏览和查找客房信息。该 系统的用户有两种类型:一是管理员,二是服务员,两者应具有不同的权限。 (2) 系统需对用户登录进行管理。使用各功能模块时,系统应验证用户身份的有效性, 否则要求用户登录。另外,允许用户对自己的密码进行修改。 (3) 系统应提供客房的分类管理功能,可分类制订客房面积、价格、是否配备空调等客房 类型,对不同标准的客房进行有效管理。系统可实现对客房信息的添加、删除以及修改。 (4) 在进行订房/退房管理时,系统可以根据客房当前的状态自动提示可用服务(订房/退房)。如果客房没有客人入住,则该客房的可用服务为“订房”;否则,可用服务为“退房”。 (5) 系统在各功能模块的实现当中,提供多级分类检索和组合搜索。 (6) 系统的客户端在Windows平台下运行,服务器端可在Windows平台或UNIX平台下运行。系统还需要有较好的安全性和可扩展性。 1.3.2 需求分析 需求分析是从客户的需求中提取出软件系统能够帮助用户解决的业务问题,通过对用户 业务问题的分析,规划出系统的功能模块,即定义用例。这个步骤是对理解需求的升华,直 接关系到该系统的质量。 经过开发者同客户的需求分析后,确定酒店客房管理系统的功能模块(用例)包括: ? 用户信息管理 ? 客房类型管理 ? 客房信息管理 ? 客房经营管理 ? 客户信息查询 ? 经营状况统计 酒店系统完全采用Web方式,由前台和后台管理两个部分组成。前台作为与用户直接 交互的可视化界面,由于使用方便,能将系统的各个功能提供给用户,以帮助用户进行客房 管理。酒店系统前台的结构图如图1-5所示。 图1-5 酒店客房管理系统前台结构图 前台在考虑功能实现的同时,也考虑了操作的简洁和方便性,目的是让大多数客户能够 轻松地享受电子商务给他们带来的便利。 为了确保客户和酒店的信息具有更好的安全性,前台管理和后台管理是分离的。前台的 各管理模块需要经过权限授权才可以使用,我们为此设计了两个角色:一是酒店管理员,二 是前台服务员。其中: ? 酒店管理员享有最高权限,可以使用酒店客房管理系统所提供的所有功能,包括员 工信息管理、客房类型管理、客房信息管理、客房经营管理、客户信息查询、经营 状况统计、个人密码修改以及注销功能。 ? 前台服务员的主要职能是负责订房和退房,以及查询入住的客户信息。所有该角色 只可以使用部分功能,包括客房经营管理、客户信息查询、个人密码修改以及注销 功能。 后台管理主要由数据库系统作为支持,后台管理的维护工作主要由系统管理员进行,包 括完成对各个数据表单的维护、数据库的备份及恢复等工作,本实例我们选用的数据库系统 为SQL Server 2000。 1.4 UML 需求分析完成后,接下来的工作是对系统建模。因为UML很适合于对逻辑数据库模式和物理数据库模式建模,所以我们对系统进行UML建模。下面是酒店客房管理系统的 UML 建模过程。这里我们将使用Rational Rose进行UML建模。 1.4.1 酒店客房管理系统的用例分析 系统的用例分析是UML建模的第一步。在上一节需求分析中,我们已经确定了酒店客 房管理系统的各功能模块(用例),包括用户信息管理、客房类型管理、客房信息管理、客房 经营管理、客户信息查询、经营状况统计等。其用例图如图1-6所示。 图1-6 酒店客房管理系统用例图 该用例图标记了酒店客房管理系统的所有用例,并且形象地描述了各用例与用户角色之 间的关系。用例图所表示的各用例的作用以及各用户角色的权限因篇幅所限不再赘述,请读 者参看上一节的需求分析部分。 1.4.2 酒店客房管理系统的域类分析 接下来我们对系统进行域类分析。由于类图用于对系统的静态设计视图建模,支持系统 的功能需求(即系统要提供的最终服务),因此我们在此使用类图来进行域类分析。域类分析 是建立在用例分析基础上的,我们根据用例来确定酒店客房管理系统中所要用到的类及类间 的关系,从而得到域类图,如图1-7所示。 在域类分析时,设计该系统的类图应注意以下两点。 (1) 对数据对象类的确定 确定对象类时需要考虑:结合数据库细节,定义类的标记值,展开这些类的结构性细节, 即属性的细节。根据酒店客房管理系统的用例分析,我们确定所用到的类主要包括:用户信 息(UsersInfo)、客户信息(CustomersInfo)、客房类型(RoomCategory)、客房信息(RoomsInfo)、 客房状态(RoomStatus)、客房业务(RoomOperation)、业务记录(History)。 (2) 对各类间关联的确定 观察各类之间的关系,如循环关联、一对一关联和n-元关联等,从而确定各类间的关 联。酒店客房管理系统的各类间的关联可根据系统功能用例来确定,比如客房信息 (RoomsInfo)类和客房类别(RoomCategory)类之间是1: n的关联。关联须谨慎确定,以保证数据的完整性,防止以后频繁的修改而影响系统的开发进度。 图1-7 酒店客房管理系统域类图 1.4.3 酒店客房管理系统的设计 在UML中,对系统的动态方面建模的五种图有:用例图、活动图、状态图、时序图和 协作图。在设计阶段,我们需要使用状态图来描述类的对象的状态及其行为,显示对象的整 个生命周期。在本系统中,有状态图的类有客房信息(RoomsInfo),该类的状态图如图1-8 所示。 图1-8 状态图 另外,在多数情况下,为了描述用例的动态行为,我们还需要用到时序图。时序图可以 单独使用,以可视化、详述、构造和文档化一个特定对象群体的动态信息,对一个实例的特 定控制流进行建模。下面我们给出各个用例的时序图,以帮助我们接下来的设计工作。 订房管理的时序图,如图1-9所示。 图1-9 订房管理时序图 退房管理的时序图,如图1-10所示。 图1-10 退房管理时序图 可以类似上述时序图的方式画出其它用例的时序图,考虑到本书篇幅所限,这里就不再 赘述,请读者自己完成。 到此,经过了需求分析,使用UML建模绘出了各用例的用例图、状态图、时序图之后, 我们已经对酒店客房管理系统的具体功能实现有了比较明确的认识。接下来,需要我们对系 统进行框架设计和详细设计。 在进行构架设计时,我们将酒店客房管理系统设计视图中的类组织成一个标准的三级体 系结构,如图10-11所示。用户服务包(User Services)中的元素提供了表现信息和收集的可视 化界面。业务服务包(Bussiness Services)中的元素负责维护、访问和修改数据。数据服务包 (Data Services)中的元素为另两个包的元素搭桥,并包含了管理用户请求(为了执行业务上的任务)的所有类和其他元素,包括支配数据操纵策略的业务规则。 图1-11 酒店客房管理系统的体系结构 然后,就可以进行详细设计了。至此,UML系统建模完成。 1.5 好的数据库系统必然有一个性能价格比最优的系统配置方案。系统配置要根据用户的实 际情况设计,主要依据就是系统的吞吐量和系统对稳定性的要求,此外,用户的维护水平也 是一个重要的方面。 1.5.1 软件配置 酒店客房管理系统的软件配置要根据用户对系统的稳定性要求、系统的容量以及用户的 维护水平来确定。 可以根据用户量的大小选择不同的操作系统。当然,一般情况下,雇员对微软Windows界面比较熟悉,因此,建议客户端都使用Windows 2000或者Windows XP操作系统。 服务器端的选择如表1-10所示。 表1-10 酒店客房管理系统服务器端操作系统的选择 每秒数据库并发 稳定性 维护 用 户 备选操作系统 数据访问记录数 要求 水平 Windows 2000 Professional,Windows 小型酒店 10~50 低 差 XP 中小型酒店 50~500 中 一般 Windows NT,Windows 2000 Server、 Windows XP Windows NT,Windows 2000 Server,中型酒店 500~2000 较高 较好 Windows XP,Linux、UNIX 大型酒店 500~2000 较高 较好 UNIX 大型综合性酒店 2000以上 高 好 UNIX 为便于读者学习,这里选择Windows 2000 Server作为服务器端操作系统。 1.5.2 硬件配置 硬件配置主要包括客户端硬件的选择和服务器端硬件的选择。酒店客房管理系统的硬件 配置要根据用户对系统的稳定性要求、系统的容量、系统的吞吐量以及用户的维护水平来确 定。 (1) 客户端硬件选择 可以根据稳定性要求选择不同的客户端硬件。一般情况下,对客户端硬件的要求不高。 如表1-11所示。 表1-11 酒店客房管理系统客户端硬件的选择 用 户 稳定性要求 备选客户端 酒店管理员客户端 低 Pentium CPU/64MB/4GB 前台服务员客户端 中 Pentium ?/256MB/20GB (2) 服务器端硬件选择 可以根据数据量和吞吐量的大小选择不同的服务器硬件。服务器端硬件的选择如表 10-12所示。 表1-12 酒店客房管理系统服务器端硬件的选择 每秒数据库并发 稳定性 维护 用 户 备选服务器 数据访问记录数 要求 水平 小型酒店 10~50 低 差 Pentium ?/256MB/20GB个人计算机 中小型酒店 50~500 中 一般 Xeon双CPU/1GB/RAID5 3×72GB 中型酒店 50~500 中 一般 Xeon双CPU/1GB/RAID5 3×72GB 小型计算机/双机热备 大型酒店 500~2000 较高 较好 或者Xeon 4CPU/4GB/RAID5 6× 72GB 小型计算机/双机热备 大型综合性酒店 2000以上 高 好 或者Xeon 4CPU/4GB/RAID5 6× 72GB 当然,这种配置不是绝对的,这里只给出参考配置的范围。具体的配置需要根据用户的 需求精确计算。 1.5.3 网络配置 酒店客房管理系统的网络配置一般有如下几种类型。 (1) 单机模式:即服务器和客户端在一台计算机上。 (2) 百兆模式:计算机网络的速度为百兆,如图1-12所示。 客房总台终端餐饮吧台终端餐饮总台终端 百兆交换机 客房吧台终端客房服务台终端应用服务器数据库服务器 图1-12 酒店客房管理系统网络百兆配置 (3) 千兆模式:计算机网络的速度为千兆。实际上,没有必要给每个节点都配备千兆网 络接口,只需要给服务器端配备千兆接口即可,如图1-13所示。 客房总台终端餐饮吧台终端餐饮总台终端 千兆端口 千兆交换机 百兆端口 客房吧台终端客房服务台终端应用服务器数据库服务器 图1-13 酒店客房管理系统网络千兆配置 可以根据用户情况选择不同的网络配置,如表1-13所示。 表1-13 酒店客房管理系统网络配置的选择 每秒数据库并发 稳定性 维护 用 户 备选网络方案 数据访问记录数 要求 水平 小型酒店 10~50 低 差 单机模式 中小型酒店 50~500 中 一般 百兆模式 中型酒店 50~500 中 一般 百兆模式 大型酒店 500~2000 较高 较好 百兆模式 大型综合性酒店 2000以上 高 好 千兆模式 1.6 UML系统建模工作完成后,接下来的工作就是数据库分析了。数据库分析是整个数据 库应用系统开发过程中的一个重要环节,它具体可分为两个部分:一是概念模型的分析,即 E-R图的分析;二是逻辑模型的分析,即表与字段的分析。 由于在数据库设计时要同时考虑多方面的问题,使设计工作变得十分复杂,因此需要软 件来实现。在本节中,我们将使用SQL Server 2000自带的视图工具来进行E-R图分析和数据库建模。 1.6.1 E-R图分析 E-R图的分析工作通常采用自底向下的设计方法,首先对局部视图进行分析设计,然后 再实现视图集成。对酒店客房管理系统的E-R 图分析是建立在UML系统模型基础上的,我们不再对局部视图进行设计。在视图集成时,注意消除冲突、冗余,这里,我们直接给出视 图集成后的E-R图,如图1-14所示。 图1-14 酒店客房管理系统E-R图 1.6.2 表与字段分析和SQL Server数据库建模 表与字段分析是建立在E-R图基础上的,我们可以通过E-R图确定系统中所有表与字段的属性。表与字段分析后就可以使用SQL Server 2000建立数据库模型了。我们以图10-14 的酒店客房管理系统的E-R图为基础,可设计表字段,然后建立数据库模型。建立的数据 库模型如图1-15所示。 图1-15 酒店客房管理系统的数据库模型 1.7 数据库分析完成后,我们就可以对数据库进行设计了。在酒店客房管理系统中,数据库 的设计工作主要包括建立管理系统的数据库,创建所需要的表,也可以设计相关的视图及存 储过程。这些设计工作都在SQL Server 2000环境下操作并实现。 1.7.1 创建数据库 在设计数据库表结构之前,首先要创建一个数据库。本系统使用的数据库名为JdglSys。 用户可以在企业管理器中创建数据库,步骤如下。 (1) 启动SQL Server 2000数据库 在系统桌面上选择“开始”|“程序”| Microsoft SQL Server |“服务管理器”命令,然后单击“启动”按钮,即启动SQL Server 2000。 (2) 启动企业管理器 选择“开始”|“程序”| Microsoft SQL Server |“企业管理器”命令,启动数据库的管 理界面。 (3) 新建数据库 展开Microsoft SQL Server | local |“数据库”后,右键单击“数据库”按钮,在弹出的 菜单中选择“新建数据库”命令后,会弹出新建数据库窗口,如图1-16所示。 图1-16 新建数据库窗口 在“名称”项中输入新数据库的名称JdglSys。单击“数据文件”标签页后,输入数据库 文件的存放位置;单击“事务日志”标签页后,输入数据库日志的存放位置,如图1-17所示。 设置完成后,单击“确定”按钮即完成数据库的创建。 图1-17 数据库文件和日志文件的存放位置 读者也可以在SQL Server提供的查询分析器中执行以下Transact-SQL语句: CREATE DATABASE JdglSys ON PRIMARY ( NAME = JdglSys_Data, FILENAME = 'c:\program files\microsoft sql server\mssql\data\JdglSys_Data.mdf', SIZE = 100MB, MAXSIZE = 200, FILEGROWTH = 20) LOG ON ( NAME = JdglSys_Log, FILENAME = 'c:\program files\microsoft sql server\mssql\data\JdglSys_Log.ldf', SIZE = 100MB, MAXSIZE = 200, FILEGROWTH = 20), GO 以上的Transact-SQL语句保存在随书光盘的“Chap10\DB\CreateDB.sql”中。 1.7.2 创建表 数据库JdglSys包含以下7个表:用户信息表(UsersInfo)、客户信息表(CustomersInfo)、 客房类型表(RoomCategory)、客房信息表(RoomsInfo)、客房状态表(RoomStatus)、客房业务 表(RoomOperation)、业务记录表(History)。 下面分别介绍这些表的结构。 (1) 用户信息表 用户信息表(UsersInfo)用来保存使用该系统的酒店员工的基本信息,表UsersInfo的结 构如表1-14所示。 表1-14 用户信息表(UsersInfo) 编 号 字 段 名 称 数 据 结 构 说 明 用户编号 1 UserId Int 用户姓名 2 Name Varchar(50) 密码 3 Password Varchar(50) 性别(0-男,1-女) 4 Gender Int Email地址 5 Email Varchar(50) 通讯地址 6 Address Varchar(50) 联系电话 7 Telephone Varchar(50) 所在部门 8 Department Varchar(50) 用户类型(1-酒店管理 员,2-前台服务员 9 Type Int (2) 客户信息表 客户信息表(CustomersInfo)用来保存在酒店订房的客户的基本信息,表CustomersInfo 的结构如表1-15所示。 表1-15 客户信息表(CustomersInfo) 编 号 字 段 名 称 数 据 结 构 说 明 身份证号 1 CIdentityId nVarchar(50) 客户姓名 2 CName nVarchar(50) 联系电话 3 CPhone nVarchar(50) (3) 客房类型表 客房类型表(RoomCategory)用来保存酒店所有客房类型的基本信息,表RoomCategory 表1-16 客房类型表(RoomCategory) 的结构如表1-16所示。 编 号 字 段 名 称 数 据 结 构 说 明 客房类型编号 1 RCategoryId Int 类型名称 2 Name nVarchar(50) 客房面积 3 Area Float 配置床位 4 BedNum Int 客房价格 5 Price Money 配置空调(0-是,1-6 AirCondition Int 否) 配置电视(0-是,1-7 TV Int 否) (4) 客房信息表 客房信息表(RoomsInfo)用来保存酒店所有客房的相关信息,表RoomsInfo结构的如表 1-17所示。 表1-17 客房信息表(RoomsInfo) 编 号 字 段 名 称 数 据 结 构 说 明 客房号 1 RoomId Int 客房类型编号 2 RCategoryId Int 客房位置 3 RPostition nVarchar(50) 描述 4 Description nVarchar(50) (5) 客房状态表 客房状态表(RoomStatus)用来保存客房使用情况的基本信息,表RoomStatus结构的如表 1-18所示。 表1-18 客房状态表(RoomStatus) 编 号 字 段 名 称 数 据 结 构 说 明 客房编号 1 RoomId Int 状态(1-空房,2-入住) 2 Status Int (6) 客房业务表 客房业务表(RoomOperation)用来保存目前酒店正有客户入住的客房的相关信息,表 RoomOperation的结构如表1-19所示。 表1-19 客房业务表(RoomOperation) 编 号 字 段 名 称 数 据 结 构 说 明 客房编号 1 RoomId Int 入住时间 2 BeginTime DateTime 客户身份证号 3 CIdentityId nVarchar(50) 备注 4 Remarks nVarchar(50) (7) 业务记录表 业务记录表(History)用来保存酒店里所有入住过客户的客房的业务信息,表History的 结构如表1-20所示。 表1-20 业务记录表(History) 编 号 字 段 名 称 数 据 结 构 说 明 入住时间 1 BeginTime DateTime 退房时间 2 EndTime DateTime 客房编号 3 RoomId Int 金额 4 TotalPrice Money 客户身份证号 5 CIdentityId nVarchar(50) 客户姓名 6 CName nVarchar(50) 客户电话 7 CPhone nVarchar(50) 备注 8 Remarks nVarchar(50) 用户可以在企业管理器手动创建表,但这样做非常麻烦。为了使读者能够方便地创建表, 本书提供了创建表的脚本文件,它们保存在随书光盘的“Chap10\DB\WsglSQL.sql”中。读 者可以直接在查询分析器中创建这些表。 (1) 创建用户信息表(UsersInfo)的脚本文件如下: CREATE TABLE [dbo].[UsersInfo] ( [UserId] [int] NOT NULL , [Name] [varchar] (50) COLLATE Chinese_PRC_CI_AS NULL , [Password] [varchar] (50) COLLATE Chinese_PRC_CI_AS NULL , [Gender] [int] NULL , [Email] [varchar] (50) COLLATE Chinese_PRC_CI_AS NULL , [Address] [varchar] (50) COLLATE Chinese_PRC_CI_AS NULL , [Telephone] [varchar] (50) COLLATE Chinese_PRC_CI_AS NULL , [Department] [varchar] (50) COLLATE Chinese_PRC_CI_AS NULL , [Type] [int] NULL ) ON [PRIMARY] (2) 创建客户信息表(CustomersInfo)的脚本文件如下: CREATE TABLE [dbo].[CustomersInfo] ( [CIdentityId] [nvarchar] (50) COLLATE Chinese_PRC_CI_AS NOT NULL , [CName] [nvarchar] (50) COLLATE Chinese_PRC_CI_AS NULL , [CPhone] [nvarchar] (50) COLLATE Chinese_PRC_CI_AS NULL ) ON [PRIMARY] (3) 创建客房类型表(RoomCategory)的脚本文件如下: CREATE TABLE [dbo].[RoomCategory] ( [RCategoryId] [int] IDENTITY (1, 1) NOT NULL , [Name] [varchar] (50) COLLATE Chinese_PRC_CI_AS NULL , [Area] [float] NULL , [BedNum] [int] NULL , [Price] [money] NULL , [AirCondition] [int] NULL , [TV] [int] NULL ) ON [PRIMARY] (4) 创建客房信息表(RoomsInfo)的脚本文件如下: CREATE TABLE [dbo].[RoomsInfo] ( [RoomId] [int] NOT NULL , [RCategoryId] [int] NULL , [RPosition] [nvarchar] (50) COLLATE Chinese_PRC_CI_AS NULL , [Description] [nvarchar] (50) COLLATE Chinese_PRC_CI_AS NULL ) ON [PRIMARY] (5) 创建作者信息表(Authors)的脚本文件如下: CREATE TABLE [dbo].[Authors] ( [PKId] [int] IDENTITY (1, 1) NOT NULL , [Name] [nvarchar] (40) COLLATE Chinese_PRC_CI_AS NOT NULL ) ON [PRIMARY] (6) 创建客房业务表(RoomOperation)的脚本文件如下: CREATE TABLE [dbo].[RoomOperation] ( [RoomId] [int] NOT NULL , [BeginTime] [datetime] NULL , [CIdentityId] [nvarchar] (50) COLLATE Chinese_PRC_CI_AS NULL , [Remarks] [nvarchar] (50) COLLATE Chinese_PRC_CI_AS NULL ) ON [PRIMARY] (7) 创建业务记录表(History)的脚本文件如下: CREATE TABLE [dbo].[History] ( [BeginTime] [datetime] NOT NULL , [EndTime] [datetime] NULL , [RoomId] [int] NOT NULL , [TotalPrice] [money] NULL , [CIdentityId] [nvarchar] (50) COLLATE Chinese_PRC_CI_AS NULL , [CName] [nvarchar] (50) COLLATE Chinese_PRC_CI_AS NULL , [CPhone] [nvarchar] (50) COLLATE Chinese_PRC_CI_AS NULL , [Remarks] [nvarchar] (50) COLLATE Chinese_PRC_CI_AS NULL ) ON [PRIMARY] 读者创建完用户信息表(UsersInfo)之后,在该表中创建一个用户,插入相应的信息,并 将其用户类型置为1(酒店管理员)。读者在运行系统时通过该用户进行登录,可使用系统所 有功能。本实例中使用的用户名和密码均为dragon。 另外,读者在查询分析器中执行这些SQL语句的时候,首先应该将当前操作数据库设 置为JdglSys。否则,所有表都将创建到Master数据库中。 1.7.3 创建存储过程 在酒店客房管理系统运行过程中,系统会在数据库中频繁查找或更新各种信息,例如, 向客房信息表(RoomsInfo)中插入或删除新的客房信息,根据客房类型和状态查找客房信息, 记录订房或退房信息等操作。为了提高系统的运行效率,我们创建了13个存储过程。部分 存储过程的Transact-SQL代码如下。 (1) 存储过程sp_ValidateUser用于系统在用户登录时验证该用户身份的有效性。如果该 用户身份有效,返回该用户的用户类型。 CREATE PROCEDURE sp_ValidateUser( @name nvarchar(20), @pwd nvarchar(15) , @IsValid Int output,@type Int output) AS if (select count(Type) from UsersInfo where Name=@name and Password=@pwd ) =1 begin -- @type用于记录该用户的用户类型 select @type=Type from UsersInfo where Name=@name and Password=@pwd -- 该用户身份有效,@IsValid置为1 select @IsValid = 1 end else -- 该用户身份无效,@IsValid置为0 select @IsValid = 0 (2) 存储过程sp_InsertRoom用于管理员添加新的客房信息时,系统向表中录入该客房 信息。 CREATE PROCEDURE sp_InsertRoom( @RoomId int,@RCategoryId int, @RPosition nvarchar(50),@Description nvarchar(50)) AS -- 向表RoomsInfo中插入新的客房信息 insert into RoomsInfo values( @RoomId,@RCategoryId,@RPosition,@Description) -- 向表RoomStatus中插入新信息,并将该客房状态置为1(空房) insert into RoomStatus values( @RoomId,1) (3) 存储过程sp_ShowRoomByCatgAndStatus用于根据客房类别或状态来获取客房信息。 CREATE PROCEDURE sp_ShowRoomByCatgAndStatus( @RCategoryId int,@Status int) AS -- 查找所有客房的信息 if @RCategoryId=0 and @Status=0 Select r.RoomId, c.Name,s.Status From RoomsInfo r, RoomCategory c, RoomStatus s Where s.RoomId=r.RoomId and c.RCategoryId=r.RCategoryId -- 根据客房类型查找客房信息 else if @RCategoryId!=0 and @Status=0 Select r.RoomId, c.Name,s.Status From RoomsInfo r, RoomCategory c, RoomStatus s Where s.RoomId=r.RoomId and c.RCategoryId=r.RCategoryId and r.RCategoryId=@RCategoryId -- 根据客房状态查找客房信息 else if @RCategoryId=0 and @Status!=0 Select r.RoomId, c.Name,s.Status From RoomsInfo r, RoomCategory c, RoomStatus s Where s.RoomId=r.RoomId and c.RCategoryId=r.RCategoryId and s.Status=@Status -- 根据客房类型和状态查找客房信息 else Select r.RoomId, c.Name,s.Status From RoomsInfo r, RoomCategory c, RoomStatus s Where s.RoomId=r.RoomId and c.RCategoryId=r.RCategoryId and r.RCategoryId=@RCategoryId and s.Status=@Status (4) 存储过程sp_GetRoomDetails用于根据客房号来获取客房的详细信息。 CREATE PROCEDURE sp_GetRoomDetails( @RoomId int) AS Select r.RoomId, s.Status, c.Name, c.Area, c.BedNum, c.Price, r.RPosition From RoomsInfo r,RoomCategory c,RoomStatus s Where c.RCategoryId=r.RCategoryId and s.RoomId=r.RoomId and r.RoomId=@RoomId (5) 存储过程sp_DeleteRoom用于管理员删除客房信息时,系统删除该客房在表中记录。 CREATE PROCEDURE sp_DeleteRoom ( @RoomId int) AS --删除该客房在表RoomsInfo中的记录 Delete from RoomsInfo where RoomId = @RoomId --删除该客房在表RoomStatus中的记录 Delete from RoomStatus where RoomId = @RoomId (6) 存储过程sp_AddOrder用于在客户订房时,系统向表中插入或更新相关记录。 CREATE PROCEDURE sp_AddOrder ( @RoomId int,@CName nvarchar(50), @CIdentityId nvarchar(50),@CPhone nvarchar(50), @BeginTime datetime, @Remarks nvarchar(50)) AS --将表RoomStatus中该客房的状态置为2(入住) Update RoomStatus set Status=2 where RoomId=@RoomId if (select count(*) from CustomersInfo where CIdentityId=@CIdentityId)=0 begin --向表CustomersInfo中插入新的客户记录 Insert into CustomersInfo values( @CIdentityId, @CName,@CPhone) end else begin --更新表CustomersInfo中该客户的记录 Update CustomersInfo set CName=@CName,CPhone=@CPhone where CIdentityId=@CIdentityId end --向表RoomOperation中插入该客房的入住记录 Insert into RoomOperation values( @RoomId,@BeginTime, @CIdentityId, @Remarks) (7) 存储过程sp_GetOrder用于根据客房号来获取客房的入住信息。 CREATE PROCEDURE sp_GetOrder( @RoomId int) AS Select c.CName,c.CIdentityId,c.CPhone,r.BeginTime,r.Remarks From RoomOperation r, CustomersInfo c Where c.CIdentityId=r.CIdentityId And r.RoomId=@RoomId (8) 存储过程sp_AddCheckOut用于在客户退房时,系统向表中更新或删除相关记录。 CREATE PROCEDURE sp_AddCheckOut( @RoomId int ,@BeginTime datetime,@EndTime datetime, @CIdentityId nvarchar(50), @CName nvarchar(50), @CPhone nvarchar(50), @Remarks nvarchar(50), @TotalPrice money out) AS --将表RoomStatus中该客房的状态置为1(空房) Update RoomStatus Set Status=1 Where RoomId=@RoomId Declare @Price money Select @Price=c.Price From RoomsInfo r, RoomCategory c Where c.RCategoryId=r.RCategoryId and r.RoomId=@RoomId --计算该客户的消费金额 Set @TotalPrice=@Price*DATEDIFF(Day,@BeginTime,@EndTime) if (@TotalPrice=0 ) begin Set @TotalPrice=@Price End --向表History中插入相关记录 Insert Into History values( @BeginTime,@EndTime,@RoomId,@TotalPrice,@CIdentityId, @CName,@CPhone,@Remarks) --删除该客房在表RoomOperation中的记录 Delete from RoomOperation Where RoomId=@RoomId (9) 存储过程sp_InsertUser用于管理员添加新的用户信息时,系统向表中录入该客房信 息。 CREATE PROCEDURE sp_InsertUser( @Id int, @Name varchar(50), @Pwd varchar(50), @Gender int, @Email varchar(50), @Address varchar(50),@Telephone varchar(50), @Department varchar(50),@Type int) AS --向表UsersInfo中插入新用户记录 Insert into UsersInfo values ( @Id, @Name, @Pwd , @Gender, @Email, @Address,@Telephone ,@Department,@Type) 我们将在应用程序中调用这些存储过程,完成添加新的客房信息、根据客房类型和状态 查找客房信息、订房或退房等工作。因篇幅限制,部分存储过程的脚本没有给出,读者可参 见随书光盘的“Chap10\DB\WsglSQL.sql”。当然,读者可以根据客户需要,设计其他的存 储过程。 1.8 本章我们是在Microsoft Visual Studio .NET 2003开发平台下,使用ASP.NET和C#进 行系统开发的。系统采用对数据库配置进行统一管理的方法,将程序中用到的所有连接字符 串信息统一放于Web.config配置文档中,在程序中对该文档的这一配置进行调用,方便系 统移植时对系统数据库的统一配置修改。 对于数据库调用字符串,由于本实例中所使用的数据库是本地数据库,所以Data Source(数据源)设置为(local),User ID(用户ID)赋值为系统默认的sa,Password(连接密码) 赋值为数据库出示安装时设定的sa,Datebase(数据库名称)设为我们上一节中创建的JdglSys。 读者在连接数据库时应根据自身情况修改用户名和密码。 (1) JdglWeb中的Web.config配置文档 为了连接数据库JdglSys,设置部分集中在之间,主要的 是数据库的连接字符串。而其他的设置主要是面向应用程序,提供服务。 Web.config配置文档的相关主要代码如下: //应用程序启用基于窗体 (Cookie) 的身份验证 (2) 调用JdglWeb中Web.config的代码 在程序中读取Web.config配置文档中的数据库设置信息,使用如下语句即可。语句列 举如下: //引入命名空间System.Configuration,以支持ConfigurationSettings using System.Configuration; „ „ //从文件Web.config中读取连接字符串 string sqldb= ConfigurationSettings.AppSettings["ConnectionString"]; 只要在程序文件中加入该行代码,就可以轻松地将数据库连接字段读取到字符串sqldb中,并且在程序中不用重新申明。 多个配置文件(名称都是Wed.confing)可以出现在ASP.NET Wed应用程序服务器上的多个目录中,每个Wed.confing文件都将配置设置应用于它自己的目录和它下面的所有子目录。 子目录中的配置文件可以提供除从父目录继承的配置信息以外的配置信息,子目录配置设置 可以重写或修改父目录中定义的设置。本例中,我们只使用上面的一个Wed.confing文件来配置整个Wed应用程序。 1.9 数据库分析和设计工作完成后,这一节我们将进行系统的页面设计。酒店客房管理系统 的页面由四部分组成: ? 酒店客房管理系统首页的设计 ? 系统各功能实现页面的设计 ? 添加信息页面的设计 ? 编辑信息页面的设计 因篇幅所限,这里我们将不再一一进行介绍。读者可以参见随书光盘中的代码部分,它 们保存在Chap10\VS.NET\目录下。下面我们将就几个典型的页面分别进行介绍。 1.9.1 酒店客房管理系统首页设计及其代码分析 前面已介绍过系统共分两类用户:酒店管理员和前台服务员。当用户进入酒店管理系统 首页后,首先需要进行身份验证,系统在验证通过后,将使用UserType变量记录其用户类型,并根据用户类型确定用户的使用权限。酒店管理系统的首页,如图10-16所示。 顾客进入系统首页后,首先需要在主显示区输入用户名及密码,然后单击“登录”按钮, 系统验证通过后,会显示提示信息,如图10-18所示。此时,用户可以直接单击功能列表中 的链接来使用各项功能了。否则系统会显示提示信息,要求用户登录。 图1-18 酒店客房管理系统首页 在首页的代码(Default.aspx)中,我们调用了Web用户控件(ListModule.ascx)来实现功能列表,以及Web用户控件(LogonModule.ascx)来实现员工登录功能。现给出Logon Module.ascx //ModuleBase是继承System.Web.UI.UserControl的用户定义类 的主要代码及代码分析,如下所示: public class LogonModule : ModuleBase { „ „ private void Page_Load(object sender, System.EventArgs e) { //如果用户身份已验证成功 if(HttpContext.Current.User.Identity.IsAuthenticated) { //保存用户姓名及用户类型 String UserName=HttpContext.Current.User.Identity.Name; String Type=null; // UserType是在ModuleBase类中定义的变量,用于保存用户类型 if(UserType.ToString()=="1") Type="酒店管理员"; else if(UserType.ToString()=="2") Type="前台服务员"; ShowMsg.Text=""+UserName+",欢迎您进入本 系统,用户类型为:"+Type; ShowMsg.Style["color"]="Green"; } else{ ShowMsg.Text="您还未登录本系统,登录后才可使用各项服务"; ShowMsg.Style["color"]="Red"; } } //实现“登录”按钮的单击事件 private void LogonButton_Click(object sender, System.EventArgs e) { // Authenticate(string name,string pwd)用于验证用户信息的有效性,该函数是在 ModuleBase类中定义的 if(Authenticate(LogonNameTextBox.Text.Trim() ,LogonPasswordTextBox.Text.Trim())= =true) { //系统使用Cookie保存用户信息 FormsAuthentication.SetAuthCookie(LogonNameTextBox.Text.Trim(),false); //重定向到Default.asp,其中PathPrefix是在ModuleBase类中定义的变量,用于 保存系统根路径 Response.Redirect(PathPrefix+"/default.aspx"); } else { //验证失败,显示提示信息 MismatchLabel.Visible=true; } } } 1.9.2 客房信息管理页面设计及其代码分析 客房信息管理页面,如图10-19所示,该页所属模块是系统的主要部分,客房信息页面 主要是负责所有客房信息的维护。用户可以根据客房号直接查找客房信息。如果需要添加新 客房,可单击“添加新客房”链接,系统会显示客房添加页面;如果需要修改客房信息,可 以在列表中单击该客房的“详单”链接,系统会显示客房修改页面;如果需要删除客房信息, 单击“删除”链接即可。 图1-19 客房信息管理页面 在客房信息管理页面的代码(RoomsMan.aspx)中我们调用了Web用户控件(RoomsMan Module.ascx)来实现客房信息显示功能。现给出RoomsManModule.ascx的主要代码及代码分 析,如下所示: public class RoomsManModule : ModuleBase { „ „ private void Page_Load(object sender, System.EventArgs e) { if(!IsPostBack) Show_RoomsList(); } //完成DataGrid控件dg_RoomsList的数据绑定,通过连接数据库,取出客房信息,在 dg_RoomsList上显示 protected void Show_RoomsList() { //从文件Web.config中读取连接字符串 string sqldb = ConfigurationSettings.AppSettings["ConnectionString"]; //连接JdglSys数据库 SqlConnection Conn = new SqlConnection (sqldb); //创建SqlDataAdapter对象,调用存储过程sp_ShowRoomsInfo SqlDataAdapter myadapter=new SqlDataAdapter ("sp_ShowRoomsList",Conn); //创建并填充DataSet DataSet ds = new DataSet (); myadapter.Fill (ds); dg_RoomsList.DataSource =ds; dg_RoomsList.DataBind (); //关闭Conn Conn.Close (); } //响应DataGrid控件dg_RoomsList的删除事件 protected void DataGrid_Delete(Object sender,DataGridCommandEventArgs E) { //从文件Web.config中读取连接字符串 string sqldb = ConfigurationSettings.AppSettings["ConnectionString"]; //连接JdglSys数据库 SqlConnection Conn = new SqlConnection (sqldb); Conn.Open (); //创建mycommand对象,调用存储过程 SqlCommand mycommand = new SqlCommand ("sp_DeleteRoom",Conn); mycommand.CommandType=CommandType.StoredProcedure; mycommand.Parameters .Add ("@RoomId",SqlDbType.Int ); //从dg_RoomsList中获取UserId值 mycommand.Parameters["@RoomId"].Value =int.Parse(E.Item.Cells[0].Text .ToString ()); //执行查询 mycommand.ExecuteNonQuery (); dg_RoomsList.EditItemIndex =-1; //更新dg_RoomsList Show_RoomsList(); } //响应DataGrid控件dg_RoomsList的分页显示换页事件 protected void DataGrid_Page(Object sender,DataGridPageChangedEventArgs E) { dg_RoomsList.CurrentPageIndex =E.NewPageIndex ; Show_RoomsList(); } //实现“查询”按钮的单击事件 private void search_Click(object sender, System.EventArgs e) { //从文件Web.config中读取连接字符串 string sqldb = ConfigurationSettings.AppSettings["ConnectionString"]; //连接JdglSys数据库 SqlConnection Conn = new SqlConnection (sqldb); //创建SqlDataAdapter对象,调用存储过程sp_ShowRoomsInfo SqlDataAdapter myadapter = new SqlDataAdapter ("sp_ShowRoomById",Conn); myadapter.SelectCommand.CommandType=CommandType.StoredProcedure; myadapter.SelectCommand.Parameters .Add ("@RoomId",SqlDbType.Int); myadapter.SelectCommand.Parameters ["@RoomId"].Value =RoomIdTextBox.Text.Trim(); //创建并填充DataSet DataSet ds = new DataSet (); myadapter.Fill (ds); dg_RoomsList.DataSource =ds; dg_RoomsList.DataBind (); Conn.Close (); } //实现“全部显示”按钮的单击事件 private void ShowAll_Click(object sender, System.EventArgs e) { Show_RoomsList(); } } 1.9.3 客房信息添加/修改页面设计及其代码分析 客房信息添加页面,如图10-20所示,主要负责添加新的客房信息。其中客房类型信息 从维护好的客房类型表中取得,在页面的Page_Load()事件中完成绑定。后台支持Submit Button_Click()事件,完成数据提交,当用户单击“添加”按钮后触发该事件。 图1-20 客房信息添加页面 在客房信息添加页面的代码(RoomAdd.aspx)中,我们调用了Web用户控件(RoomAdd Module.ascx)来实现客房信息添加功能。现给出RoomAddModule.ascx的主要代码及代码分 析,如下所示: public class RoomAddModule : ModuleBase { „ „ private void Page_Load(object sender, System.EventArgs e) { //绑定客房类型信息下拉列表框 if(!IsPostBack) { //从文件Web.config中读取连接字符串 string sqldb= ConfigurationSettings.AppSettings["ConnectionString"]; //连接JdglSys数据库 SqlConnection Conn= new SqlConnection (sqldb); Conn.Open (); //定义sql语句 string mysql="select RCategoryId,Name from RoomCategory "; //创建Command对象,调用mysql SqlCommand cm=new SqlCommand (mysql,Conn); SqlDataReader dr=cm.ExecuteReader (); while(dr.Read ()) { ListItem li=new ListItem(dr["Name"].ToString(),dr["RCategoryId"].ToString()); RCategoryNameList.Items.Add (li); } Conn.Close (); } } //响应CustomValidator控件IdUniqueCustomValidator的ServerValidate事件,验证客房号 是否已登记 public void IsIdValidate(object source, System.Web.UI.WebControls.ServerValidateEventArgs args) { //从文件Web.config中读取连接字符串 string sqldb= ConfigurationSettings.AppSettings["ConnectionString"]; //连接JdglSys数据库 SqlConnection Conn= new SqlConnection (sqldb); Conn.Open (); //构造SQL语句,该语句在RoomCategory表中检查客房类型是否已存在 string checksql= "select * from RoomsInfo where RoomId='"+RoomIdTextBox.Text.Trim() +"'"; //创建Command对象,调用checksql SqlCommand mycommand=new SqlCommand (checksql,Conn); //执行ExecuteReader ()方法 SqlDataReader dr=mycommand.ExecuteReader (); if(dr.Read ()) args.IsValid =false;//客房号已存在 else args.IsValid =true;//客房号未登记 //关闭连接 Conn.Close(); } //客房类型是否已选定 public void NotNullValidate(object source, System.Web.UI.WebControls.ServerValidateEventArgs args) { if(RCategoryNameList.SelectedIndex==0) args.IsValid =false;//客房类型未选 else args.IsValid =true;//客房类型已选 } //实现“提交”按钮的单击事件 private void SubmitButton_Click(object sender, System.EventArgs e) { if(Page.IsValid) { //从文件Web.config中读取连接字符串 string sqldb= ConfigurationSettings.AppSettings["ConnectionString"]; //连接JdglSys数据库 SqlConnection Conn= new SqlConnection (sqldb); Conn.Open (); //使用Command对象调用存储过程sp_InsertRoom SqlCommand mycommand=new SqlCommand ("sp_InsertRoom",Conn); //将命令类型转为存储类型 mycommand.CommandType =CommandType.StoredProcedure ; //往存储过程中添加参数 mycommand.Parameters .Add ("@RoomId",SqlDbType.Int); mycommand.Parameters .Add ("@RCategoryId",SqlDbType.Int); mycommand.Parameters .Add ("@RPosition",SqlDbType.NVarChar); mycommand.Parameters .Add ("@Description",SqlDbType.NVarChar); //给存储过程的参数赋值 mycommand.Parameters ["@RoomId"].Value =int.Parse(RoomIdTextBox.Text.Trim()); mycommand.Parameters ["@RCategoryId"].Value = RCategoryNameList.SelectedIndex; mycommand.Parameters ["@RPosition"].Value =RPositionTextBox.Text.Trim(); mycommand.Parameters ["@Description"].Value =DescriptionTextBox.Text.Trim(); try { mycommand.ExecuteNonQuery(); ShowMsg.Text="新客房信息添加成功"; ShowMsg.Style["color"]="green";} catch(SqlException error) { ShowMsg.Text="添加未成功,请稍后再试。原因:"+error.Message; ShowMsg.Style["color"]="red"; } //关闭连接 Conn.Close(); } } //实现“返回”按钮的单击事件 private void ReturnButton_Click(object sender, System.EventArgs e) { //重定向到RoomsMan.aspx Response.Redirect(PathPrefix+"/RoomsMan.aspx"); } } 客房信息修改页面主要负责修改现有的客房信息,如图1-21所示。与客房信息添加页面 相比,界面上很相似。由于这是一个信息修改界面,系统必须提供原始数据记录,所以在 Page_Load()事件里,我们添加了实现各个文本框初始数据绑定的程序代码。当用户单击“修 改信息”按钮时,系统会触发Submit_Click()事件,将涉及到对RoomsInfo表的操作。 图1-21 客房信息修改页面 在客房信息修改页面的代码(RoomEdit.aspx)中,我们调用了Web用户控件(RoomEdit Module.ascx)来实现客房信息修改功能。由于篇幅限制,这里我们不再给出该控件的代码分 析,读者可以参见随书光盘的代码部分。 1.9.4 客房经营管理页面设计及其代码分析 客房经营管理页面,该页为酒店前台工作人员提供所有客房当前状态信息,页面采用 DataList控件显示客房信息,因为DataList控件的优点是布局好控制,并且界面直观明了, 另外,页面还采用了Repeater控件来显示选定客房的详细信息。 在页面中,用户可以根据客房类型或状态查询客房的使用信息,还可以单击列表中目标 客房的客房号,列表下方便会显示该客房的详细信息。如果客房的空房项标识为“有”,则 客房详细信息中的酒店业务项提供订房服务,如图1-22所示。如果客房空房项标识为“无”,则客房详细信息中的酒店业务项提供退房服务,如图1-23所示。 图1-22 客房经营管理页面-订房业务 图1-23 客房经营管理页面-退房业务 在客房经营页面的代码(RBussinessMan.aspx)中,我们调用了Web用户控件(RbussiMan Module.ascx)来实现客房信息显示功能。现给出RoomEditModule.ascx的主要代码及代码分 析,如下所示: public class RBussiModule : ModuleBase { „ „ private void Page_Load(object sender, System.EventArgs e) { if(!IsPostBack) { //绑定客房类型信息下拉列表框 „ „ //实现DataList控件dl_RoomsList显示客房信息 Show_RoomsList(); } } //实现DataList控件dl_RoomsList显示客房信息 protected void Show_RoomsList() { if(dl_RoomsList.SelectedIndex>-1){ dl_RoomsList.SelectedIndex=-1; } //从文件Web.config中读取连接字符串 string sqldb= ConfigurationSettings.AppSettings["ConnectionString"]; //连接JdglSys数据库 SqlConnection Conn= new SqlConnection (sqldb); //创建SqlDataAdapter对象,调用存储过程sp_ShowRoomsInfo SqlDataAdapter myadapter=new SqlDataAdapter ("sp_ShowRoomsInfo",Conn); //创建并填充DataSet DataSet ds = new DataSet (); myadapter.Fill (ds,"RoomsList"); dl_RoomsList.DataSource =ds; dl_RoomsList.DataBind (); //根据客房状态确定dl_RoomsList的Status显示 for(int i=0;i-1) dl_RoomsList.SelectedIndex=-1; //从文件Web.config中读取连接字符串 string sqldb = ConfigurationSettings.AppSettings["ConnectionString"]; //连接JdglSys数据库 SqlConnection Conn = new SqlConnection (sqldb); //创建SqlDataAdapter对象,调用存储过程sp_ShowRoomsInfo SqlDataAdapter myadapter = new SqlDataAdapter ("sp_ShowRoomByCatgAndStatus",Conn); myadapter.SelectCommand.CommandType=CommandType.StoredProcedure; myadapter.SelectCommand.Parameters .Add ("@RCategoryId",SqlDbType.Int); myadapter.SelectCommand.Parameters ["@RCategoryId"].Value =RCategoryNameList.SelectedIndex; myadapter.SelectCommand.Parameters .Add ("@Status",SqlDbType.Int); myadapter.SelectCommand.Parameters ["@Status"].Value =StatusList.SelectedIndex; //创建并填充DataSet DataSet ds = new DataSet (); myadapter.Fill (ds); dl_RoomsList.DataSource =ds; dl_RoomsList.DataBind (); //根据客房状态确定dl_RoomsList的Status显示 for(int i=0;i
本文档为【酒店客房管理系统】,请使用软件OFFICE或WPS软件打开。作品中的文字与图均可以修改和编辑, 图片更改请在作品中右键图片并更换,文字修改请直接点击文字进行修改,也可以新增和删除文档中的内容。
该文档来自用户分享,如有侵权行为请发邮件ishare@vip.sina.com联系网站客服,我们会及时删除。
[版权声明] 本站所有资料为用户分享产生,若发现您的权利被侵害,请联系客服邮件isharekefu@iask.cn,我们尽快处理。
本作品所展示的图片、画像、字体、音乐的版权可能需版权方额外授权,请谨慎使用。
网站提供的党政主题相关内容(国旗、国徽、党徽..)目的在于配合国家政策宣传,仅限个人学习分享使用,禁止用于任何广告和商用目的。
下载需要: 免费 已有0 人下载
最新资料
资料动态
专题动态
is_266065
暂无简介~
格式:doc
大小:614KB
软件:Word
页数:91
分类:互联网
上传时间:2017-09-25
浏览量:366