三层学习进行至今也已一周多的时间,已经对其基本的理论思想有了大致的掌握,前两篇介绍了三层架构的基本理论以及一个小的登录demo,为了更好的练习,今天再说说另外一个例子:课程管理三层版.
首先介绍方案实现的简单功能:1.对课程信息的添加;2.依据课程编号对课程信息的删除;3.课程信息浏览。
UI界面如下:
三层架构划分:
图中Modal存储对应数据库ELECTIVE中表T_Course的实体类Course,对应字段有:课程编号CourseID、课程名称CourseName、课程学分CourseCredit,到实体类中则对应相应属性存储,这种面向对象的类与关系数据库的表的对应称为ORM(对象关系映射)。
ORM的实现如下:
'定义实体类,存储数据表T_Course中记录信息 Public Class Course '声明私有字段course_Id,course_Name,course_Credit Private course_Id As String Private course_Name As String Private course_Credit As Integer '定义CourseID属性,对应数据库表中第一个字段 Public Property CourseID As String Get Return course_Id End Get Set(value As String) course_Id = value End Set End Property '定义CourseName属性,对应数据库表中第二个字段 Public Property CourseName As String Get Return course_Name End Get Set(value As String) course_Name = value End Set End Property '定义CourseCredit属性,对应数据库表中第三个字段 Public Property CourseCredit As Integer Get Return course_Credit End Get Set(value As Integer) course_Credit = value End Set End Property End ClassCommon项目中存放公用文件,在这里存放Doutil类,用于存储访问数据库的基本操作,类似于DbHepler,供数据访问层调用.
Doutil实现代码如下:
'对数据库访问的操作公共方法 Public Class Doutil '连接数据库字符串 Public Shared Function connstring() As String connstring = "Server=LI;Database=ELECTIVE;User ID=sa;Password=123456" End Function '根据传入SQL执行语句,执行数据库的非查询操作,返回整型 Public Shared Function ExecNonQuery(strSql As String) As Integer Dim conn As SqlClient.SqlConnection Dim cmd As SqlClient.SqlCommand conn = New SqlClient.SqlConnection(Doutil.connstring()) '调用Connstring方法连接数据库 cmd = conn.CreateCommand() '创建执行命令 cmd.CommandText = strSql '执行命令字符串 cmd.CommandType = CommandType.Text conn.Open() Try cmd.ExecuteNonQuery() '执行命令 Catch ex As Exception Return 0 '执行命令存在异常则返回0 End Try Return 1 '执行完成返回1 End Function '对数据库表的查询操作方法,返回查询结果 Public Function GetReader(strSql As String) As SqlClient.SqlDataReader Dim conn As SqlClient.SqlConnection Dim cmd As SqlClient.SqlCommand Dim reader As SqlClient.SqlDataReader conn = New SqlClient.SqlConnection(Common.Doutil.connstring()) '调用connstring连接数据库 cmd = conn.CreateCommand() '创建命令 cmd.CommandText = strSql '执行命令字符串 cmd.CommandType = CommandType.Text conn.Open() reader = cmd.ExecuteReader() '执行查询操作 Return reader '返回查询结果 conn.Close() End Function End Class
数据添加的三层实现:
设计流程:
代码实现
DAL:
'根据传入参数检查主键课程编号是否已经存在,返回布尔型 Public Function Exist(courseID As String) As Boolean Dim strSql As String Dim reader As SqlClient.SqlDataReader Dim common = New Common.Doutil strSql = "select * from T_Course where CourseID = " & courseID & "" 'SQL具体查询语句 reader = common.GetReader(strSql) '调用GetReader方法,实现查询语句的具体执行 '判断结果集中是否有记录,存在则返回True,否则返回False If (reader.HasRows) Then Return True Else Return False End If End Function '根据传入实体类Course参数,进行记录的添加,返回1说明添加成功,返回0说明添加失败 Public Function AddCourse(course As BFCourse.Modal.Course) As Integer Dim strSql As String strSql = "Insert into T_Course(CourseID,CourseName,CourseCredit) values(" & course.CourseID & " , " & course.CourseName & " , " & course.CourseCredit & ")" Return Common.Doutil.ExecNonQuery(strSql) '调用访问数据的模块方法实现插入数据操作 End Function
'添加课程方法AddCourse,无返回值,以弹出消息框方式显示是否成功 Public Sub AddCourse(course As BFCourse.Modal.Course) Dim courseDAO = New BFCourse.DAL.CourseDAO '调用DAL的数据访问对象 If courseDAO.Exist(course.CourseID) Then '调用DAL的Exist方法判断账号是否存在,存在则弹出消息框提示并退出 MsgBox("此账号已存在,请重新输入") Return End If If (courseDAO.AddCourse(course) > 0) Then '调用DAL的AddCourse方法,返回1添加成功 MsgBox("添加成功") Else '返回0添加失败 MsgBox("添加失败") End If End SubUI:
Public cb As New BFCourse.BLL.CourseBiz '调用BLL '课程添加功能实现 Private Sub btnOK_Click(sender As Object, e As EventArgs) Handles btnOK.Click Dim course As BFCourse.Modal.Course '声明实体类Course '判断用户输入课程编号框是否为空值,是则退出 If (Trim(txtCourseID.Text) = "") Then MsgBox("请输入课程编号") Return End If '判断用户输入课程名称框是否为空值,是则退出 If txtCourseName.Text = String.Empty Then MsgBox("请输入课程名称") Return End If '判断用户输入课程学分框是否为空值,是则退出 If txtCourseCredit.Text = String.Empty Then MsgBox("请输入课程学分") Return End If course = New BFCourse.Modal.Course '实例化实体类Course course.CourseID = "'" & Trim(txtCourseID.Text) & "'" '根据用户输入向course属性CourseID赋值 course.CourseName = "'" & Trim(txtCourseName.Text) & "'" '根据用户输入向course属性CoureName赋值 course.CourseCredit = Convert.ToInt32(Trim(txtCourseCredit.Text)) '根据用户输入向course属性CourseCredit赋值 cb.AddCourse(course) '调用BLL的AddCourse方法实现添加课程 dvwCourse.DataSource = cb.GetCourseList() '刷新课程浏览 End Sub
课程删除的三层实现
设计流程:
代码实现
DAL:
'根据传入课程编号courseID实现删除该字段的功能 Public Function DelCourse(courseID As String) As Integer Dim strSql As String strSql = "delete from T_Course where CourseID= " & courseID & "" '具体删除记录的SQL语句参数 Return Common.Doutil.ExecNonQuery(strSql) '根据传入的SQL语句参数,调用访问数据的模块方法实现具体操作 End FunctionBLL:
'删除课程方法DelCourse,无返回值,以弹出消息框方式显示是否成功 Public Sub DelCourse(courseID As String) Dim courseDAO = New BFCourse.DAL.CourseDAO '调用DAL的数据访问对象 If (courseDAO.Exist(courseID) = False) Then '调用Exist方法判断对应课程编号记录是否存在 MsgBox("此课程号不存在,请重新输入") Return '存在则退出 End If If courseDAO.DelCourse(courseID) > 0 Then '调用DelCourse方法删除记录,返回1则成功,返回0则失败 MsgBox("删除成功") Else MsgBox("删除失败") End If End Sub
'根据用户输入课程编号实现删除课程记录 Private Sub btnDelete_Click(sender As Object, e As EventArgs) Handles btnDelete.Click '判断用户输入课程编号是否为空,是则退出 If txtDCourseID.Text = String.Empty Then MsgBox("请输入课程编码") Return End If cb.DelCourse("'" & Trim(txtDCourseID.Text) & "'") '调用BLL的DelCourse方法,实现课程删除操作 dvwCourse.DataSource = cb.GetCourseList() '刷新浏览记录信息 End Sub
设计流程如记录添加的流程
代码实现
DAL:
'得到表T_Course的全部记录并传给集合 Public Function GetCourseList() As List(Of BFCourse.Modal.Course) Dim list = New List(Of BFCourse.Modal.Course) Dim rd As SqlClient.SqlDataReader Dim strSql As String Dim common = New Common.Doutil Dim course As BFCourse.Modal.Course strSql = "select * from T_Course" '具体实现的SQL语句 rd = common.GetReader(strSql) '根据具体SQL语句调用具体实现方法 '逐条读取记录,向集合中添加内容 While (rd.Read()) course = New BFCourse.Modal.Course course.CourseID = rd(0).ToString() course.CourseName = rd(1).ToString() course.CourseCredit = rd(2).ToString() list.Add(course) End While Return list '返回读取结果集合 End Function
'获取整个T_Course的全部记录 Public Function GetCourseList() As List(Of BFCourse.Modal.Course) Dim courseDAO = New BFCourse.DAL.CourseDAO '调用DAL的数据访问对象CourseDAO Return courseDAO.GetCourseList() '调用GetCourseList方法返回集合信息 End Function
加载窗体时,删除或添加记录成功后调用BLL的GetCourseList()方法
'加载窗体时,实现课程记录的显示操作 Private Sub frmCourse_Load(sender As Object, e As EventArgs) Handles MyBase.Load dvwCourse.DataSource = cb.GetCourseList() '显示全部课程信息记录 End Sub
三层之间调用关系为:
小结:在对此阶段内容学习时,看到了对数据库实现操作的不足,主要还是缺少练习,希望能在今后的项目中多多实践,还有便是对设计方面的学习上始终还没有对自己真正的练习使用,期待接下来的学习吧。