三层登录实战C#版

刚开始接触三层的时候没头绪,虽然知道它们之间的引用关系,可是还是感觉很混乱,所以上网看了看博客,决定先从画图入手。从包图——>类图——>时序图(逻辑)——>代码,一步步的重新做!

一、包图

为什么要有实体层?没有实体层可以吗?为什么不叫四层,而叫三层呢?

实体层的作用是便于层与层之间数据的传递,每个实体对象与数据库里的表示一一对应的。对于大量的数据来说,就可以直接通过实体对象用Get(),Set()方法将字段提取出来,这比临时在创建变量要省事。就相当于利用面向对象的思想,将大量的数据进行封装后在进行传递。

例如:

AddUser(UserID,UserName,UserPassword)

用了实体层,将这些字段封装到UserInfo类中,可以写为AddUser(UserInfo),这样就省事多了。

并不是一定要有实体层,如果只有少量数据, 例如机房收费系统中,查询某个卡号对应的学生,可以通过CardID作为参数来进行传递,也就没有必要用实体层进行传递了。

实体层是为了数据传递提供方便,只是一个类,并无实际作用,可有可无,所以不可以和UI,DAL,BLL一样作为层来说。

二、类图

1、实体层 UserInfo类

2、D层:DbUtil类和UserDAO类

3、B层:LoginManager类

4、U层:FrmLogin类

三、时序图

四、代码



1、Entity层:UserInfo类

定义字段,获取字段的Get()与Set()方法,与数据库中的Users表是对应的,方便数据的传递

namespace LoginModel
{
    //数据库表的映射
        public class UserInfo
        {
            private string username;
            public string UserName
            {
                get { return username; }
                set { username = value; }
            }

            private string password;
            public string PassWord
            {
                get { return password; }
                set { password = value; }
            }

            public UserInfo(string username, string password)
            {
                this.username = username;
                this.password = password;
            }
        }

}

2、D层:

(1)DbUtil类:

namespace LoginDAL
{
    /// <summary>
    /// 创建连接数据库字符串
    /// </summary>
    class DbUtil
    {
       public static string ConnString = @"server=bill\BILLSQL;dataBase=Users;user id=sa;password=123456";
    }
}

(2)UserDAO类:

主要用于提供数据库的基本访问,供BLL调用。

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Data;
using System.Data.SqlClient;

namespace LoginDAL
{
    public class UserDAO
    {
        //查询用户
         public LoginModel.UserInfo SelectUser(string username, string password)
        {

            using (SqlConnection conn = new SqlConnection(DbUtil.ConnString))//创建SQL数据库打开连接

            {

                SqlCommand cmd = conn.CreateCommand(); //创建并返回一个与 SqlConnection 关联的 SqlCommand 对象

                cmd.CommandText = @"select username,password from user_Info where [email protected] and [email protected]";//获取数据源执行的查询语句

                cmd.CommandType = CommandType.Text;//设置一个值用来解释CommandText属性

                //将指定的SqlParameter添加到SqlParameterCollection中
                cmd.Parameters.Add(new SqlParameter("@username", username));
                cmd.Parameters.Add(new SqlParameter("@password", password));

                conn.Open();//打开数据库连接

                SqlDataReader reader = cmd.ExecuteReader();//将 CommandText 发送到 Connection 并生成一个 SqlDataReader

                LoginModel.UserInfo user = null;

               //使 SqlDataReader 前进到下一条记录
                while (reader.Read())
                {
                    if (user == null)
                    {
                        user = new LoginModel.UserInfo();
                    }

                   user.UserName = reader.GetString(0);
                   user.PassWord = reader.GetString(1);

                }
                return user;
            }
        }
    }
}

3、B层:LoginManager类

处理业务逻辑,主要包括判断用户名与密码的是否为空,以及从D层中获取的数据传递给实体层。

namespace LoginBLL
{
    public class LoginManager
    {
         public LoginModel.UserInfo UserLogin(string username, string password)
        {
             //throw new NotImplementedException();

             LoginDAL.UserDAO uDAO = new LoginDAL.UserDAO();

             //用户名不能为空
            if (username == null)
            {
                throw new Exception("请输入用户名");

            }

             //密码不能为空
            if (password == null)
            {
                throw new Exception("请输入密码");

            }

            LoginModel.UserInfo user = uDAO.SelectUser(username, password);
            if (user != null)
            {

                return user;

            }
            else
            {
                throw new Exception("登录失败");
            }
        }
    }

}

4、U层:FrmLogin类

主要是界面命令以及操作,接收B层传来的数据。

namespace LoginUI
{
    public partial class FrmLogin : Form
    {
        public FrmLogin()
        {
            InitializeComponent();
        }

        private void btnLogin_Click(object sender, EventArgs e)
        {
            string username = txtUserName.Text.Trim() ;
            string password = txtPassWord.Text;

            try
            {
                LoginBLL.LoginManager mgr = new LoginBLL.LoginManager();
                LoginModel.UserInfo user = mgr.UserLogin(username, password);
                MessageBox.Show("登录用户:" + user.UserName);
            }

            catch (Exception err)

            {
                MessageBox.Show(err.Message.ToString());
            }
        }

        private void btnCancel_Click(object sender, EventArgs e)//卸载窗体
        {
            Close();
        }

    }
}

五、收获

虽然理论理解了理论,但是有的代码还是不太理解,尤其是传递数据的那块,调试的时候发现是这样的:在界面输入用户名和密码——>B层——>D层——>实体层——>D层——>B层——>界面显示登录成功!

用户输入用户名和密码后,执行B层代码判断用户名和密码是否为空,实例化LoginManager类,调用它的UserLogin方法;跳到B层,实例化UserDAO类,并调用它的SelectUser方法;调到D层,创建连接数据库对象,……到实体层这又乱了,正在看这篇博客的大神们,你们帮帮忙吧!

时间: 2024-10-23 20:40:59

三层登录实战C#版的相关文章

三层登录实例VB.NET版具体解释---理论加实战篇

层,百度百科这样解释,首先-重叠起来的东西:重叠起来的东西中的一部分:层次|表层|大气层.其次-重叠.反复:层峦叠嶂|层出不穷.最后-量词,用于能够分出层次的事物.女孩儿强烈的第六感,三层中的层一定是第三个意思,三层架构(3-tier architecture) 通常意义上的三层架构就是将整个业务应用划分为:表现层(UI).业务逻辑层(BLL).数据訪问层(DAL).区分层次的目的即为了"高内聚,低耦合"的思想. 接下来,以登录为例.结合分层,总结一下在这个小样例中的所思所想.首先,来

.NET版三层登录

看着视频敲了一遍登录的例子,好像只是知道了三层里有D层.B层.U层,每层都是相互独立的,然后将数据逐层的传递.但是具体是怎么实现的,还是有点蒙-- 在敲.NET版三层登录之前参考了很多人的博客,这才慢慢的下手,敲上一遍,就觉得有清楚了很多-- 首先,建立以下的Windows应用程序以及类库: 实体类(Model)代码: <span style="font-size:18px;">Public Class UserInfo Private _username As Strin

.NET版三层登录问题集锦

.Net版的三层登录敲完了,让我们把问题总结一下吧--     问题1. 想大家看见这个错误就应该能想到是在数据库连接的地方出现的.都怪我太粗心,明明应该是server,却写成了 sever. 但是为什么在写代码的时候没有报错呢?原因就是sqlconnection是一个打开sql sever的数据库连接,连接数据库的语句是以字符串的形式写出来的,字符串就是你写的时候是什么样就是什么样,没有错.但是当执行到的时候就会觉得不对,然后报错. 问题2. 这个问题是数据类型转换时发生的. 下面是我们的sq

第九篇 :微信公众平台开发实战Java版之如何实现自定义分享内容

微信JS-SDK是微信公众平台面向网页开发者提供的基于微信内的网页开发工具包. 通过使用微信JS-SDK,网页开发者可借助微信高效地使用拍照.选图.语音.位置等手机系统的能力,同时可以直接使用微信分享.扫一扫.卡券.支付等微信特有的能力,为微信用户提供更优质的网页体验. 本次的内容: 实现:分享到朋友圈,qq,qq空间,微信朋友的功能. 基础接口 判断当前客户端版本是否支持指定JS接口 wx.checkJsApi({ jsApiList: ['chooseImage'], // 需要检测的JS接

三层登录—c#

学习了三层,有一个登录窗口的小练习.是我们第一次接触三层的初战.如今仅仅是简单的了解了一些,须要学习的还有非常多,以下浅谈自己的理解. 我们说的三层就是分层了显示层.业务逻辑层和数据訪问层.当中显示层是直接和客户打交道的,是用户的显示界面:而业务逻辑层是处理业务的,是中间的桥梁.联系着显示层和数据訪问层,把用户的请求进行分析处理,在给数据源写入:那么数据訪问层是做什么的呢?主要操纵数据库,对数据库中的数据进行增删改查的处理.这样各个层次就有了自己特定的功能,达到了高内聚低耦合的效果. 这是一个简

第三方登录插件.NET版XY.OAuth-CSharp

XY.OAuth-CSharp GitHub:XY.OAuth-CSharp OSChina:XY.OAuth-CSharp 第三方登录插件.NET版 使用 首先,从NuGet上安装"XY.OAuth" 然后在项目配置文件的根节点下"configuration"的子节点"appSettings"中添加如下下配置信息: 1 <!--第三方登录配置 Start--> 2 <!-- 客户端ID --> 3 <add key

ucenter 单点登录,终极版

一 ,discuz ecshop  两边登陆都可以同步登陆到另一程序上,但退出则无法实现同步登陆.顺着 Ecshop 的退出流程,顺藤摸瓜找到了 lib_common.php 文件中的 uc_call 这个方法.这个方法的第二个参数 $params 的默认值是 null.而 Ecshop 注销时只传了调用 uc_client 中同步退出方法名做为一个参数的值,第二个参数使用的是默认值.而这个方法中通过 call_user_func_array($func, $params); 来调用对应的方法,

Java基础知识强化之IO流笔记56:IO流练习之 登录注册IO版

1.  登录注册IO版的Java项目框架,如下: 2. 具体代码实现: (1)User.java(cn.itcast.game): 1 package cn.itcast.pojo; 2 3 /** 4 * 这是用户基本描述类 5 * 6 * @author 风清扬 7 * @version V1.1 8 * 9 */ 10 public class User { 11 // 用户名 12 private String username; 13 // 密码 14 private String p

三层框架(原始版)

什么是三层 所谓三层体系结构,是在客户端与数据库之间加入了一个“中间层”,也叫业务逻辑层.这里所说的三层体系,不是指物理上的三层,不是简单地放置三台机 器就是三层体系结构,也不仅仅有B/S应用才是三层体系结构,三层是指逻辑上的三层,即把这三个层放置到一台机器上.三层体系的应用程序将业务规则.数据 访问.合法性校验等工作放到了中间层进行处理.通常情况下,客户端不直接与数据库进行交互,而是通过中间层)(业务逻辑层)建立连接,再经由中间层与数据 库进行交互. 如下: 1.用户界面表示层(USL) 2.