三层登录—代码分析

        昨天结束了一直惦记的三层,走完设计模式后,三层的代码就简单了,接下来主要分享下三层的基础知识,从物理上三层:显示层/业务层/数据层,而咱们学习的是逻辑上的三层: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层的数据库操作,下一篇的博客进行总结,还请各位大佬斧正!