1、项目五 三层架构重构考试管理系统.1 任务一:实体层任务一:实体层MySchoolModels的设计的设计.2 任务二:配置文件的设置任务二:配置文件的设置.3 任务三:数据访问层接口的设计任务三:数据访问层接口的设计.4 任务四:数据访问层的设计任务四:数据访问层的设计.5 任务五:联机工厂的设计任务五:联机工厂的设计.6 任务六:业务逻辑层的设计任务六:业务逻辑层的设计.1 任务一:实体层任务一:实体层MySchoolModels的设计的设计.1.1 功能描述功能描述在解决方案中,创建MySchoolModels项目,并在此项目中创建Admin类、Class类、Grade类和Student
2、类,实现面向对象编程。.1.2 设计步骤及代码解析设计步骤及代码解析(1)打开Microsoft Visual Studio 2005,创建一个Windows窗体应用程序,将其改名为MySchool,再创建一个类库,项目名称输入MySchoolModels,位置根据自己需要选择设定,单击“确定”按钮。(2)单击Class1.cs,将其重命名为Admin.cs。在Admin.cs中添加三个属性。具体代码和分析如下:1 public class Admin2 3 private int id;4 private string loginId=String.Empty;5 private strin
3、g loginPwd=String.Empty;6 public int Id 7 8 get return id;9 1011 public string LoginId 12 13 get return loginId;14 set loginId=value;15 1617 public string LoginPwd 18 19 get return loginPwd;20 set loginPwd=value;21 22 代码分析:69 属性ID。1115 登录名属性。1721 登录密码属性。(3)在解决方案管理器中,点击MySchoolModels项目,右击,选择添加新建项。在模版
4、中选择类,将类名更改为Class.cs。具体代码和分析如下:1 public class Class2 3 protected int classId;4 protected string name=String.Empty;5 protected int gradeID;67 public int ClassId 8 9 get return classId;10 1112 public string Name 13 14 get return name;15 set name=value;16 1718 public int GradeID 19 20 get return gradeID
5、;21 set gradeID=value;22 23 代码分析:710 班级编号属性。1216 班级名属性。1822 年级编号属性。(4)在MySchoolModels项目中,继续添加Grade类和Student类。具体代码和分析如下:1 public class Grade2 3 protected int id;4protected string name=String.Empty;5 public int Id 67get return id;8910 public string Name 1112get return name;13set name=value;141516publi
6、c class Student17 18 protected int id;19protected string loginId=String.Empty;20protected string lingPwd=String.Empty;21protected int userStateId;22protected int classID;23protected string studentNO=String.Empty;24 protected string studentname=String.Empty;25protected string sex=String.Empty;26prote
7、cted string studentIDNO=String.Empty;27protected string phone=String.Empty;28protected string address=String.Empty;2930 public int Id 3132get return id;33 3435public string LoginId 3637get return loginId;38set loginId=value;394041public string LingPwd 4243get return lingPwd;44set lingPwd=value;45464
8、7public int UserStateId 4849get return userStateId;50set userStateId=value;515253public int ClassID 5455get return classID;56set classID=value;575859public string StudentNO 6061get return studentNO;62set studentNO=value;636465 public string StudentName 6667 get return studentname;68 set studentname=
9、value;697071public string Sex 7273get return sex;74set sex=value;757677public string StudentIDNO 7879get return studentIDNO;80set studentIDNO=value;8182public string Phone 8384get return phone;85set phone=value;868788public string Address 8990get return address;91set address=value;92 93 代码分析:58 年级编号
10、属性。1014 年级名属性。3033 学生Id属性。3539 登录Id属性。4145 登录密码属性。4751 用户状态Id属性。5357 班级Id属性。5963 学生学号属性。6569 学生姓名属性。7175 学生性别属性。7781 身份证属性。8285 联系电话属性。8892 家庭住址属性。.1.3 知识库知识库1.Grade类类Grade类用于封装Grade表中的各个字段,将其转换为对应属性。2.Class类类Class类用于封装Class表中的各个字段,将其转换为对应属性。3.Admin类类Admin类用于封装Admin表中的各个字段,将其转换为对应属性。4.Student类类Stude
11、nt类用于封装Student表中的各个字段,将其转换为对应属性。.2 任务二:配置文件的设置任务二:配置文件的设置.2.1 功能描述功能描述在配置文件中设置连接字符串以及数据库类型。.2.2 设计步骤设计步骤(1)在MySchool项目中点击app.config文件,在该文件中添加connectionStrings节点,在此节点中设置连接字符串。具体代码如下:(2)在配置文件中再添加appSettings节点,在此节点中设置数据库类型。具体代码如下:.3 任务三:数据访问层接口的设计任务三:数据访问层接口的设计.3.1 功能描述功能描述在解决方案中创建类库MySchoolIDAL,添加IAdm
12、inService、IClassService、IGradeService和IStudentService四个接口,实现多态的编程。.3.2 设计步骤设计步骤(1)在解决方案中添加一个类库项目MySchoolIDAL,右击此项目,添加新建项,选择“接口”模板。将interface1.cs改名为IAdminService.cs。在接口IAdminService中定义如下方法,此方法用于根据登录ID获得密码:string GetAdminLoginPwdByLoginID(string loginID);(2)在MySchoolIDAL项目中添加接口IClassService,并在此接口中定义如下
13、两个方法,分别用于根据班级名获得班级ID和根据年级ID获得班级集合:string GetClassIDByClassName(string className);ArrayList GetClassByGradeID(int gradeID);(3)在MySchoolIDAL项目中添加接口IGradeService,在此接口中定义如下两个方法,分别用于获得所有的年级和根据年级名获得年级ID:List GetAllGrades();int GetGradeByGradeName(string gradeName);(4)在MySchoolIDAL项目中添加接口IStudentService,在此
14、接口中定义如下方法:int AddStudent(Student objStudent);/添加新学员void DeleteStudent(string loginID);/根据登录ID删除学员void ModifyStudent(Student objStudent);/修改学生对象Student GetStudentInfoByLoginID(string loginID);/根据登录ID获得学员信息List GetStudentLoginPwdByLoginID(string loginID);/根据登录ID获得学员的登录密码IList GetAllStudents();/获得所有的学员
15、对象集合int GetStudentIDByLoginID(string loginID);/根据登录ID获得学员ID.3.3 知识库知识库1.IAdminService接口接口IAdminService接口抽象了GetAdminLoginPwdByLoginID(string loginID)方法,定义此方法是为了实现根据登录ID获得管理员登录密码,其具体实现由实现该接口的类来完成。2.IClassService接口接口IClassService接口抽象了GetClassIDByClassName(string className)和GetClassByGradeID(int GradeID
16、)方法,定义这两个方法是为了实现根据班级名获得班级ID和根据年级ID获得班级集合,其具体实现由实现该接口的类来完成。3.IGradeService接口接口IGradeService接口抽象了GetAllGrades()和GetGradeByGradeName(string gradeName)方法,这两个方法的主要功能是实现获得所有年级和根据年级名获得年级ID,其具体实现由实现该接口的类来完成。4.IStudentService接口接口IStudentService接口抽象了7个方法,分别用于增加、删除、修改等操作,其具体实现由实现该接口的类来完成。.4 任务四:数据访问层的设计任务四:数据访
17、问层的设计.4.1 功能描述功能描述在解决方案中创建类库MySchoolDAL,用于集成对数据库数据的操作。.4.2 设计步骤及代码解析设计步骤及代码解析(1)在项目MySchoolDAL中创建一个类AdminService,用于执行对数据库表Admin的操作。首先使类AdminService实现接口IAdminService。具体代码与分析如下:1 public class AdminService:IAdminService2 3 /从配置文件中读取数据库连接字符串4 private readonly string connString=ConfigurationManager.Conne
18、ctionStringsMySchoolConnectionString.ToString();5 private readonly string dboOwner=ConfigurationManager.ConnectionStringsDataBaseOwner.ToString();6 /7 /根据管理员登录ID得到登录密码8 /9 /登录ID10 /密码11 public string GetAdminLoginPwdByLoginID(string loginID)12 13 string pwd=string.Empty;14 using(SqlConnection conn=n
19、ew SqlConnection(connString)15 16 SqlCommand objCommand=new SqlCommand(dboOwner+.usp_SelectAdminByLoginID,conn);17 objCommand.CommandType=CommandType.StoredProcedure;18 objCommand.Parameters.Add(LoginId,SqlDbType.NVarChar,50).Value=loginID;19 conn.Open();20 using(SqlDataReader objReader=objCommand.E
20、xecuteReader(CommandBehavior.CloseConnection)21 22 if(objReader.Read()23 pwd=Convert.ToString(objReaderLoginPwd);24 objReader.Dispose();25 26 conn.Close();27 conn.Dispose();28 29 return pwd;30 31 代码分析:14,20 在第14行代码和20行代码中使用了using()的结构,是为了及时释放对象所占用的资源,其中的部分代表所要释放的对象,的部分代表对象的生存期,即在部分的代码执行完后,部分的对象允许被释放
21、。1617 创建一个SqlCommand类型的对象,并设置其命令文本类型为存储过程,其中usp_SelectAdminByLoginID为存储过程的名字。存储过程具体代码如下:ALTER PROCEDURE dbo.usp_SelectAdminByLoginIDLoginId varchar(50)ASSET NOCOUNT ONSET TRANSACTION ISOLATION LEVEL READ COMMITTEDSELECTLoginPwd,LoginId,AdminName,SexFROMdbo.AdminWHERELoginId=LoginId(2)在项目MySchoolDAL中
22、创建一个类GradeService,用于执行对数据库表Grade的操作。首先使类GradeService实现接口IGradeService。具体代码与分析如下:1 public class GradeService:IGradeService2 3 /从配置文件中读取数据库连接字符串4 private readonly string connString=ConfigurationManager.ConnectionStringsMySchoolConnectionString.ToString();5 private readonly string dboOwner=Configuratio
23、nManager.ConnectionStringsDataBaseOwner.ToString();6 /7 /得到所有年级集合8 /9 /年级集合10 public List GetAllGrades()11 12 List GradeList=new List();1314 using(SqlConnection conn=new SqlConnection(connString)15 16 SqlCommand objCommand=new SqlCommand(dboOwner+.usp_SelectGradesAll,conn);17 objCommand.CommandType=
24、CommandType.StoredProcedure;18 conn.Open();19 using(SqlDataReader objReader=objCommand.ExecuteReader(CommandBehavior.CloseConnection)20 21 while(objReader.Read()22 23 Grade grade=new Grade();24 grade.Name=Convert.ToString(objReaderGradeName);25 GradeList.Add(grade);26 27 objReader.Close();28 objRead
25、er.Dispose();29 30 conn.Close();31 conn.Dispose();32 33 return GradeList;34 35 /36 /通过年级名称得到年级ID37 /38 /年级名称39 /年级ID40 public int GetGradeByGradeName(string gradeName)41 42 int number=0;43 using(SqlConnection conn=new SqlConnection(connString)44 45 SqlCommand objCommand=new SqlCommand(dboOwner+.usp_
26、SelectGradeByGradeName,conn);46 objCommand.CommandType=CommandType.StoredProcedure;47 objCommand.Parameters.Add(GradeName,SqlDbType.NVarChar,50).Value=gradeName;48 conn.Open();49 using(SqlDataReader objReader=objCommand.ExecuteReader(CommandBehavior.CloseConnection)50 51 if(objReader.Read()52 number
27、=Convert.ToInt32(objReaderGradeID);53 objReader.Close();54 objReader.Dispose();55 56 conn.Close();57 conn.Dispose();58 59 return number;60 61 代码分析:12 创建一个泛型集合,用于存储查询的年级集合。1617 创建一个SqlCommand类型的对象,并设置其命令文本类型为存储过程,其中usp_SelectGradesAll为存储过程的名字。存储过程具体代码如下:ALTER PROCEDURE dbo.usp_SelectGradesAllASSET NO
28、COUNT ONSET TRANSACTION ISOLATION LEVEL READ COMMITTEDSELECTGradeID,GradeNameFROMdbo.Grade 1925 执行命令,循环读出数据并且添加到泛型集合中。42 创建一个int类型变量,用于存储年级编号。4546 创建一个SqlCommand类型的对象,并设置其命令文本类型为存储过程,其中usp_SelectGradeByGradeName为存储过程的名字。存储过程具体代码如下:ALTER PROCEDURE dbo.usp_SelectGradeByGradeNameGradeName nvarchar(50)A
29、SSET NOCOUNT ONSET TRANSACTION ISOLATION LEVEL READ COMMITTEDSELECTGradeIDFROMdbo.GradeWHEREGradeName=GradeName(3)在MySchoolDAL中创建一个类ClassService实现接口IClassService,用于执行对数据库表Class的操作。1 public class ClassService:IClassService2 3 /从配置文件中读取数据库连接字符串4 private readonly string connString=ConfigurationManager.
30、ConnectionStringsMySchoolConnectionString.ToString();5 private readonly string dboOwner=ConfigurationManager.ConnectionStringsDataBaseOwner.ToString();6 /7 /通过班级名称得到班级ID8 /9 /班级名称10 /班级ID11 public string GetClassIDByClassName(string className)12 13 string number=string.Empty;14 using(SqlConnection c
31、onn=new SqlConnection(connString)15 16 SqlCommand objCommand=new SqlCommand(dboOwner+.usp_SelectClassIDByClassName,conn);17 objCommand.CommandType=CommandType.StoredProcedure;18 objCommand.Parameters.Add(ClassName,SqlDbType.NVarChar,50).Value=className;19 conn.Open();20 using(SqlDataReader objReader
32、=objCommand.ExecuteReader(CommandBehavior.CloseConnection)21 22 if(objReader.Read()23 number=Convert.ToString(objReaderClassID);24 objReader.Close();25 objReader.Dispose();26 27 conn.Close();28 conn.Dispose();29 return number;30 31 32 /33 /通过年级ID得到年级对应的班级34 /35 /年级ID 36 /班级集合37 public ArrayList GetC
33、lassByGradeID(int gradeID)38 39 ArrayList classList=new ArrayList();40 using(SqlConnection conn=new SqlConnection(connString)41 42 SqlCommand objCommand=new SqlCommand(dboOwner+.usp_SelectClassesByGradeID,conn);43 objCommand.CommandType=CommandType.StoredProcedure;44 objCommand.Parameters.Add(GradeI
34、D,SqlDbType.Int).Value=gradeID;45 conn.Open();46 using(SqlDataReader objReader=objCommand.ExecuteReader(CommandBehavior.CloseConnection)47 48 while(objReader.Read()49 classList.Add(objReaderClassName);50 objReader.Close();51 objReader.Dispose();52 53 conn.Close();54 conn.Dispose();55 56 return class
35、List;57 58 代码分析:11 实现接口中定义的方法GetClassIDByClassName。16 创建一个SqlCommand类型的对象,并设置其命令文本类型为存储过程,其中usp_SelectClassIDByClassName为存储过程的名字。存储过程具体代码如下:ALTER PROCEDURE dbo.usp_SelectClassIDByClassName ClassName nvarchar(50)ASSET NOCOUNT ON SET TRANSACTION ISOLATION LEVEL READ COMMITTEDSELECTClassIDFROMdbo.Class
36、WHEREClassName=ClassName 37 实现接口中定义的方法GetClassByGradeID(int GradeID)。4243 创建一个SqlCommand类型的对象,并设置其命令文本类型为存储过程,其中usp_SelectClassesByGradeID为存储过程的名字。存储过程具体代码如下:ALTER PROCEDURE dbo.usp_SelectClassesByGradeID GradeID intASSET NOCOUNT ONSET TRANSACTION ISOLATION LEVEL READ COMMITTEDSELECTClassID,ClassNam
37、eFROMdbo.ClassWHERE GradeID=GradeID(4)在MySchoolDAL中,创建一个类StudentService实现接口IStudentService,用于执行对数据库表Student的操作。具体代码及分析如下:1 public class StudentService:IStudentService2 3#region Private Members4 /从配置文件中读取数据库连接字符串5 private readonly string connString=ConfigurationManager.ConnectionStringsMySchoolConnec
38、tionString.ToString();6 private readonly string dboOwner=ConfigurationManager.ConnectionStringsDataBaseOwner.ToString();7#endregion89#region Public Methods10 /11 /创建学员帐户12 /13 /学员实体对象14 /生成帐户记录的ID 15 public int AddSutdent(Student objStudent)16 17 int number;18 using(SqlConnection conn=new SqlConnect
39、ion(connString)19 20 SqlCommand objCommand=new SqlCommand(dboOwner+.usp_InsertPartStudentInfo,conn);21 objCommand.CommandType=CommandType.StoredProcedure;2223 objCommand.Parameters.Add(LoginID,SqlDbType.NVarChar,50).Value=objStudent.LoginId;24 objCommand.Parameters.Add(LoginPwd,SqlDbType.NVarChar,50
40、).Value=objStudent.LingPwd;25 objCommand.Parameters.Add(UserStateId,SqlDbType.Int).Value=objStudent.UserStateId;26 objCommand.Parameters.Add(ClassID,SqlDbType.Int).Value=objStudent.ClassID;27 objCommand.Parameters.Add(StudentNO,SqlDbType.NVarChar,255).Value=objStudent.StudentNO;28 objCommand.Paramet
41、ers.Add(StudentName,SqlDbType.NVarChar,255).Value=objStudent.StudentName;29 objCommand.Parameters.Add(Sex,SqlDbType.NVarChar,255).Value=objStudent.Sex;30 conn.Open();31 number=Convert.ToInt32(objCommand.ExecuteScalar();32 conn.Close();33 conn.Dispose();34 35 return number;36 37 /38 /根据学员ID删除账户信息39 /
42、40 /41 public void DeleteStudent(string loginID)42 43 int studentID=GetStudentIDByLoginID(loginID);44 using(SqlConnection conn=new SqlConnection(connString)45 46 SqlCommand objCommand=new SqlCommand(dboOwner+.usp_DeleteStudent,conn);47 objCommand.CommandType=CommandType.StoredProcedure;48 objCommand
43、.Parameters.Add(StudentID,SqlDbType.Int).Value=studentID;49 conn.Open();50 objCommand.ExecuteNonQuery();51 conn.Close();52 conn.Dispose();53 54 55 /56 /根据登录ID得到学员信息57 /58 /登录ID59 /学员信息实体60 public Student GetStudentInfoByLoginID(string loginID)61 62 Student studentInfo=new Student();63 using(SqlConne
44、ction conn=new SqlConnection(connString)64 65 SqlCommand objCommand=new SqlCommand(dboOwner+.usp_SelectStudentInfoByLoginID,conn);66 objCommand.CommandType=CommandType.StoredProcedure;67 objCommand.Parameters.Add(LoginID,SqlDbType.NVarChar,50).Value=loginID;68 conn.Open();69 using(SqlDataReader objR
45、eader=objCommand.ExecuteReader(CommandBehavior.CloseConnection)70 71 if(objReader.Read()72 73 studentInfo.LoginId=Convert.ToString(objReaderLoginId);74 studentInfo.StudentNO=Convert.ToString(objReaderStudentNO);75 studentInfo.StudentName=Convert.ToString(objReaderStudentName);76 studentInfo.Sex=Conv
46、ert.ToString(objReaderSex);77 studentInfo.StudentIDNO=Convert.ToString(objReaderStudentIDNO);78 studentInfo.Phone=Convert.ToString(objReaderPhone);79 80 81 conn.Close();82 conn.Dispose();83 84 return studentInfo;85 86 /87 /根据学员登录ID得到学员ID88 /89 /登录ID90 /学员ID91 public int GetStudentIDByLoginID(string
47、loginID)92 93 int studentID=0;94 using(SqlConnection conn=new SqlConnection(connString)95 96 SqlCommand objCommand=new SqlCommand(dboOwner+.usp_SelectStudentIDByLoginID,conn);97 objCommand.CommandType=CommandType.StoredProcedure;98 objCommand.Parameters.Add(LoginId,SqlDbType.NVarChar,50).Value=login
48、ID;99 conn.Open();100 using(SqlDataReader objReader=objCommand.ExecuteReader(CommandBehavior.CloseConnection)101 102 if(objReader.Read()103 104 studentID=Convert.ToInt32(objReaderStudentID);105 106 objReader.Dispose();107 107 conn.Close();109 conn.Dispose();110 111 return studentID;112 113 /114 /根据登
49、录ID得到学员登录密码和用户状态ID115 /116 /登录ID117 /密码和状态ID的集合118 public List GetStudentLoginPwdByLoginID(string loginID)119 120 List studentlist=new List();121 string pwd=string.Empty;122 using(SqlConnection conn=new SqlConnection(connString)123 124 SqlCommand objCommand=new SqlCommand(dboOwner+.usp_SelectStudent
50、ByLoginID,conn);125 objCommand.CommandType=CommandType.StoredProcedure;126 objCommand.Parameters.Add(LoginId,SqlDbType.NVarChar,50).Value=loginID;127 conn.Open();128 using(SqlDataReader objReader=objCommand.ExecuteReader(CommandBehavior.CloseConnection)129 130 if(objReader.Read()131 132 Student stud