三层代码

经过了几天的三层的学习,从刚刚开始的什么都不懂到现在的三层的实现,虽然学的不是很好,但是还是感觉有收获的。

三层由U层、B层和D层组成,当然还有实体层,但是实体层不属于三层里的,它是一个被三个层次来回调用的实体层,是用来封装数据的(我是这样认为的)
【三层的解决方案】

其中,
在B层创建一个LoginManager类
在D层创建三个类:DBUtil类(作用:用来连接数据库)
 ScoreDAO类:(作用:用来增加积分)
         UserDAO类:(作用:用来查找人员)
在U层创建一个form应用窗体(作用:用来显示数据)
在实体层创建一个UserInfo类(作用:用来封装数据,相当于一个数据的集合)
【代码展示】
U层代码
<span style="font-family:KaiTi_GB2312;font-size:24px;">namespace LoginUI
{
    public partial class Form1 : Form
    {
        public Form1()
        {
            InitializeComponent();
        }

        private void btnlogin_Click(object sender, EventArgs e)
        {

            //从前台获取UserName 和Password
            string userName = txtUserName.Text.Trim();
            string password = txtPassword.Text;
            //构造一个Manager的实例
            Login.BLL.LoginManager mgr = new LoginManager();
            Login .Model .UserInfo user  =  mgr.UserLogin(userName,password);

             //提示
            MessageBox.Show("登录用户" + user.UserName);</span>
<span style="font-family:KaiTi_GB2312;font-size:24px;"><span style="white-space:pre">	</span> }

        private void txtUserName_TextChanged(object sender, EventArgs e)
        {
        }
    }
}
</span>
B层代码
namespace Login.BLL
{
    public class LoginManager
    {
        public Login.Model.UserInfo UserLogin(string userName, string password)
        {
            throw new NotImplementedException();
           //构建D层UserDAO实例
            Login.DAL.UserDAO uDao = new UserDAO();
            Login.Model.UserInfo user = uDao.SelectUser(userName, password);
            //构建实体层的实例
            Login.Model.UserInfo userInfo = new UserInfo();
            //判断是否登录成功
            if (user !=null )
            {
                //实例化D层的积分类
                Login.DAL.SocreDAO sDao = new SocreDAO();
                sDao.UpdateSocre(userName, 10);
                return user;
           
            }
            else //登录失败
            {
                throw new Exception("登录失败");

            }

        }
    }
}
D层代码
UserDAO类的代码
<span style="font-family:KaiTi_GB2312;font-size:24px;">namespace Login.DAL
{
    public class UserDAO
    {
        public Login.Model.UserInfo SelectUser(string userName, string Password)
        {
            //获取一个sqlconnection
            using (SqlConnection conn = new SqlConnection(DBUtil.ConnString))//有了Using之后,connection就可以自动关闭了
            {

                //创建一个cmd实例
                SqlCommand cmd = conn.CreateCommand();
                //SqlCommand cmd = conn.CreateCommand();
                cmd.CommandText = @"SELECT ID ,UserName,Password.Email   FROM USERS WHERE UserName=@UserName AND Password=@Password";
                //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 ));
                SqlDataReader reader = cmd.ExecuteReader();
                Login.Model.UserInfo user = null;

                //读取具体数据
                while (reader.Read())
                {
                    if (user == null)
                    {
                        user = new Model.UserInfo();//如果为空,则延迟加载
                    }
                    user.ID = reader.GetInt32(0);
                    user.UserName = reader.GetString(1);
                    user.Password = reader.GetString(2);//不建议密码从数据库里面取出来
                    //当Email为空的时候
                    if (!reader.IsDBNull(3))
                    {
                        user.Email = reader.GetString(3);
                    }
                }
                return user;
            }
        }
    }
}
</span>

ScoreDAO类代码:
<span style="font-family:KaiTi_GB2312;font-size:24px;">namespace Login.DAL
{
    public class SocreDAO
    {
        public void UpdateSocre(string userName, int value)
        {
            using (SqlConnection conn = new SqlConnection(DBUtil.ConnString))
            {
                //创建一个COMMAND
                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 ));
                cmd.ExecuteNonQuery();

            }
        }
    }
}
</span>
DBUtil类代码:
namespace Login.DAL
{
     public class DBUtil
    {
         public static string ConnString = @"Server=张旭;Database=Login;User ID=sa;Password=123"; 
         //throw new NotImplementedException ();
    }
}


实体类代码:
namespace 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; }

    }
}





【小结
    学习了三层之后,感觉代码其实很好理解。其中业务逻辑层最重要,数据访问层负责访问数据库,没有任何的逻辑运算,界面层只负责显示数据。
在D层的时候,连接数据库的时候的语句感觉还是不能灵活的运用,还需要回过头在学习一遍。
总之,简单也好难也好,主要的是自己去静下心去学习。


  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 20
    评论
评论 20
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值