七层登录总结(上)

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

宏观:要明确是如何从三层转七层

引用图片自:图片作者原文章

实体层(entity)

:用来封装一些功能性代码,定义实体类型和实体集合,用来各层次传递参数用来存放用户输入的信息。用getset实现达到传递参数的方法达到可以可读可写,同时又有封装性。

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
namespace Entity
{
     public class UserInfo
    {
        //定义用户ID字段
        private int userid;
        public int UserId
        {
            get { return userid; }
            set { userid = value; }
        }
        //定义用户名
        private string username;
        public string UserName
        {
            get { return username; }
            set { username = value; }
        }
        //定义密码字段
        private string password;
        public string PassWord
        {
            get { return password;}
            set { password = value; }
        }   
    }
}

接口层(IDAL)

:定义一个统一的接口方法selectuser,解除B层和D层的耦合,具体代码靠DAL

实现。

注意:因为返回值类型为DataTable ,所以应该引用数据的命名空间。

using System.Data;

Data是数据的意思。

顾名思义,引用这个dll即表示你的命名空间下有需要使用数据、数组的地方,可以直接使用数组类型,而不需要再添加前缀。

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Data;
namespace IDAL
{
    public interface LoginIDAL
    {
        DataTable selectUser(Entity.UserInfo userInfo);
    }
}

数据访问层(DAL)

:提供基本的数据访问,该层将有关数据库的操作放在单独的一个类中,针对数据的增删改查。

DAL层会封装一个sqlHelper。目的是连接数据库实现对数据库的增删改查,这是为了服务于DAL层的。

首先有个构造函数连接上数据库,然后重载了对数据库的增删改查有无参数的方法,

LoginSqlHelper

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Data.SqlClient;
using System.Data;
using System.Configuration;
namespace DAL
{
        ///<summary>
        ///SqlHhelper created by  ZGY 2021年11月22日20:25:30
        ///</summary>
        public class SqlHelper
        {
            private SqlConnection Conn = null;
            private SqlCommand Cmd = null;
            private SqlDataReader SqlSdr = null;
            public   SqlHelper()
            {
                //利用反射连接数据库
                //除了要在上边添加命名空间,也要手动在类的引用里边添加引用才能生效
                //这里的AppSetting要注意大小写
                string strconn = ConfigurationManager.AppSettings["strConn"];
                //实例化一个连接
                Conn = new SqlConnection(strconn);
            }
            ///<summary>
            ///打开数据库
            ///<summary/>
            /// <returns>sqlConnection</returns>
            private SqlConnection GetConn()
            {
                if (Conn.State != ConnectionState.Open)
                {
                    try
                    {
                        Conn.Open();
                    }
                    catch (Exception ex)
                    {
                        Conn.Dispose();//没有成功打开,释放资源
                        throw new Exception("打开数据库失败!");
                    }
                }
                return Conn;
            }
            ///<summary>
            ///执行不带参数的增删改操作
            ///<summary/>
            ///<param name="CmdText">执行的sql语句或者存储过程</param>
            ///<param name="CmdType">语句类型</param>
            ///
            /// <returns>sqlConnection</returns>
            public int ExecuteNonQuery(string CmdText, CommandType CmdType)
            {
                //数据库连接语句
                int res;
                try
                {
                    Cmd = new SqlCommand(CmdText, GetConn());
                    Cmd.CommandType = CmdType;
                    res = Cmd.ExecuteNonQuery();
                }
                catch (Exception ex)
                {
                    throw ex;
                }
                finally
                {
                    if (Conn.State == ConnectionState.Open)
                    {
                        Conn.Close();
                    }
                }
                return res;
            }
            /// <summary>
            /// 执行带参数的增删改操作
            /// </summary>
            /// <param name="CmdText">执行的SQL语句或存储过程</param>
            /// <param name="parameters">参数</param>
            /// <param name="CmdType">(SQL语句或存储过程)的类型</param>
            /// <returns>返回增删改的操作数(受影响的行数)</returns>
            public int ExecuteNonQuery(string CmdText, SqlParameter[] parameters,CommandType CmdType)
            {
                int res;
                try
                {
                    Cmd = new SqlCommand(CmdText, GetConn());   //先建立sql语句
                    Cmd.Parameters.AddRange(parameters);         //再进行参数匹配
                    Cmd.CommandType = CmdType;
                    res = Cmd.ExecuteNonQuery();
                }
                catch (Exception ex)
                {
                    throw ex;
                }
                finally
                {
                    if (Conn.State==ConnectionState.Open)
                    {
                        Conn.Close();
                    }
                }
                return res;
            }
            /// <summary>
            /// 执行不带参数的查询操作
            /// </summary>
            /// <param name="CmdText">执行的SQL语句或存储过程</param>
            /// <param name="CmdType">(SQL语句或存储过程)类型</param>
            /// <returns>查询后的数据</returns>
            public DataTable ExecuteQuery(string CmdText, CommandType CmdType)
            {
                DataTable dt = new DataTable();
                using (SqlSdr = Cmd.ExecuteReader(CommandBehavior.CloseConnection))
                {
                    Cmd = new SqlCommand(CmdText, GetConn());
                    Cmd.CommandType = CmdType;
                    dt.Load(SqlSdr);
                }
                return dt;
            }
            /// <summary>
            /// 执行带参数的查询
            /// </summary>
            /// <param name="CmdText">执行的SQL语句或存储过程</param>
            /// <param name="parameters">(SQL语句或存储过程)类型</param>
            /// <param name="CmdType"></param>
            /// <returns>查询后的数据</returns>
            public DataTable ExecuteQuery(string CmdText, SqlParameter[] parameters, CommandType CmdType)
            {
            DataTable dt = new DataTable();
            Cmd = new SqlCommand(CmdText, GetConn());
            Cmd.CommandType = CmdType;
            Cmd.Parameters.AddRange(parameters);
            using (SqlSdr = Cmd.ExecuteReader(CommandBehavior.CloseConnection))
            {
                dt.Load(SqlSdr);
            }
            return dt;
            //DataTable dt = new DataTable();
            //using (SqlSdr = Cmd.ExecuteReader(CommandBehavior.CloseConnection))
            //{
            //    Cmd = new SqlCommand(CmdText, GetConn());
            //    Cmd.Parameters.AddRange(parameters);
            //    Cmd.CommandType = CmdType;
            //    dt.Load(SqlSdr);
            //}
            //return dt;
        }
    }
}

LoginDAL

这里的代码和配置文件息息相关,容易出现错误,容易出现的错误和解决办法都会放在文章最后奥。

DAL是为了实现IDAL层中的方法。对数据进行增删改查。

首先实例化一个sqlhelper,对数据库进行连接

然后声明一个sql参数的数组,将实体层中的参数值传给我们定义的参数中

然后再数据库中进行语句查询。

然后大家都返回到sqlhelper中的一个带参数查询的方法。

相关文章
|
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分钟上手