暂无图片
暂无图片
暂无图片
暂无图片
暂无图片

C#知识|使用分层的思想实现数据存储入库(实例)

雷工笔记 2024-04-01
77

因公众号更改推送规则,请点“在看”并加“星标”

第一时间获取精彩分享

哈喽,你好啊,我是雷工!

面向对象编程的思想学习需要学习面向对象的一系列原则、方法、技巧、设计模式、框架、以及项目开发经验等。

编程目标为了使程序能够具有高性能、高可扩展性、高维护性。

01 为什么要分层开发

1.1、不分层的代码后台数据访问的代码和UI数据展示的代码是混编在一起的,这样的编程方式不利于团队协作编程,而且后期维护极不方便。

1.2、不分层的代码也不够优雅,程序各个功能全部耦合在一起,也不符合面向对象编程,高内聚低耦合的做法。

02 分层划分

分层划分通常按照任务职责,如果开发数据库应用程序,还会有一些类的划分。

2.1、UI层:用来和用户交互,给用户展示数据、获取用户数据。

2.2、数据访问层:用来封装数据库操作的各种方法。

数据访问层一般包含如下访问类:

1>通用的数据访问类SQLHelper;

2>封装各种数据访问方法,通用的一般数据访问类。

03 案例演示

通过简单的案例实现分层,分离数据,

3.1、UI层

Program.cs代码:

    //引入需要的命名空间
    using System.Data.SqlClient;
    using System.Data;
    namespace LeiGongNotes2
    {
        internal class Program
        {
            static void Main(string[] args)
            {
                Console.WriteLine("欢迎大家关注【雷工笔记】!");
                Console.WriteLine("--------------------------");
                AddCourse();
                Console.ReadLine();
            }
            #region 使用一般数据访问类分离数据操作
            public static void AddCourse()
            {
                //可以通过窗体界面或者web界面获取输入数据
                //<1>获取界面输入的信息:界面输入的每一项数据,保存到一个局部变量中
                Console.WriteLine("输入账号名称:");//模拟界面提示输入
                string accountName = Console.ReadLine();//模拟界面输入
                //只选取账号名称演示输入,下方3个直接赋值替代模拟输入
                string accountContent = "分享数据库知识|C#知识|上位机知识|组态软件|触摸屏|数字孪生|人生感悟";
                int originality = 214;
                int TypeId = 12;
                //<2>调用后台数据访问方法
                int result = new CourseService().AddCourse(accountName, accountContent, originality, TypeId);
                //<3>显示操作结果
                Console.WriteLine("执行受影响行数="+result);
            }
            #endregion
        }
    }

    3.2、一般数据访问类

    CourseService.cs类的代码如下:

      namespace LeiGongNotes2
      {
          /// <summary>
          /// 账号数据访问类
          /// </summary>
          public class CourseService
          {
              public int AddCourse(string accountName, string accountContent, int originality, int TypeId)
              {
                  //定义SQL语句
                  string sql = "insert into Account(AccountName,AccountContent,originality,TypeId)";
                  sql += $" values('{accountName}','{accountContent}',{originality},{TypeId})";
                  //执行SQL语句
                 return SQLHelper.Update(sql);
              }
          }
      }

      3.3、通用数据访问类

        //同样引用用
        using System.Data;
        using System.Data.SqlClient;
        using System.Configuration;
        namespace LeiGongNotes2
        {
            /// <summary>
            /// 通用数据访问类
            /// </summary>
            public class SQLHelper
            {
                private static string connString = ConfigurationManager.ConnectionStrings["connString"].ToString();
                /// <summary>
                /// 执行增删改操作的方法
                /// </summary>
                /// <param name="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)
                    {
                        //此处可以捕获ex对象相关信息,然后保存到日志文件中
                        throw new Exception("执行Update发生异常:" + ex.Message);
                    }
                    finally //此处为无论是否发生异常都要执行的代码
                    {
                        conn.Close();
                    }
                }
            }
        }

        3.4、代码运行效果:

        04 案例分析

        从上边小案例可以看出,数据传递的顺序,

        从UI层到一般数据访问类再到通用数据访问类;

        通过案例可以看出分层编程有如下好处:

        1>UI层无法看出数据会存储到哪里,这点非常符合我们前面说的“高内聚低耦合”。

        2>数据访问类,更不用关心数据从哪里来!让各层职责更加明确。

        3>UI和数据访问类之间达到解耦的目的,便于后续项目的扩展。

        例如想将案例中的SQLServer数据库更换为MySQL数据库,只需要更改通用数据访问类的内容,UI层不需要改变;

        05 后记

        接下来学习实体类在数据传递中的作用来解决多参数传递易出错问题。

        有感兴趣的小伙伴可以点关注+点赞+转发,我们一起日拱一卒。

        -更多内容可点击下方标签阅读-

        投票选出你感兴趣的交流群

        KingFusion合集|MCGS昆仑通态|数据库

        差旅游记|JavaScript|C#相关

        数字孪生|山海鲸可视化|☞C#2024

        KingSCADA|KingIOServer

        文章转载自雷工笔记,如果涉嫌侵权,请发送邮件至:contact@modb.pro进行举报,并提供相关证据,一经查实,墨天轮将立刻删除相关内容。

        评论