三层登录—代码分析
昨天结束了一直惦记的三层,走完设计模式后,三层的代码就简单了,接下来主要分享下三层的基础知识,从物理上三层:显示层/业务层/数据层,而咱们学习的是逻辑上的三层:UI/BLL/DAL
从上图可以看出UI层主要与用户打交道,就好比QQ的登录界面一样,而BLL层接受UI层用户的数据,传送给DAL层并进行逻辑判断,DAL层与数据库打交道对数据源的数据进行数据库操作,如下图所示
向下箭头代表引用关系,数据传递,向上代表数据返回,像本例则是返回User,对于MODEL层,从下面的代码中进行阐述,在本例中主要实现两个业务:
1.登录
2.登录成功的用户+10积分
下面看代码:
U层(接受用户数据传给B层)
string userName = txtUserName.Text.Trim();
string password = txtPWD.Text;
Login.BLL.loginService mgr = new Login.BLL.loginService();//实例化B层类
Login.Model.UserInfo user = mgr.UserLogin(userName, password);//调用B层类方法并返回User
MessageBox.Show("登录用户:" + user.UserName);
B层(接受U层参数,传给D层,并进行逻辑判断)
public class loginService
{
//返回一个User,因此要建一个数据类型,建一个Model
public Login.Model.UserInfo UserLogin(string userName, string password)
{
login.DAL.UserDAO uDAO = new login.DAL.UserDAO();//实例化D层类
Login.Model.UserInfo user =uDAO.SelectUser(userName, password);//调用D层方法,并返回User
if (user !=null)//判断用户是否为空
{
//不为空加10积分
login.DAL.ScoreDAO sDao = new login.DAL.ScoreDAO();
sDao.UpdateScore(userName, 10);
return user;
}
else
{
throw new Exception("登录失败");
}
}
}
D层(UserDAO类,接受B层参数,查询数据库,并进行操作)
public Login.Model.UserInfo SelectUser(string userName, string passWord)
{
using (SqlConnection conn = new SqlConnection(DbUtil.ConnString))
{
SqlCommand cmd = conn.CreateCommand();
cmd.CommandText = @"SELECT ID,UserName,Password,Email From USERS
WHERE UserName = @UserName AND [email protected]"
cmd.CommandType = CommandType.Text;
conn.Open();
cmd.Parameters.Add(new SqlParameter("@UserName",userName));
cmd.Parameters.Add(new SqlParameter("@Password",passWord));
SqlDataReader reader = cmd.ExecuteReader();
Login.Model.UserInfo user = null;
//判断数据是否读到尾
while (reader .Read ())
{
if (user == null)
{
user = new Login.Model.UserInfo();
}
user.ID = reader.GetInt32(0);//将数据库第零列的数据以int32的格式返回
user.UserName = reader.GetString(1);//第二列
user.PassWord = reader.GetString(2);//第三列
if (!reader.IsDBNull (3))
{
user.Email = reader.GetString(3);
}
}
return user;
}
}
D层(ScoreDAO类,接受B层参数,并实现加积分业务)
public void UpdateScore(string userName, int value)
{
using (SqlConnection conn = new SqlConnection(DbUtil.ConnString))
{
SqlCommand cmd = conn.CreateCommand();
cmd.CommandText = @"INSERT INTO SCORES(UserName,Score) Values(@UserName,@Score)";
cmd.Parameters.Add(new SqlParameter("@UserName", userName));
cmd.Parameters.Add(new SqlParameter("@Score", value));
conn.Open();
cmd.ExecuteNonQuery();
}
}
MODEL层( 为了封装数据,在三个层之间传递,中间是以user类型返回,因此封装为user类)
public class UserInfo
{
public int ID { get; set; }
public string UserName { get; set; }
public string PassWord { get; set; }
public string Email { get; set; }
}
至此三层之间的传递参数就结束了,这是对三层有个宏观的把控,对于D层的数据库操作,下一篇的博客进行总结,还请各位大佬斧正!