七层登录总结(下)

简介: 七层登录总结(下)

添加命名空间

using System.Data.SqlClient;

using System.Data;

using System.Configuration;

同时在DAL层里边要手动添加上面的引用

不然就会出现confurgationManager找不到的情况发生,

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Data;
using System.Data.SqlClient;
namespace DAL
{
    public class LoginDAL : IDAL.LoginIDAL
    {
        public DataTable selectUser(Entity.UserInfo UserInfo)
        {
            //实例化一个数据查询对象uu
            SqlHelper sqlHelper = new SqlHelper();
            //传参
            SqlParameter[] sqlParams = { new SqlParameter("@UserID", UserInfo.UserId), new SqlParameter("@PassWord", UserInfo.PassWord) };
            //数据库选择要查询的数据
            string sql = @"SELECT* FROM Users WHERE UserName = @UserID AND PassWord = @PassWord";
            //将参数放在语句中
            DataTable table = sqlHelper.ExecuteQuery(sql, sqlParams, CommandType.Text);
            return table;
        }
    }
}

Factory(工厂层)

:定义一个接口层,实现BLL层和DAL层之间的数据传递,工厂层用到了抽象工厂+反射+配置文件,实现了不同数据库之间的连接,反射+配置文件

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Configuration;
using System.Reflection;
namespace Factory
{
    public class LoginFactory
    {
        string StrDB = System.Configuration.ConfigurationManager.AppSettings["DB"];   //接收来自配置文件的数据
        public IDAL.LoginIDAL CreateUser()
        {
            string ClassName = StrDB + "." + "LoginDAL";//DAL层的类名
            return (IDAL.LoginIDAL)Assembly.Load(StrDB).CreateInstance(ClassName);//反射+工厂的应用
        }
    }
}

BLL层:

执行特定的业务逻辑。

登陆界面BLL层:1.对D层返回来的信息进行判断,用户是否存在的问题,2.如果存在还会产生,返回更加具体的信息给U层

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Data;
namespace BLL
{
    public class LoginBLL
    {
        public bool UserBLL(Entity.UserInfo UserInfo)
        {
            Factory.LoginFactory fact = new Factory.LoginFactory();  //实例化工厂
            IDAL.LoginIDAL idal = fact.CreateUser();    //调用工厂方法创建接口
            DataTable table = idal.selectUser(UserInfo);   //接收D层的返回值
            bool flag;
            if (table.Rows.Count == 0)
            {
                flag = false;
            }
            else
            {
                flag = true;
            }
            return flag;
        }
    }
}

Facade层,

提供一个门面,一个UI层可访问多个BLL层,提供一个外观层,好比提供了一个简单的入口,降低UI层和BLL层之间的耦合度。

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
namespace Facade
{
    public class LoginFacade
    {
       public Boolean SelectUser(Entity.UserInfo user)
        {
            bool flag;
            BLL.LoginBLL userBLL = new BLL.LoginBLL();    //实例化一个b层的对象
            flag = userBLL.UserBLL(user);                           //接收B层传过来的信号
            return flag;
        }
    }
}

UI层:

1、提供一个登陆界面,获取用户输入的信息

2、给用户提供特定的业务功能

LoginUI

using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Windows.Forms;
namespace UI
{
    public partial class Form1 : Form
    {
        public Form1()
        {
            InitializeComponent();
        }
        public void btnLogin_Click(object sender, EventArgs e)
        {
            if (txtUserID.Text.Trim() == "")
            {
                MessageBox.Show("用户名不能为空,请输入用户名", "提示", MessageBoxButtons.OK, MessageBoxIcon.Warning);
            }
            if (txtPassword.Text == "")
            {
                MessageBox.Show("密码不能为空,请输入密码", "提示", MessageBoxButtons.OK, MessageBoxIcon.Warning);
            }
            //try
            //{
            Entity.UserInfo user = new Entity.UserInfo();
            user.UserId = Convert.ToInt32(txtUserID.Text.Trim());
            user.PassWord = txtPassword.Text;
            Boolean flag = false;
            Facade.LoginFacade FLogin = new Facade.LoginFacade(); //实例化外观
            flag = FLogin.SelectUser(user);//调用外观方法,返回给user
            if (flag != false)
            {
                MessageBox.Show("登录成功");
                this.Hide();//隐藏当前窗体
                MessageBox.Show("登录成功", "恭喜", MessageBoxButtons.OK);
            }
            else
            {
                MessageBox.Show("密码或用户名错误");
            }
            //}
            //catch (Exception)
            //{
            //    throw;
            //}
        }
        private void Form1_Load(object sender, EventArgs e)
        {
        }
        private void butCancel_Click_1(object sender, EventArgs e)
        {
            System.Environment.Exit(0);//这是最彻底的退出方式,不管什么线程都能被强制退出
            //this.Close();//只是关闭当前窗口,若不是主窗体的话,是无法退出程序的,另外,若有托管线程(非主线程),也无法干净退出
            //Application.Exit();//强制所有消息终止,退出所有的窗体,但是若有托管线程(非主线程),也是无法干净退出的;
            //Application.ExitThread();//强制终止调用线程上的所有消息,同样面临其他线程无法正确退出的难题
        }
        private void butCancel_Click(object sender, EventArgs e)
        {
        }
    }
}

配置文件

<?xml version="1.0" encoding="utf-8" ?>
<configuration>
    <startup> 
        <supportedRuntime version="v4.0" sku=".NETFramework,Version=v4.6.1" />
    </startup>
   <appSettings>
     <add key ="DB" value ="DAL"/>
     <add key ="strConn" value ="server =ZGY;Database= Login;User ID = sa; Password = 123456"/>
     </appSettings>  
</configuration>

这中间也遇见很多问题,大家可以去看这一系列的文章,一定有你遇见的那个错误呦!

System.NullReferenceException:“未将对象引用设置到对象的实例。” System.Configuration.ConnectionStringSettingsCollect

配置系统未能初始化

System.IO.FileNotFoundException:“未能加载文件或程序集“loginDAL”或它的某一个依赖项。系统找不到指定的文件。”

源文件与模块生成时的文件不同,是否希望调试器使用它?如何解决

System.ArgumentNullException:“值不能为 null。 Arg_ParamName_Name”

一定要先好好学习配置文件的写法奥!

相关文章
|
1天前
|
人工智能 JavaScript Linux
【Claude Code 全攻略】终端AI编程助手从入门到进阶(2026最新版)
Claude Code是Anthropic推出的终端原生AI编程助手,支持40+语言、200k超长上下文,无需切换IDE即可实现代码生成、调试、项目导航与自动化任务。本文详解其安装配置、四大核心功能及进阶技巧,助你全面提升开发效率,搭配GitHub Copilot使用更佳。
|
3天前
|
存储 人工智能 自然语言处理
OpenSpec技术规范+实例应用
OpenSpec 是面向 AI 智能体的轻量级规范驱动开发框架,通过“提案-审查-实施-归档”工作流,解决 AI 编程中的需求偏移与不可预测性问题。它以机器可读的规范为“单一真相源”,将模糊提示转化为可落地的工程实践,助力开发者高效构建稳定、可审计的生产级系统,实现从“凭感觉聊天”到“按规范开发”的跃迁。
617 11
|
7天前
|
存储 JavaScript 前端开发
JavaScript基础
本节讲解JavaScript基础核心知识:涵盖值类型与引用类型区别、typeof检测类型及局限性、===与==差异及应用场景、内置函数与对象、原型链五规则、属性查找机制、instanceof原理,以及this指向和箭头函数中this的绑定时机。重点突出类型判断、原型继承与this机制,助力深入理解JS面向对象机制。(238字)
|
6天前
|
云安全 人工智能 安全
阿里云2026云上安全健康体检正式开启
新年启程,来为云上环境做一次“深度体检”
1622 6
|
3天前
|
消息中间件 人工智能 Kubernetes
阿里云云原生应用平台岗位急招,加入我们,打造 AI 最强基础设施
云原生应用平台作为中国最大云计算公司的基石,现全面转向 AI,打造 AI 时代最强基础设施。寻找热爱技术、具备工程极致追求的架构师、极客与算法专家,共同重构计算、定义未来。杭州、北京、深圳、上海热招中,让我们一起在云端,重构 AI 的未来。
|
5天前
|
IDE 开发工具 C语言
【2026最新】VS2026下载安装使用保姆级教程(附安装包+图文步骤)
Visual Studio 2026是微软推出的最新Windows专属IDE,启动更快、内存占用更低,支持C++、Python等开发。推荐免费的Community版,安装简便,适合初学者与个人开发者使用。
653 11
|
8天前
|
缓存 算法 关系型数据库
深入浅出分布式 ID 生成方案:从原理到业界主流实现
本文深入探讨分布式ID的生成原理与主流解决方案,解析百度UidGenerator、滴滴TinyID及美团Leaf的核心设计,涵盖Snowflake算法、号段模式与双Buffer优化,助你掌握高并发下全局唯一ID的实现精髓。
372 160
|
8天前
|
人工智能 自然语言处理 API
n8n:流程自动化、智能化利器
流程自动化助你在重复的业务流程中节省时间,可通过自然语言直接创建工作流啦。
460 6
n8n:流程自动化、智能化利器
|
5天前
|
人工智能 Shell 开发工具
Claude Code 2.1.2超详细更新说明,小白也能10分钟上手
Claude Code 2.1.x重磅更新:Shift+Enter换行、Esc+Esc撤销、Ctrl+B后台运行,Skills技能系统全面升级,支持多语言、通配符权限与动态MCP检测,性能提升50%,迭代速度惊人,开发者效率暴涨!
Claude Code 2.1.2超详细更新说明,小白也能10分钟上手