三层登录

UI的作用:向用户展现特定业务数据;采集用户的输入信息和操作——拿来主义

private void btnLogin_Click(object sender, EventArgs e)  //登录按钮
        {
            //有了三层结构,显示层绝对不跟数据源打交道。因此需要有业务逻辑层的支持
           
         try
            {
                //获取用户界面的数据
                string userName = txtUserName.Text.Trim();
                string password = txtPassword.Text;//后面不加 Trim(),密码可能包含空格
                Login.BLL.LoginManager mgr = new Login.BLL.LoginManager();
                Login.Model.UserInfo user = mgr.UserLogin(userName, password);

                MessageBox.Show("登录用户:" +user.UserName);
            }
            catch (Exception ex)  //如果登录异常,则登录失败
            {
                MessageBox.Show(ex.Message);
            }
         }

BLL的作用:从DAL中获取数据,以供 UI 显示用;

从 UI 中获取用户指令和数据,执行业务逻辑;

namespace Login.BLL            引用  LoginDAL     LoginModel
{
    public class LoginManager
    {
        public Login.Model.UserInfo UserLogin(string userName,string password)
        {            
            Login.DAL.UserDAO uDao = new Login.DAL.UserDAO();

            Login.Model.UserInfo user = uDao.SelectUser(userName, password);
            if (user != null)//login successfully
            {
                Login.DAL.ScoreDAO sDao = new Login.DAL.ScoreDAO();
                sDao.UpdateScore(userName, 10);
                return user;
            }
            else
            {
                throw new Exception("登录失败");
            }
        }
 }

DAL——数据访问层——与数据源打交道

DAL的作用:从数据源加载数据(select);向数据源写入数据(insert/update);从数据源删除数据(delete)

Using system data;
using System.Data.SqlClient;

namespace Login.DAL           引用   LoginModel
      
{
    public class UserDAO
    {
        public Login.Model.UserInfo SelectUser(string userName,string password)
        {
            using(SqlConnection conn=new SqlConnection(DbUtil.ConnString))     //关键字using ,connection 可自动关闭连接
            {
                SqlCommand cmd = conn.CreateCommand();
                cmd.CommandText = @"SELECT ID, UserName, Password, Email
                                    FROM [User] 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);//not suggestion
                    if (!reader.IsDBNull (3))
                    {
                        user.Email = reader.GetString(3);
                    }
                }
                return user;
            }
        }
    }

    class DbUtil
    {
        public static string ConnString = @"Server=HFF;Database=Login;User   ID=sa;Password=123456";          
    }

}
//业务数据模型
namespace Login.Model//封装数据,为了在三层间传输数据,独立于其他三个层,不知道谁去调用它
{//Login.Model不引用任何一个程序集,而其他三个层分别添加引用Login.Model
    //实体类,用于保存信息
    public class UserInfo
    {
        public int ID { get; set; }
        public string UserName { get; set; }
        public string Password { get; set; }
        public string Email { get; set; }
    }
}

哈哈,三层登录就如上所述了。再多的理论都不如一个实战,加油!

你可能感兴趣的:(三层学习)