精华内容
下载资源
问答
  • C# WinForm项目三层架构简述

    千次阅读 2019-01-22 10:15:04
    基于C#.NET的WinForm项目,我们经常使用基于三层架构,来构建项目框架,这里简单的梳理一下三层架构的相关知识 哪三层? 我们通常所说的三层框架指的是DAL、BIL和UIL三层,分别是数据层、业务逻辑层和界面层,...

    基于C#.NET的WinForm项目,我们经常使用基于三层架构,来构建项目框架,这里简单的梳理一下三层架构的相关知识

    哪三层?


    我们通常所说的三层框架指的是DAL、BIL和UIL三层,分别是数据层、业务逻辑层和界面层,以及与之搭配的实体类和通用类库,下面分别概述

     

    实体类- Model

    • 我们将数据存放在数据库中,数据表的结构,我们通常会用一个类来抽象,表的属性就是类的属性,我们通常将表的一行存储在一个类中。我们在Java中,通常将其称为实体类Entity,在C#中,我们通常将其称为Model。
    • 如图,我们定义了一个数据表,表结构如下

       

      表结构

    • 我们根据表的信息,创建了如下的实体类
    namespace mtWeightModel
    {
        [Serializable] //表示可以序列化
        public class User
        {
            public int Id { get; set; }
            public String username { get; set; }
            public String password { get; set; }
            public int status { get; set; }
        }
    }
    
    • 我们可以看到,在SQLServer数据库中,char varchar nchar nvarchar都用String类型,int就对应Int。
    • Model类库一般来说需要被DAL、BIL和UI引用。

    DAL-数据访问层 - DataAccessLayer

    • 数据访问层,就是调用我们数据库访问方法,专注于数据的增删改查操作,构建SQL语句,构建参数等,以下是一个典型DAL方法
    namespace mtWeightDAL
    {
        /// <summary>
        /// 用户访问数据类
        /// </summary>
        public class UserService
        {
            /// <summary>
            /// 根据账号和密码比对用户信息
            /// </summary>
            /// <param name="objUser">包含用户名和密码的用户对象</param>
            /// <returns>返回用户对象信息(若无用户信息则对象为null)</returns>
            public User UserLogin(User objUser) {
                String sql = "SELECT Id,username,password,status FROM Users where username=@username and password=@password";
                SqlParameter[] param = new SqlParameter[] {
                    new SqlParameter("@username",objUser.username),
                    new SqlParameter("@password", objUser.password)
                };
                SqlDataReader objReader = SqlHelper.getReader(sql, param);
                if (objReader.Read())
                {
                    objUser.Id = Convert.ToInt32(objReader["Id"]);
                    objUser.status = Convert.ToInt32(objReader["status"]);
                }
                else {
                    objUser = null;
                }
                objReader.Close();
                return objUser;
            }
        }
    }
    
    • 这里用到了一个SqlHelper类,使我们后面要单独说的数据库帮助类
    • DAL就是根据业务需求,构建SQL语句,构建参数,调用帮助类,获取结果,DAL层被BIL层调用

    BLL-业务逻辑层 - Business Logic Layer

    • BLL层索要负责的,就是处理业务逻辑上的问题,比如在调用数据库访问之前,对数据的处理、判断等。下面是一个最简单的业务逻辑方法,不处理任何信息,只做参数传递。
    namespace mtWeightBLL
    {
        /// <summary>
        /// 用户业务逻辑类
        /// </summary>
        public class UserManager
        {
            //创建数据访问对象
            private UserService objUserService = new UserService();
    
            public User UserLogin(User objUser) {
                return objUserService.UserLogin(objUser);
            }
        }
    }
    
    • 那你可能就会有疑问,为什么不把业务逻辑和数据访问合在一起呢,偏要搞出两个层,不是多此一举么。那其实呢,我们分层解决问题的意义就是,功能专一,并且解耦我们的程序,我们在DAL层只关心我的数据库访问操作,我默认你给我的数据是合法的、正确的,那至于你如何保证数据的合法性和正确性就是你需要在BLL层里去做的了。
    • BLL层只被UIL层引用

    UIL-用户表现层

    • 就是窗体Form
    • 这里有一个click事件
    private void btnLogin_Click(object sender, EventArgs e)
            {
                //数据验证
                if (this.txtUsername.Text.Trim().Length == 0) {
                    MessageBox.Show("请输入用户名", "登录提示");
                    this.txtUsername.Focus();
                }
                if (this.txtPassword.Text.Trim().Length == 0)
                {
                    MessageBox.Show("请输入密码", "登录提示");
                    this.txtPassword.Focus();
                }
    
                // 封装对象
                User objUser = new User {
                    username = this.txtUsername.Text.Trim(),
                    password = this.txtPassword.Text.Trim()
                };
                try
                {
                    objUser = objUserManager.UserLogin(objUser);
                    if (objUser != null)
                    {
                        if (objUser.status == 1)
                        {
                            Program.objCurrentUser = objUser;
                            this.DialogResult = DialogResult.OK;
                            this.Close();
                        }
                        else
                        {
                            MessageBox.Show("用户被禁用,请联系管理员", "登录提示");
                        }
                    }
                    else {
                        MessageBox.Show("用户名或密码错误!", "登录提示");
                    }
                }
                catch (Exception ex)
                {
                    MessageBox.Show("登录异常:"+ex.Message,"登录提示");
                }
            }
    

    通用类库

    • 对于一些程序中用到的其他封装的类库,可以统一放在这里,比如一些第三方类库等

    引用关系


    引用关系图

    数据库帮助类


    • 我们可以用过封装ADO.NET形成自己的一套方法,但是我们知道在ADO.NET中,SQLServer、Access、Mysql和Oracle使用的是不同的类,那么我们可能需要对每一个数据库封装一套帮助类。其中常用的方法包括非查询类方法(两个重载[sql],[sql,参数])和查询类方法(两个重载[sql],[sql,参数]),事务类方法、存储过程类方法等。
    • 我们通常为会先规定一个接口,然后在帮助类中实现结构。这样后期可以通过反射或工厂的方式来实现不同数据库的切换(后面另说)。
    • 下面是我定义的一个简单的数据库帮助类
    using System;
    using System.Collections.Generic;
    using System.Linq;
    using System.Text;
    using System.Threading.Tasks;
    using System.Configuration;
    using System.Data;
    using System.Data.SqlClient;
    
    namespace DbUtil
    {
        public class SqlHelper
        {
            private static String ConnString = ConfigurationManager.ConnectionStrings["ConnString"].ToString();
            #region 格式化SQL语句
            /// <summary>
            /// 增删改非查询类方法
            /// </summary>
            /// <param name="sql">SQL语句</param>
            /// <returns></returns>
            public static int UPDATE(string sql) {
                SqlConnection conn = new SqlConnection(ConnString);
                SqlCommand cmd = new SqlCommand(sql, conn);
                try
                {
                    conn.Open();
                    return cmd.ExecuteNonQuery();
                }
                catch (Exception ex)
                {
                    throw new Exception(ex.Message);
                }
                finally {
                    conn.Close();
                }
            }
            /// <summary>
            /// 返回单条结果查询类方法
            /// </summary>
            /// <param name="sql">SQL语句</param>
            /// <returns></returns>
            public static object getSingleResult(string sql)
            {
                SqlConnection conn = new SqlConnection(ConnString);
                SqlCommand cmd = new SqlCommand(sql, conn);
                try
                {
                    conn.Open();
                    return cmd.ExecuteScalar();
                }
                catch (Exception ex)
                {
    
                    throw new Exception(ex.Message);
                }
                finally
                {
                    conn.Close();
                }
            }
            /// <summary>
            /// 多条结果查询类方法
            /// </summary>
            /// <param name="sql">SQL语句</param>
            /// <returns></returns>
            public static SqlDataReader getReader(string sql)
            {
                SqlConnection conn = new SqlConnection(ConnString);
                SqlCommand cmd = new SqlCommand(sql, conn);
                try
                {
                    conn.Open();
                    return cmd.ExecuteReader(CommandBehavior.CloseConnection);
                }
                catch (Exception ex)
                {
                    conn.Close();
                    throw new Exception(ex.Message);
                }
              
            }
            /// <summary>
            /// 返回DataSet数据集方法
            /// </summary>
            /// <param name="sql">SQL语句</param>
            /// <returns>结果集DataSet</returns>
            public static DataSet getDataSet(string sql)
            {
                SqlConnection conn = new SqlConnection(ConnString);
                SqlCommand cmd = new SqlCommand(sql, conn);
                SqlDataAdapter adapter = new SqlDataAdapter(cmd);
                DataSet ds = new DataSet();
                try
                {
                    conn.Open();
                    adapter.Fill(ds);
                    return ds;
                }
                catch (Exception ex)
                {
    
                    throw new Exception(ex.Message);
                }
                finally {
                    conn.Close();
                }
    
            }
            #endregion
    
            #region 带参数SQL语句
            /// <summary>
            /// 增删改非查询类方法
            /// </summary>
            /// <param name="sql">SQL语句</param>
            /// <param name="param">SQl参数</param>
            /// <returns></returns>
            public static int UPDATE(string sql,SqlParameter[] param)
            {
                SqlConnection conn = new SqlConnection(ConnString);
                SqlCommand cmd = new SqlCommand(sql, conn);
                try
                {
                    conn.Open();
                    cmd.Parameters.AddRange(param);
                    return cmd.ExecuteNonQuery();
                }
                catch (Exception ex)
                {
                    throw new Exception(ex.Message);
                }
                finally
                {
                    conn.Close();
                }
            }
            /// <summary>
            /// 返回单条结果查询类方法
            /// </summary>
            /// <param name="sql">SQL语句</param>
            /// <param name="param">SQL参数</param>
            /// <returns></returns>
            public static object getSingleResult(string sql, SqlParameter[] param)
            {
                SqlConnection conn = new SqlConnection(ConnString);
                SqlCommand cmd = new SqlCommand(sql, conn);
                try
                {
                    conn.Open();
                    cmd.Parameters.AddRange(param);
                    return cmd.ExecuteScalar();
                }
                catch (Exception ex)
                {
    
                    throw new Exception(ex.Message);
                }
                finally
                {
                    conn.Close();
                }
            }
            /// <summary>
            /// 多条结果查询类方法
            /// </summary>
            /// <param name="sql">SQL语句</param>
            /// <param name="param">SQL参数</param>
            /// <returns></returns>
            public static SqlDataReader getReader(string sql,SqlParameter[] param)
            {
                SqlConnection conn = new SqlConnection(ConnString);
                SqlCommand cmd = new SqlCommand(sql, conn);
                try
                {
                    conn.Open();
                    cmd.Parameters.AddRange(param);
                    return cmd.ExecuteReader(CommandBehavior.CloseConnection);
                }
                catch (Exception ex)
                {
                    conn.Close();
                    throw new Exception(ex.Message);
                }
            }
            #endregion
        }
    }
    
    

    项目创建

    • 首先创建解决方案的过程中,创建默认项目Windows窗体应用程序UIL
    • 然后分别在解决方案中添加类库项目DAL、BLL和CL(通用类库)和Model
    • 然后新建一个DBUtil类库,里面放SQLHeader类
    • 下面添加引用,从下网往上添加,先给DAL添加Model和DBHelper的引用,再为BLL添加DAL和Model的引用,再为UIL添加BLL和Model引用,然后在为需要使用通用类库的项目添加CL的引用。
    • 引用完成后:

       

       



     

    展开全文
  • winform的一个小项目,适合新手研究三层架构用途。内置数据库脚本。 制作条件:vs2010 sql server2008 R2
  • winform项目笔记:

    2017-10-07 11:28:00
    餐饮管理系统:三层架构模式。 Modal,bll,dal,UI,Common. 知识点: using语句释放的是非托管的资源。托管的资源会有CLR自动释放。 DataGridView控件: dataGridView1.AutoGenerateColumns = false; 把自动生成列...

    餐饮管理系统:三层架构模式。

    Modal,bll,dal,UI,Common.  

    知识点:     using语句释放的是非托管的资源。托管的资源会有CLR自动释放。

        DataGridView控件:      dataGridView1.AutoGenerateColumns = false; 把自动生成列关掉。

      事件其实也是一个方法,想要调用的时候,btnCancel_Click(null,null);

         删除的时候,判断是否删除的提示框:     DialogResult result= MessageBox.Show("确定要删除吗","提示",MessageBoxButtons.OKCancel);    

             if (result==DialogResult.OK)     

            {        

             MessageBox.Show("可以删除了");    

             }       

     winform中 : 后台加载中使用 this.textBox1.PasswordChar = '搜索*'; 或者你可以直接设置其属性PasswordChar的值为*   

             如果你是使用的服务器控件那么 就设置 textbox的textmode=“password”就好了即:             <asp:TextBox ID="TextBox1" runat="server" TextMode="Password"></asp:TextBox>

             如果是html的就用:          如<input type="password" value="你将要填写的值" />   

          winform中的,从主窗体打开子窗体,如果把主窗体关闭掉,那么从它的子窗体也都关闭了。所以要用this.Visible=false;不要直接用this.Close();

       我们可以通过窗体的Tag属性进行窗体间的数据传递。

           private void button1_Click(object sender, EventArgs e)  

           {      

           MainForm mainf = new MainForm();   

            mainf.Tag = 2;        

      mainf.Show();  

            this.Visible = false;   

          }   

        private void MainForm_Load(object sender, EventArgs e)   

          {      

           if (this.Tag.ToString() == "1")         

        {            

         MessageBox.Show("父窗体传递过来了");   

              }        

    }        

        窗体间传值:窗体的Tag属性。      

         引用NPOI程序集:Excel的导入导出功能。

      .net中的非托管资源是需要手动释放的。

    比如说创建文件,并保存到硬盘里,这里保存完就需要   Dispose()。

      FileStrea  file=new FileStream(@"C:\Users\ql\Desktop\b.xls",FileMode.CreateNew,FileAccess.Write);    

      workbook.Write(file);  

     file.Dispose();        

    子窗体想改变父窗体里的变量,用事件去做。

    转载于:https://www.cnblogs.com/zhumeiming/p/7634387.html

    展开全文
  • winform三层架构之登录

    2018-11-28 22:56:51
    项目开发的过程中,有时把整个项目分为三层架构,其中包括:表示层(UI)、业务逻辑层(BLL)和数据访  问层(DAL)。三层的作用分别如下:    表示层: 为用户提供交互操作界面,这一点不论是对于Web还是WinForm都...

    一:三层构架的基础知识

    在项目开发的过程中,有时把整个项目分为三层架构,其中包括:表示层(UI)、业务逻辑层(BLL)和数据访 
    问层(DAL)。三层的作用分别如下: 
     

    表示层:

    为用户提供交互操作界面,这一点不论是对于Web还是WinForm都是如此,就是用户界面操作 
    。我们网站展示给用户看的界面。 
     

    业务逻辑层:

    负责关键业务的处理和数据的传递。复杂的逻辑判断和涉及到数据库的数据验证都需要在此 
    做出处理。根据传入的值返回用户想得到的值,或者处理相关的逻辑。 
     

    数据访问层:

    见名知意,负责数据库数据的访问。主要为业务逻辑层提供数据,根据传入的值来操作数据 
    库,增、删、改或者其它。 
     

    以下我简单介绍下一个用户管理模块:

     

      为了整个项目的开发方便,我们在项目中会建几个类库Common,BLL,DAL,Model。 
    为了命名清晰,我们可以这样命名这个三个工程(即在解决方案里添加的类库): 
     

    业务逻辑层(BusinessLogicLayer):BLL,命名空间默认设置为BLL

    数据访问层(DataAccessLayer):DAL,命名空间默认设置为DAL

     

    工具类:如:Common,命名空间默认设置为Common

     

      另外我们为了数据传递的方便,通常再添加一个类库,这个类库是贯穿于整个三层架构中的。即实体类。 
    通常命名为Model,命名空间默认值设置为:Models。其中封装的每个类都对应一个实体,通常就是数据库 
    中的一个表。如数据库中的用户表(custom)封装为(custom),将表中的每个字段都封装成共有的属 
    性。

    这样三层架构的搭建就基本完成了。这三层有着非常强的依赖关系: 
      表示层 ← 业务逻辑层 ← 数据访问层 
      他们之间的数据传递是双向的,并且通常借助实体类传递数据。 

      那么三层架构都有哪些优点呢:

     

    1、易于项目的修改和维护。

    在项目的开发过程中或者开发后的升级过程中,甚至在项目的移植过程中。 
    这种三层架构是非常方便的。比如项目从Web移植到Form,我们只需要将表示层重新做一遍就可以了。 
    其余两层不用改动,只需添加到现有项目就可以了。如果不采用这种架构,只是将代码写到表示层。那么 
    所有的编码几乎都要重新来了。 
     

    2、易于扩展。

    在功能的扩展上同样如此,如有功能的添加只需把原有的类库添加方法就可了 
     

    3、易于代码的重用。

    这一点就不用解释了。 
     

    4、易于分工协作开

     

    还可以加个接口类库Iinterface, 加入设计模式,使你的代码灵活性更好,质量更高。

    二:系统登录的例子

    a,整体

    2014-04-13_1139512014-04-12_182305

    b,OperationLogBLL.cs

    using System;
    using System.Collections.Generic;
    using System.Linq;
    using System.Text;
    using HRMSys.DAL;
     
    namespace HRMSys.BLL
    {
        /// <summary>
        /// 插入操作记录
        /// </summary>
        public class OperationLogBLL
        {
            OperationLogDAL dal = new OperationLogDAL();
            public void InsertOperationLog(Guid id, string name, string ActionDesc)
            {
                dal.InsertLog(id, name, ActionDesc);
            }
        }
    }
    

    c,OperatorBLL.cs

    using System;
    using System.Collections.Generic;
    using System.Linq;
    using System.Text;
    using HRMSys.DAL;
    using HRMSys.Model;
    using Common;
     
    namespace HRMSys.BLL.cs
    {
        public class OperatorBLL
        {
            OperatorDAL dal=new OperatorDAL();
            /// <summary>
            /// 得到指定name的operator的数据
            /// </summary>
            /// <param name="name"></param>
            /// <returns></returns>
            public Operator getOperatorByName(string name)
            {
                Operator op=new Operator();
                op=dal.loginUser(name);
                return op;
     
            }
            /// <summary>
            /// 密码错误超过三次,锁定登录者
            /// </summary>
            /// <param name="op"></param>
            public void updateOperator(Operator op)
            {
                dal.UpdateOperator(op);
            }
            /// <summary>
            /// 登录
            /// </summary>
            /// <returns></returns>
            public bool login(string name,int errorTime,string pwd,out string message,out Operator op)
            {
                bool r = false;
                if (name.Length <= 0)
                {
                    message = "请输入用户名";
                    op = null;
                    return r;
                }
                if (pwd.Length <= 0)
                {
                    message = "请输入用户名";
                    op = null;
                    return r;
                }
     
                if (errorTime>=3)
                {
                    message = "用户已被锁定";
                    op = null;
                    return r;
     
                }
                else
                {
                    op = dal.loginUser(name);
                    if (op == null)
                    {
                       
                       
                        message = "用户名不存在";
                    }
                    else
                    {
                        pwd = CommonHelper.GetMD5(pwd + CommonHelper.getPasswordSalt());
                        if (op.Password != pwd)
                        {
                            
                            message = "密码不正确";
                            op.IsLocked = true;
                            updateOperator(op);
                            return r;
                        }
                        else
                        {
                            if (op.IsLocked == true)
                                message = "用户被锁定";
                            else
                            {
                            r = true;
                            message = "登录成功";
                                }
     
                        }
                    }
                    return r;
                }
               
     
            }
            
        }
    }
    

    d,OperationLogDAL.cs

    using System;
    using System.Collections.Generic;
    using System.Linq;
    using System.Text;
    using HRMSys.Model;
    using System.Data;
    using System.Data.SqlClient;
     
    namespace HRMSys.DAL
    {
        public class OperationLogDAL
        {
           
            /// <summary>
            /// 插入一条操作记录
            /// </summary>
            /// <param name="OperatorId"></param>
            /// <param name="ActionDesc"></param>
            
            public void InsertLog(Guid OperatorId, string loginUser, string ActionDesc)
            {
                                                             
                sqlhelper.ExecuteNon(@"insert into T_OperationLog(Id,OperatorId,MakeDate,ActionDesc,LoginUser)
                values(newid(),@OperatorId,getdate(),@ActionDesc,@LoginUser)", new SqlParameter("@ActionDesc", ActionDesc),
                                                                             new SqlParameter("@OperatorId", OperatorId),
                                                                            new SqlParameter("@LoginUser", loginUser));//这里是values,不是value
     
            }
            
        }
    }
    

    e,OperatorDAL.cs

    using System;
    using System.Collections.Generic;
    using System.Linq;
    using System.Text;
    using HRMSys.Model;
    using System.Data.SqlClient;
    using System.Data;
     
    namespace HRMSys.DAL
    {
        public class OperatorDAL
        {
               
     
            /// <summary>
            /// 将表的形式转换为vs的形式,给对象
            /// </summary>
            /// <param name="row"></param>
            /// <returns></returns>
            private Operator ToOperator(DataRow row)
            {
                Operator op = new Operator();
                op.Id = (Guid)row["Id"];//不加就可以检查用户名是否重复了
                op.UserName = (string)row["UserName"];
                op.Password = (string)row["Password"];
                op.IsLocked = (bool)row["IsLocked"];
                op.IsDelete=(bool)row["IsDelete"];
                op.RealName = (string)row["RealName"];
                return op;
            }
            /// <summary>
            ///查询指定username的一条数据
            /// </summary>
            /// <param name="name"></param>
            /// <returns></returns>
            public Operator loginUser(string name)
            {
                   DataTable table = sqlhelper.datatable("select * from T_Operator where UserName=@UserName and IsDelete=0 and IsLocked=0",
                       new SqlParameter("@UserName", name));
                   if (table.Rows.Count <= 0)
                       return null;
     
                   else if (table.Rows.Count > 1)
                       throw new Exception("用户名重复");
                   else
                   {
                       DataRow row = table.Rows[0];
                      
     
                       return ToOperator(row);
                   }
            }
            /// <summary>
            /// 锁定管理员更新管理员表
            /// </summary>
            /// <param name="op"></param>
            public void UpdateOperator(Operator op)
            {
                sqlhelper.ExecuteNon("update T_Operator set IsLocked=@IsLocked  where Id=@Id",
                    new SqlParameter("@IsLocked", op.IsLocked),
                    new SqlParameter("@id",op.Id));
     
            }
           
        }
    }
    

    f,login.cs

    using System;
    using System.Collections.Generic;
    using System.ComponentModel;
    using System.Data;
    using System.Drawing;
    using System.Linq;
    using System.Text;
    using System.Windows.Forms;
    using HRMSys.Model;
    using HRMSys.BLL;
    using HRMSys.BLL.cs;
     
    namespace HYMSys.UI
    {
        public partial class login : Form
        {
            public login()
            {
                InitializeComponent();
            }
            int errorTime = 0;
            string message;
            Operator op;
            OperationLogBLL logbll = new OperationLogBLL();
            OperatorBLL bll = new OperatorBLL();
            /// <summary>
            /// 登录,并保存登录操作记录
            /// </summary>
            /// <param name="sender"></param>
            /// <param name="e"></param>
            private void button1_Click(object sender, EventArgs e)
            {
                 
                //返回是否登录成功的bool类型,并将提示信息和管理员对象返回
              bool result=  bll.login(tb_name.Text, errorTime, tb_pwd.Text, out message, out op);
              if (result == false)
              {
                  errorTime += 1;
                  MessageBox.Show(message);
                  
                  return;
              }
              else
              {
                  //插入一条操作记录
                  logbll.InsertOperationLog(op.Id, op.UserName, message);
                  MessageBox.Show(message);
     
              }
     
            }
            /// <summary>
            /// 取消
            /// </summary>
            /// <param name="sender"></param>
            /// <param name="e"></param>
            private void button2_Click(object sender, EventArgs e)
            {
                this.Close();
            }
        }
    }
    

     

    展开全文
  • 采用广为人知的简单三层DAL(DBUtility),BLL,UI层实现,习惯开发web的朋友一看就明白了。实现与数据数据交互,里面包含这多种功能,如多页面展示.页面数据跟数据交互进行数据的修改 ...迅速掌握三层架构的搭建和开发
  • Winform 三层架构小例子

    千次阅读 2011-06-20 11:16:00
    Winform 三层架构小例子 在web开发中常常用到工厂模式三层架构,现在也在Winform中应用这种架构方式,尝试了很多,也模仿了经典例子PetShop,但是还是不行,也参 考了网上的一些例子。现在把我这个例子的整个制作...

    Winform 三层架构小例子

        在web开发中常常用到工厂模式三层架构,现在也在Winform中应用这种架构方式,尝试了很多,也模仿了经典例子PetShop,但是还是不行,也参 考了网上的一些例子。现在把我这个例子的整个制作过程简单的介绍一下。(由于本例子是介绍三层结构,所以只是简单的应用,如果你觉得这种方式好,请自己实 现其他模块)
    结构:
    -------PMIS--------主程序代码
    表示层,负责应用程序的表现形式、用户体验等。
    -------DALFactory-----抽象工厂
    抽象工厂,用于创建各种数据对象的方法,这里有配置文件和反射的运用。
    -------IDAL--------数据接口层(控制是选择什么类型的数据库)
    数据操作接口,数据访问层实现其接口并重写它(体现了面向接口的编程思想)。
    -------BLL------
    处理应用程序的业务逻辑,被表示层调用。
    -------Model-------构造模型(对应数据库字段)
    Model程序集,存放实体类,用于数据访问层和逻辑层调用
    -------SQLServerDAL----SQLServer数据访问层
    数据访问层,实现具体的select、update、delete....操作,重写IDAL接口。
    -------DBUtility----公共数据访问层
    数据处理层,实现具体的ExecuteReader,ExecuteDataTable,ExecuteNonQuery等。
    -------Utility----公共层
    实现从配置文件中读取数据库联接字符串。
    1、数据库结构
    数据库名PMIS
    表Admin
        [ID] [bigint] 编号
        [Name] [varchar](10) 名称
        [PassWord] [varchar](100) 密码
        略......
    建表语句
    CREATE TABLE [dbo].[Admin](
        [ID] [bigint] IDENTITY(1,1) NOT NULL,
        [Name] [varchar](10) COLLATE Chinese_PRC_CI_AS NOT NULL,
        [PassWord] [varchar](100) COLLATE Chinese_PRC_CI_AS NOT NULL,
        [PurviewID] [int] NOT NULL,
        [Remember] [int] NULL,
        [AutoRun] [int] NULL,
        [DepartmentsID] [bigint] NULL,
     CONSTRAINT [PK_管理员_1] PRIMARY KEY CLUSTERED 
    (
        [ID] ASC
    ) ON [PRIMARY]
    ) ON [PRIMARY]
    2、接着建立数据库模型
    Model
     #region 内部成员字段
            private int _id;
            private string _Name;
            private string _Password;
            略...
    #endregion
    #region 方法
            public AdminInfo() { }

            public AdminInfo(string userName, string password)
            {
                this._Name = userName;
                this._Password = password;
            }
    #endregion
    3、建立DALFactory-----抽象工厂
    public static IDAL.IAdmin Create()
            {
                string path=System.Configuration.ConfigurationSettings.AppSettings["DAL"];
                string className="SQLServerDAL.Admin";

                IDAL.IAdmin acount=(IDAL.IAdmin)Assembly.Load(path).CreateInstance(className);
                return acount;
            }
    4、建立IDAL--------数据接口层
    public interface IAdmin
        {
            AdminInfo Login(string userName, string password);
            int Insert(AdminInfo account);
            int Update(AdminInfo account);
        }
    5、建立Utility----公共层
    public static string ConnectionString()
            {
                return (ConfigurationSettings.AppSettings["ConnectionString"]);
            }
    6、建立DBUtility----公共数据访问层和SQLServer数据访问层
    DBUtility中建立SQLHelper类
    SQLServerDAL的Admin类需要继承IAdmin
    public class Admin:IAdmin
        {}
    Admin类主要实现用户登陆功能
    7、建立业务逻辑曾BLL
    方法public static AdminInfo Login(string userName, string password){}
    8、为PMIS主程序添加应用程序配置文件app.config
    添加<appSettings>
        <add key="ConnectionString" value="server=.;uid=sa;pwd=;database=PMIS"></add>
        <add key="DAL" value="SQLServerDAL"></add>
      </appSettings>
    在主程序的窗体中添加控件,为按钮添加事件
    if (BLL.Admin.Login(参数) == null)
                {
                   //处理...
                }
                else
                {
                    //处理...
                }
    例子代码下载
    展开全文
  • 现在C#做winform项目的公司是用三层架构吗?还是直接在窗体文件里编码?
  • winform项目作为windows窗体应用,即windows应用程序,典型的C/S端,也就意味着,不能像Web的B/S端那样,只需要维护和发布服务端。C/S架构麻烦的地方,就在于程序的安装和更新。要包含dll和exe,但是又不想分成多个...
  • 笔者录了两个视频,打开项目源码地址,可以先看看视频了解项目界面。 学生选课管理系统 项目介绍 这是一个学生选课信息管理系统,使用VS2010+SQL2008编写。 在 VS2017+SQL2014打开、运行正常。 有...
  • 1、Winform数据访问模式定义 传统的Winform程序模块:用于传统的数据库通讯获取数据,这种方式获取数据,方便快捷,可以用于常规的业务系统的场景,用于单机版软件或者基于局域网内的业务系统软件。 WCF的...
  • 基于Winform三层架构+WCF+ORM模型的快速开发框架 Winform简介: WinForm是.Net开发平台中对Windows Form的一种称谓,Windows窗体可用于设计窗体和可视控件,以创建丰富的基于Windows的应用程序。 参考:...
  • 在 前一章介绍了YbRapidSolution for WinForm 代码生成插件的一些特性,本章将对其生成的 WinForm 项目的总体架构进行分享,同时将对各个层次组件的选择理由和特点进行简要分析,最后将提供 N-Tier 部署的 Demo 下载...
  • 最近在CSDN上看到有朋友求Winform的三层架构的示例,网上也确实没有多少是Winform的。于是本人牺牲一点时间,做了这个小Demo,希抛砖引玉,望各路老手不吝指教。 至于什么是“三层结构”、三层结构有什么好处、为...
  • 三次架构典范项目-图书管理系统(winform应用程序),附带sqlserver 2008数据库脚本。 个人分享,请勿作为商业用途!
  • 这8个Winform开源项目

    千次阅读 2020-10-22 16:03:46
    这8个Winform开源项目 属于WinForm的短暂时代早已结束,当今Web统治天下,那些上了一定年龄的.NETer 可能对这些开源项目还有印象! 1.WinHtmlEditor 一个非常不错的开源Winform下面的Html编辑器。包括的基本功能...
  • winform中使用三层架构学习总结

    千次阅读 2017-04-15 16:17:33
    Winform 三层架构小例子 http://www.cnblogs.com/jacky73/archive/2009/09/01/1558083.html 在web开发中常常用到工厂模式三层架构,现在也在Winform中应用这种架构方式,尝试了很多,也模仿了经典例子PetShop,...
  • 设计到很多以前没有深入接触过的东西,如GDI+,WinForm控件开发,插件架构,等等,很兴奋,正在努力中。 
  • 简单的通讯录项目(C#+winform+SQL2005数据库,适合菜鸟学习),可实现增删改查功能,新增了设置头像、更改透明度、点击显示与收起列表等功能!!! 呵呵,小弟小试牛刀,希望各位同僚多多指教!!
  • winform-项目文件结构

    2020-12-18 14:05:29
    Form1.cs 代表了两种模式: 界面设计(双击Form1.cs 进入窗体Form1)和逻辑代码(右击Form1.cs 选择代码表示) Form1.Designer.cs 作用:自动生成控件的...Program.cs默认是WinForm程序的主入口(即main()函数入口...
  • 本篇想作为我的《循序渐进开发WinForm项目》系列的开篇,主要介绍数据库设计方面注意的一些事项,从而方便项目框架的搭建和开发过程。 1、数据库表设计 俗话说万层高楼从底起,开发应用项目,数据库的设计很重要...
  • 在前面几篇随笔介绍了我对ABP框架的改造,包括对ABP总体的介绍,以及对各个业务分层的简化,Web API 客户端封装层的设计...本篇随笔是基于前面几篇的基础上,在Winform项目上进一步改造为实际项目的场景,把我原来基...
  • 1、需求分析: 表格设计: 表格设计方式: ...2、设计数据库工具(可以直接生成表): ...3、Sqlite是轻量级数据库...①每次项目添加类库、或者引入新的名空间,都要重新生成一下! ②只有变量首字母小写(驼峰)...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 7,927
精华内容 3,170
关键字:

winform项目架构