通过上个实例对整个三层有了一个最简单的理解,现在讲解一个运用三层的思想编写的登录窗体的实例,重点是理解三层的基本思想和练习连接数据库.
在这个实例中设计到了一个Model实体层,简单介绍一下关于实体层的作用和使用方法。
实体:针对具体的登录窗体来说,实体对象实际上就是数据库的表,我们把表里的字段封装到一个实体对象里,当具体使用某个对象的时候只需要调用实体对象的get和set方法获取对象的属性即可。对于大量的数据传递来说,传递实体要比传递具体变量更容易操作。
实体层:存放着各个表中的字段,各个层都可以调用,主要用来对层与层之间解耦。
用一张形象的图来表示各层和实体层之间的关系如下:
三层实例——登录窗体
一、分出三层和实体层:
二、实体层:
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
namespace LoginModel
{
public class UserInfo
{
public string UserName
{ get; set; }
public string Password
{ get; set; }
}
}
UserInfo表中存放了两个字段分别为:UserName和Password
把它们放在实体层可以简单的理解为这些代码是共享的,任何层当使用到这些属性的时候都可以调用UserInfo方法。
三、U层:
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Data.SqlClient;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Windows.Forms;
namespace LoginUI
{
public partial class Form1 : Form
{
public Form1()
{
InitializeComponent();
}
private void btnLogin_Click(object sender, EventArgs e)
{
string userName = txtUserName.Text.Trim();
string password = txtPassword.Text;
LoginBLL.LoginManager lgb = new LoginBLL.LoginManager();
LoginModel.UserInfo user = lgb.UserLogin(userName ,password );
MessageBox.Show("登录用户:" + user.UserName);
}
}
}
U层主要是与用户的交互,不涉及对数据的读取操作等。U层通过实体层的UserInfo调用了B层的UserLogin方法。这一层的代码核心就是通过Model层中的Username和Password作为传到B层的参数。
四、B层:
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
namespace LoginBLL
{
public class LoginManager
{
public LoginModel.UserInfo UserLogin(string LoginID, string LoginPwd)
{
LoginDAL.UserDAO lgd=new LoginDAL.UserDAO() ;
LoginModel.UserInfo user = lgd.SelectUser(LoginID, LoginPwd);
if (user != null)
{
return user ;
}
else
{
throw new Exception ("登录失败!");
}
}
}
}
B层中方法的定义也是通过实体层中的参数传递进行的,也是通过传递实体层的参数到了D层进行数据库的查询。
五、D层:
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Data;
using System.Data.SqlClient;
namespace LoginDAL
{
public class UserDAO
{
public LoginModel.UserInfo SelectUser(string LoginID, string LoginPwd)
{
string ConnString = @"Server=.;Database=SQL_Login; user Id=sa;Password=123456;";//连接方式
using (SqlConnection conn = new SqlConnection(ConnString))
{
SqlCommand cmd = conn.CreateCommand();
cmd.CommandText = @"SELECT LoginID, LoginPwd
FROM Login WHERE LoginID=@UserName AND LoginPwd=@Password";//查询语句
cmd.CommandType = CommandType.Text;
cmd.Parameters.Add(new SqlParameter("@UserName", LoginID));
cmd.Parameters.Add(new SqlParameter("@Password", LoginPwd));
conn.Open();
SqlDataReader reader = cmd.ExecuteReader();
LoginModel.UserInfo user = null;
while (reader.Read())//读取查询结果
{
if (user == null)
{
user = new LoginModel.UserInfo();
}
user.UserName = reader.GetString(0);
user.Password = reader.GetString(1);
}
return user;
}
}
}
}
D层主要作用就是连接数据库。查询到的结果也是通过实体层进行的数据返回。
最后的结果:
每个层之间都会和实体层发生关系,这就是实体层的最大好处.