三层架构——三层登录代码分析

●时序图


●U层

private void btnLogin_Click(object sender, EventArgs e)
        {
            //IDbConnection conn = new SqlConnection("c......");
            //IDbCommand cmd = conn.CreateCommand();
            //cmd.CommandText = "Select UserName From USERS WHERE......";
            //cmd.ExecuteReader();
            //获取界面上的信息
            string userName=txtUserName.Text.Trim();
            string password=txtPassword.Text;
            //和B层建立了连接
            Login.BLL.LoginManager mgr = new Login.BLL.LoginManager();
            //将界面上的数据传给实体
            Login.Model.UserInfo user=  mgr.UserLogin(userName, password);
           MessageBox.Show("登录用户:" + user.UserName);
        }

代码分析

      U层的职责就是显示信息或者获取用户输入的信息或操作指令,登录的时候用户输入的用户名和密码就是信息,点击登录按钮就是操作指令。通过代码可以看出U层将界面上的信息分别赋值给了两个变量,然后又将数据给实体,实体的作用是在三层之间传输数据,所以实体可以将U层的数据传给B层进行处理。

B层

 public  class LoginManager
    {
        public Login.Model.UserInfo UserLogin(string userName,string password)
        {
            //实例化D层对象,传输数据
            Login.DAL.UserDAO uDao = new Login.DAL.UserDAO();
            Login.Model.UserInfo user = uDao.SelectUser(userName, password);
            if(user!=null)  //login successfully
            {
                //实例化D层对象
                Login.DAL.ScoreDAO sDao=new Login.DAL.ScoreDAO();
                sDao.UpdateScore(userName,10);
                return user;
            }
            else
            {
                throw new Exception("登录失败");
            }
        }
    }

代码分析

      B层通过实例化D层的对象将数据传输给D层进行处理,如果user是存在的也就是用户名和密码都是相同的则更新Score表,否则抛出异常。

D层

class DbUtil
    {
        //连接数据库
        public static string ConneString = @"Server=DESKTOP-B668TM2;Database=Login;User ID=sa;Password=1";
    }
public class UserDAO   //判断用户名和密码的正确情况
    {
       public Login.Model.UserInfo SelectUser(string userName,string password)
       {
           using(SqlConnection conn = new SqlConnection(DbUtil.ConneString))
           {
               SqlCommand cmd = conn.CreateCommand();
               cmd.CommandText = @"SELECT ID,UserName,Password,Email
                                FROM USERS WHERE UserName=@UserName AND Password=@Password";
               cmd.CommandType = CommandType.Text;
               cmd.Parameters.Add(new SqlParameter("@UserName", userName));
               cmd.Parameters.Add(new SqlParameter("@Password", password));
               conn.Open(); 
               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);
                   user.UserName = reader.GetString(1);
                   user.Password = reader.GetString(2);
                   if(!reader.IsDBNull(3))
                   {
                       user.Email = reader.GetString(3);
                   }
               }
               return user;
           }
       }
    }

 public class ScoreDAO   //给登陆的用户加分
    {
        public void UpdateScore(string userName,int value)
        {
            //执行完自动释放资源
            using(SqlConnection conn=new SqlConnection(DbUtil.ConneString))
            {
                //实例化一个cmd类对数据库进行存储操作
                SqlCommand cmd = conn.CreateCommand();
                cmd.CommandText = @"INSERT INTO SCORES(UserName,Score) Values(@UserName,@Score)";
                //将userName传给UserName
                cmd.Parameters.Add(new SqlParameter("@UserName", userName));
                //将value传给Score
                cmd.Parameters.Add(new SqlParameter("@Score",value));
                //打开数据库
                conn.Open();
                cmd.ExecuteNonQuery();
            }
        }

代码分析

      D层实现和数据库的连接,UserDAO判断用户名和密码的正确情况并且给一个返回值。ScoreDAO在用户名和密码正确的情况下给相应的用户加分,写入数据库。

●实体

  public class UserInfo
    {
        public int ID { get; set; }
        public string UserName { get; set; }
        public string Password { get; set; }
        public string Email { get; set; }
    }

代码分析

      将用到的数据进行封装,在三层之间传输这些数据。

●总结

      明白三层之间的引用关系和数据在三层之间的传输过程写代码就会少一些难度,在第一次机房的时候就有体会,如果思路清晰,那么写代码就非常的容易,同样在三层中也是这样,先理清思路再敲代码。







你可能感兴趣的:(三层架构——三层登录代码分析)