精华内容
下载资源
问答
  • c#三层架构
    2022-02-18 09:10:24

    为什么需要三层结构?

    1.操作数据库的代码与界面代码混合在一起的话,一旦数据库发生哪怕是一点细微变化(例如:字段名称改变),代码的改动量都是相当巨大的。

    2.当客户要求更换用户界面时(如要求改用IE浏览器方式访问系统),因为代码的混杂,改动工作也是非常巨大的。

    3.不利于协作开发,例如负责用户界面设计的工程师必须对美工,业务逻辑,数据库各方面只是都非常了解。

    什么是三层结构?

    三层结构中的三层是指:表示层,业务逻辑层,数据访问层。

    表示层:位于最外层,离用户最近,用于显示数据和接收用户输入的数据,为用户提供一种交互式操作界面。

    业务逻辑层:是表示层与数据访问层之间通信的桥梁,主要负责数据的传递和处理,例如数据有效性的检验、业务逻辑描述等相关功能。

    数据访问层: 主要实现对数据的保存和读取操作。数据访问,可以访问关系数据库,文本文件或是XML文档等,数据访问层通常成为类库。

    问题:业务逻辑层的主要职责是什么?

    解答:业务逻辑层是表示层和数据访问层之间的一座桥梁,具体职责如下:

    1.根据业务规则对数据进行加工和处理。

    2.与相邻的表示层和数据访问层进行数据交换。

    经验分享:

    1.三层结构中各层之间的依赖关系是表示层依赖业务逻辑层,业务逻辑层依赖于数据访问层。

    2.表示层只允许引用业务逻辑层,不允许直接应用数据访问层。

    3.各层项目间不允许循环引用。

    更多相关内容
  • C#三层架构代码生成器
  • C#三层架构框架源代码
  • Codematic 是一款为 C# 数据库程序员设计的自动代码生成器,Codematic 生成的代码基于基于面向对象的思想和三层架构设计,结合了Petshop中经典的思想和设计模式,融入了工厂模式,反射机制等等一些思想。采用 Model ...
  • c#三层架构设计源码

    2018-06-28 09:27:32
    c#三层设计源码,刚入门的可以看一下设计理念,结构清晰
  • c#三层架构

    万次阅读 多人点赞 2019-07-04 16:11:49
    最近公司需要用c#,就简单看了一下三层架构三层架构(3-tier architecture) 通常意义上的三层架构就是将整个业务应用划分为:界面层(User Interface layer)、业务逻辑层(Business Logic Layer)、数据访问层(Data ...

    最近公司需要用c#,就简单看了一下三层架构。

    三层架构(3-tier architecture) 通常意义上的三层架构就是将整个业务应用划分为:界面层(User Interface layer)、业务逻辑层(Business Logic Layer)、数据访问层(Data access layer)。
    UI层:即表示层,就是展现给用户看到的界面
    BLL:即业务逻辑层,就是实现功能的,用来写方法及其调用
    DAL:即数据访问层,也就是说,是对数据库的操作。主要是存放对数据类的访问,即对数据库的添加、删除、修改、更新等基本操作
    model(模型层)作为承载数据的媒介

    简单的案例介绍

    建立数据表,主要存放登录的用户名和密码!
    表
    在App.config中配置数据库连接信息。

    <?xml version="1.0" encoding="utf-8" ?>
    <configuration>
        <startup> 
            <supportedRuntime version="v4.0" sku=".NETFramework,Version=v4.5" />
        </startup>
      <connectionStrings>
        <add name="Conn" connectionString="Data Source=数据库名;Initial Catalog=;user id=登录数据库用户名;Password=登陆密码"/>
      </connectionStrings>
    </configuration>
    
    //另一种连接方法
    <appSettings>
    <add key="conn" value="server=服务器名;database=数据库名;uid=用户名;password=密码;"/>
    </appSettings>
    

    DAL层(与数据库的交互)

    建立SQLhelper帮助类:用于操作数据库,别人写好的,会用就行!
    SQLhelper帮助类

    using System;
    using System.Data;
    using System.Collections;
    using System.Configuration; //记得这个asp默认没引用,你要去添加引用的程序集里引用进来
    using System.Linq;
    using System.Web;
    using System.Xml.Linq;
    using System.Data.SqlClient;
    using System.Collections.Generic;
    
    namespace UMS.DbHelper
    {
        /// <summary>
        /// SQL数据库操作类
        /// </summary>
        public class SQLHelper
        {
            private string strConn;
            private SqlConnection sqlConn = null;
    
            public SQLHelper()
            {
                strConn = ConfigurationManager.ConnectionStrings["UserData"].ConnectionString;
                sqlConn = new SqlConnection(strConn);
           
            }
    
            /// <summary>
            /// 打开数据库连接
            /// </summary>
            private void OpenConn()
            {
                if (sqlConn != null && sqlConn.State == ConnectionState.Closed)
                {
                    sqlConn.Open();
                }
            }
    
            /// <summary>
            /// 关闭数据库连接
            /// </summary>
            private void CloseConn()
            {
                if (sqlConn != null && sqlConn.State == ConnectionState.Open)
                {
                    sqlConn.Close();
                }
            }
            /// <summary>
            /// 构造操作命令
            /// </summary>
            /// <param name="cmdText">带参命令</param>
            /// <param name="param">参数数组</param>
            /// <param name="values">参数值数组</param>
            /// <returns></returns>
            private SqlCommand CreateCommand(string cmdText, string[] param, object [] values)
            {
                SqlCommand myCmd = new SqlCommand(cmdText,sqlConn);
                for (int i = 0; i < param.Length; i++)
                {
                    myCmd.Parameters.AddWithValue(param[i],values[i]);
                }
                return myCmd;
            }
            /// <summary>
            /// 根据SQL指令返回相应查询阅读器,在阅读器使用完后请及时关闭
            /// </summary>
            /// <param name="cmdText">查询语句</param>
            /// <param name="param">参数列表,无参可设置为null</param>
            /// <param name="values">参数值列表,只有当参数不为空时有效</param>
            /// <returns></returns>
            public SqlDataReader ExecuteReader(string cmdText,string [] param,object [] values)
            {
                OpenConn();
                SqlCommand myCmd;
                if (param != null)
                {
                    myCmd = this.CreateCommand(cmdText, param, values);
                }
                else
                {
                    myCmd = new SqlCommand(cmdText,sqlConn);
                }
                return myCmd.ExecuteReader(CommandBehavior.CloseConnection);
            }
    
            /// <summary>
            /// 根据存储过程返回相应查询阅读器,在阅读器使用完后请及时关闭
            /// </summary>
            /// <param name="cmdText">存储过程名</param>
            /// <param name="parms">参数列表</param>
            /// <returns></returns>
            public SqlDataReader ExecuteReaderBySP(string cmdText, SqlParameter[] parms)
            {
                OpenConn();
                SqlCommand myCmd = new SqlCommand(cmdText, sqlConn);
                myCmd.CommandType = CommandType.StoredProcedure;
                if (parms != null)
                {
                    myCmd.Parameters.AddRange(parms);
                }
                return myCmd.ExecuteReader(CommandBehavior.CloseConnection);
            }
    
            /// <summary>
            /// 根据SQL指令返回受影响行数,主要用于数据库的更新、插入、删除等操作
            /// </summary>
            /// <param name="cmdText">sql命令语句</param>
            /// <param name="param">参数数组,若没有参数可以设置为空</param>
            /// <param name="values">参数值数组,只有当param不为空时有效</param>
            /// <returns></returns>
            public int ExecuteNoneQuery(string cmdText, string[] param, object[] values)
            {
                OpenConn();
                SqlCommand myCmd;
                if (param != null)
                {
                    myCmd = this.CreateCommand(cmdText, param, values);
                }
                else
                {
                    myCmd = new SqlCommand(cmdText,sqlConn);
                }
                try
                {
                    return myCmd.ExecuteNonQuery();
                }
                catch (Exception ex)
                {
                    throw ex;
                }
                finally
                {
                    CloseConn();
                }
            }
    
            /// <summary>
            /// 根据SQL指令返回第一行第一列结果
            /// </summary>
            /// <param name="cmdText">sql命令语句</param>
            /// <param name="param">参数数组,若没有参数可以设置为空</param>
            /// <param name="values">参数值数组,只有当param不为空时有效</param>
            /// <returns></returns>
            public object ExecuteScalar(string cmdText, string[] param, object[] values)
            {
                OpenConn();
                SqlCommand myCmd;
                if (param != null)
                {
                    myCmd = this.CreateCommand(cmdText, param, values);
                }
                else
                {
                    myCmd = new SqlCommand(cmdText,sqlConn);
                }
                try
                {
                    return myCmd.ExecuteScalar();
                }
                catch (Exception ex)
                {
                    throw ex;
                }
                finally
                {
                    CloseConn();
                }
            }
            /// <summary>
            /// 带事务执行存储过程,该方法主要用于执行用于数据维护类的存储过程执行
            /// </summary>
            /// <param name="cmdText">存储过程名称</param>
            /// <param name="parms">SQL参数数组</param>
            public int  ExecuteNoneQueryBySP(string cmdText, SqlParameter[] parms)
            {
                OpenConn();
                SqlTransaction tran = sqlConn.BeginTransaction();
                SqlCommand myCmd = new SqlCommand(cmdText, sqlConn);
                myCmd.CommandType = CommandType.StoredProcedure;
                if (parms != null)
                {
                    myCmd.Parameters.AddRange(parms);
                }
                myCmd.Transaction = tran;
                try
                {
                    int result=myCmd.ExecuteNonQuery();
                    tran.Commit();
                    return result;
                }
                catch (Exception ex)
                {
                    tran.Rollback();
                    throw ex;
                }
                finally
                {
                    CloseConn();
                }
            }
            /// <summary>
            /// 根据命令语句返回数据集
            /// </summary>
            /// <param name="cmdText">命令语句</param>
            /// <param name="param">参数数组,若没有参数可以设置为空</param>
            /// <param name="values">参数值数组,只有当param不为空时有效</param>
            /// <returns></returns>
            public DataSet FillDataSet(string cmdText, string[] param, object[] values)
            {
                OpenConn();
                SqlCommand myCmd;
                if (param != null)
                {
                    myCmd = this.CreateCommand(cmdText, param, values);
                }
                else
                {
                    myCmd = new SqlCommand(cmdText,sqlConn);
                }
                SqlDataAdapter myAdp = new SqlDataAdapter(myCmd);
                DataSet ds = new DataSet();
                try
                {
                    myAdp.Fill(ds);
                    return ds;
                }
                catch (Exception ex)
                {
                    throw ex;
                }
                finally
                {
                    CloseConn();
                }
            }
    
            /// <summary>
            /// 执行特定存储过程并返回查询后的数据结果,该方法用于执行查询类的存储过程
            /// </summary>
            /// <param name="cmdText">存储过程名</param>
            /// <param name="parms">SQL参数数组,若没有参数可以设置为空</param>
            /// <returns></returns>
            public DataSet FillDataSetBySP(string cmdText, SqlParameter[] parms)
            {
                OpenConn();
                SqlCommand myCmd = new SqlCommand(cmdText, sqlConn);
                myCmd.CommandType = CommandType.StoredProcedure;
                if (parms != null)
                {
                    myCmd.Parameters.AddRange(parms);
                }
                SqlDataAdapter myAdp = new SqlDataAdapter(myCmd);
                DataSet ds = new DataSet();
                try
                {
                    myAdp.Fill(ds);
                    return ds;
                }
                catch (Exception ex)
                {
                    throw ex;
                }
                finally
                {
                    CloseConn();
                }
            }
            /// <summary>
            /// 执行存储过程返回输出参数
            /// </summary>
            /// <param name="cmdText">存储过程名</param>
            /// <param name="parms">参数数组</param>
            /// <returns>包含所有输出值的ArrayList</returns>
            public ArrayList ExecuteSp(string cmdText, SqlParameter[] parms)
            {
                OpenConn();
                SqlCommand myCmd = new SqlCommand(cmdText, sqlConn);
                myCmd.CommandType = CommandType.StoredProcedure;
                if (parms != null)
                {
                    myCmd.Parameters.AddRange(parms);
                }
                try
                {
                    myCmd.ExecuteNonQuery();
                    ArrayList al = new ArrayList();
                    for (int i = 0; i < parms.Length; i++)
                    {
                        if (parms[i].Direction == ParameterDirection.Output)
                        {
                            al.Add(parms[i]);
                        }
                    }
                    return al;
                }
                catch (Exception ex)
                {
                    throw ex;
                }
                finally
                {
                    CloseConn();
                }
            }
    
            #region 批处理操作
            /// <summary>
            /// 批量数据导入操作
            /// </summary>
            /// <param name="dt">要批量导入的数据表</param>
            /// <param name="destTableName">目标表名</param>
            /// <param name="columnMappings">列映射集合</param>
            public void BulkInsert(DataTable dt, string destTableName, List<SqlBulkCopyColumnMapping> columnMappings)
            {
                SqlBulkCopy bulkCopy = new SqlBulkCopy(this.sqlConn);
                bulkCopy.DestinationTableName = destTableName;
                bulkCopy.BatchSize = dt.Rows.Count;
                foreach (SqlBulkCopyColumnMapping map in columnMappings)
                {
                    bulkCopy.ColumnMappings.Add(map);
                }
                try
                {
                    OpenConn();
                    bulkCopy.WriteToServer(dt);
                }
                catch (Exception ex)
                {
                    throw ex;
                }
                finally
                {
                    this.CloseConn();
                    bulkCopy.Close();
                }
            }
            #endregion
        }
    }
    

    建立DBbase类,用于连接数据库。

    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
    {
        class DBbase
        {
            //读取配置文件 连接数据库语句  
            public static string strCon = System.Configuration.ConfigurationManager.ConnectionStrings["Conn"].ConnectionString;
            SqlConnection con = new SqlConnection(strCon);
    
            //检测连接是否打开  
            public void chkConnection()
            {
                if (this.con.State == ConnectionState.Closed)
                {
                    this.con.Open();
                }
            }
    
            //执行语句,返回该语句查询的数据行的总行数  
            public int returnRowCount(string strSQL)
            {
                chkConnection();
                try
                {
                    SqlDataAdapter da = new SqlDataAdapter(strSQL, con);
                    DataSet ds = new DataSet();
                    da.Fill(ds);
                    return ds.Tables[0].Rows.Count;
                }
                catch
                {
                    return 0;
                }
            }
        }
    }
    

    建立userDAL类,用于写操作数据的功能的方法(登录,增删改查等)。
    userDAL类:

    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
    {
        class DBbase
        {
            //读取配置文件 连接数据库语句  
            public static string strCon = System.Configuration.ConfigurationManager.ConnectionStrings["Connect_MainDb"].ConnectionString;
    
            //实例化连接对象 con  
            SqlConnection con = new SqlConnection(strCon);
    
            //检测连接是否打开  
            public void chkConnection()
            {
                if (this.con.State == ConnectionState.Closed)
                {
                    this.con.Open();
                }
            }
    
            //执行语句,返回该语句查询的数据行的总行数  
            public int returnRowCount(string strSQL)
            {
                chkConnection();
                try
                {
                    SqlDataAdapter da = new SqlDataAdapter(strSQL, con);
                    DataSet ds = new DataSet();
                    da.Fill(ds);
                    return ds.Tables[0].Rows.Count;
                }
                catch
                {
                    return 0;
                }
            }
        }
    }
    

    Model层:model层其实就相当于一个中转站,用来存储用到的数据,贯穿三层,数据的赋值及提取。
    建立userInfo类。

    //用get,set方法,主要用于数据的赋值及提取,操作数据!
    using System;
    using System.Collections.Generic;
    using System.Linq;
    using System.Text;
    using System.Threading.Tasks;
    
    namespace Model
    {
        public class userInfo
        {
            public string username { get; set; }
            public string password { get; set; }
        }
    }
    

    BLL层:业务逻辑,与客户端交互,主要写客户端用到的方法。
    建立userBLL类:引用DAL和Model

    using System;
    using System.Collections.Generic;
    using System.Linq;
    using System.Text;
    using System.Threading.Tasks;
    
    namespace BLL
    {
        public class userBLL
        {
            DAL.userDAL d_userAccess = new DAL.userDAL();
            //登录的方法
            public int userLogin(Model.userInfo m_userInfo)//model层的值传过来
            {
            	//通过DAL层从数据中取出数据,与Model层的数据对比,返回行数,若存在返回值,则匹配成功
                return d_userAccess.userLogin(m_userInfo.username, m_userInfo.password);//如果有返回值则登录成功
            }
        }
    }
    

    UI层:主要为前台界面

    建立Windows窗体,用户登录界面为:
    在这里插入图片描述
    用户名:textbox1;密码:textbox2 登录:botton
    具体实现为:

    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 Emms
    {
        public partial class 登录界面 : Form
        {
            public 登录界面()
            {
                InitializeComponent();
            }
            //实例化model层中 userInfo类用于传递数据  
            Model.userInfo m_userInfo = new Model.userInfo();
    
            //实例化BLL层中 userAccess方法衔接用户输入与数据库匹配  
            BLL.userBLL b_userAccess = new BLL.userBLL();
    
            private void button1_Click(object sender, EventArgs e)
            {
                //获取username和password数据  
                    m_userInfo.username = textBox1.Text.Trim().ToString();
                    m_userInfo.password = textBox2.Text.Trim().ToString();
    
                    //useLogin调用返回记录条数 大于1 则账号密码正确  
                    if (b_userAccess.userLogin(m_userInfo) > 0)
                    {
                        MessageBox.Show("登录成功");
                    }
                    else
                    {
                        MessageBox.Show("登录失败");
                    }
            }
        }
    }
    

    至此案例便完成了,主要为UI层调用BLL层的方法,BLL层再通过DAL层获取数据,如有错误,欢迎大佬指正~
    运行界面为:
    在这里插入图片描述
    目录结构为:
    在这里插入图片描述

    展开全文
  • C#本科期末大作业MVC三层架构亮灯的仓库管理系统源码。MVC+MYSQL+EasyuiC#本科期末大作业MVC三层架构亮灯的仓库管理系统源码。MVC+MYSQL+EasyuiC#本科期末大作业MVC三层架构亮灯的仓库管理系统源码。MVC+MYSQL+...
  • 内容索引:C#源码,数据库应用,三层 C#三层架构实例图书商城系统,VS2005环境,数据库SQL2005,学习C#三层架构的好例子,因程序中商品太多,占用较大空间,因此删除了一些,这不影响你了解三层架构的原理和程序运行。
  • C# 三层架构

    2021-09-05 20:31:12
    # 三层架构 ## 1.哪三层? **UI(表现层):** 主要是指与用户交互的界面。用于接收用户输入的数据和显示处理后用户需要的数据。涉及到*界面控件*; **BLL:(业务逻辑层):** UI层和DAL层之间的桥梁。实现业务逻辑。...

    三层架构 

    1.哪三层?

    UI(表现层): 主要是指与用户交互的界面。用于接收用户输入的数据和显示处理后用户需要的数据。涉及到*界面控件*;

    BLL:(业务逻辑层): UI层和DAL层之间的桥梁。实现业务逻辑。业务逻辑具体包含:验证、计算、业务规则等等。*bll层负责数据处理、传递*。

    DAL:(数据访问层): 与数据库打交道。主要实现对数据的增、删、改、查。涉及到数据库语句和ado.net;

     

    将三层联系起来需要另外一个层

    实体层(Entity)(model)

    Entity(实体层)它不属于三层中的任何一层,但是它是必不可少的一层。

     将每个数据表作为一个实体类,实体类封装的属性对应到表中的字段,这样的话,实体在贯穿于三层之间时,就可以实现增删改查数据了。

    1. 实体类贯穿于三层之间;

    2. 通过传参、方法调用来实现功能;*

    3. 各层之间各负其责;互不影响*

     

    注意:

    ui层拥有各种窗体,调用bll层的方法,需要添加引用,bll层和实体层引用。

    bll层调用dal的方法。需要添加引用,dal层和实体层引用。

    dal层需要添加引用,实体层引用。

    根据功能将相应的工具类放在相应的层。

    如下 :

     

     

    最后效果图:

     

    展开全文
  • 人事管理,采用三层架构,应付期末答辩
  • 餐厅点餐管理系统.zip,餐厅点餐管理系统,.gitattributes,必读.txt,...D:\桌面\工作学习\微项目\C#\171164069韦帅帅 点菜系统\171164069韦帅帅_餐厅点餐系统\SystemMenuWsUI\obj\Debug\SystemMenuWsUI.sjfm.
  • 基于c#三层架构 图书管理系统 欢迎交流 ~~~~~~~~~~~
  • 三层架构实例,请大家查看 三层架构实例,请大家查看
  • 任务3-1 :三层架构划分 ? 任务3-2 :数据访问层的实现 ? 任务3-3 :业务逻辑层的实现 ? 任务3-4 :表示层的实现 本模块学习目标 ? 1掌握三层架构的划分原理 ? 2掌握各层的设计思路和层之间的调用关系 ? 3利用三层架构...
  • 本系统为C#编制的B/S页面的超市管理系统,内容比较全面,主要应用了三层架构,JavaScript、css等常用编程技术完成,对学习C#网页编程具有较好的借鉴和帮助。数据库文件见关注我的另一资源。
  • 完整的.NET三层架构开发项目,包含sqlserver数据库文件,值得好好学习。
  • 自己项目中正在使用的C#三层架构源码很标准含数据库\C#三层架构很标准含数据库,新手也能看明白。拿来直接运用到项目中。
  • C#开发的三层结构酒店管理系统 @ 用C#开发的三层结构酒店管理系统 @ 用C#开发的三层结构酒店管理系统 @ 用C#开发的三层结构酒店管理系统 @
  • 快速生成C# SQL server三层架构代码,项目源码,可自行修改
  • 本管理信息系统采用的是C#三层架构进行开发,(BLL,DAL,UI)数据库采用的是微软的SQL server 2005。文件内包括通讯录管理信息系统设计,数据库设计,均为成品!
  • 使用VS2008+sql2005开发
  • c#三层架构 ATM项目(包含数据库)
  • C# 三层架构实例 教你学会三层 很简单明了的一个实例,让你轻松搞定C#三层
  • 01.UI使用控制台应用程序,其它均使用类库,如EMS.BLL、EMS.DAL和EMS.Models等 02.通过引用的方式加入各个之间的依赖关系: UI 依赖 BLL 和Models BLL 依赖 DAL 和Models DAL 依赖 Models Model 无依赖 03...
  • C# 三层架构以及数据库之间的简单应用,是适用于初级学习者
  • C#三层架构自动生成工具源码,可以根据数据库自动生成三层架构。

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 79,222
精华内容 31,688
关键字:

c#三层架构

友情链接: 圣诞树和烟花.zip