zoukankan      html  css  js  c++  java
  • C# .NET更智能的数据库操作封装项目

      前面两篇文章介绍了框架的思路及里面大概的实现过程,那时候忘记上传项目,就补发一下。顺便介绍下框架使用方式,并分析下框架使用的优缺点。

      先发一下前两章的链接

      篇一:http://www.cnblogs.com/jnxzk/p/6443192.html

      篇二:http://www.cnblogs.com/jnxzk/p/6493054.html

      进入正题:

      之前说了,一开始做的时候是为了方便数据库的访问,其实数据库的访问,最重要的就是sql语句。因此,我的框架并没有创造什么语法,使用风格是类似sql语法,因为我想,如果创造语法,那么使用的人还需要先学习怎么使用,而完全sql风格,那就不用说了,大家都学过了,一看明了的。

      并且为了更进一步封装方法,有点类似ORM框架,封装四个方法 Select,Update,Delete和Insert扩展方法,这个直接可以在模型对象上就可以点出来的方法,所以也比较方便。框架支持sql 和 mysql,其他的数据库需用户自己扩展。

      首先,是配置。使用框架需要配置。

      一:数据库使用都有配置文件,只要在配置文件加上connectionStrings,这个节点里存放一个是数据库名字,连接串和数据库类型。

      例:

    <add name="SQL" connectionString="Data Source=CN-20161106HMJI;Initial Catalog=ShopInfo;Integrated Security=True" providerName="SQL"/>

      这里要注意的是最前面的name和最后的数据库类型。

      因为框架支持多数据库,因此name是用来区分正使用哪个数据库的关键,并且在其他还会用到,下面再说。第二个是provideName,这是数据库类型,类型只能是静态类DBType中的静态字段,目前只有SQL和MySQL,这是用来区分数据库的。如果使用了配置,那在应用程序一开始执的行时候调用 Config.Start()方法即可。

      二:模型的类上,可以加上两个特性,Connection 与 OConnection。

        这两个特性就是为四个简便的扩展方法而用。Connection构造函数有一个参数,这个参数就是上边说到很重要的name。要跟你要将模型保存到哪个数据库,上边就填写哪个数据库的name。

        而OConnection是为了更智能性,用户可以通过配置,来一次性定义保存模型到哪个库中。这个配置文件配置在appsettings中。key用户自己命名,那value就是上边的数据库名name。使用这个配置后,在应用程序一开始时候加上Config.ConfigConnection(key);key就是你刚刚那个配置里的key里的值。

        模型类上使用其中的任意一种。

      三:这个是必须的,在模型里,作为主键的属性上边,加上PKey特性(如果一张表有多个,那么都加上),这个很显然的功能。

      四:异常的设置,如果执行阶段的发生的异常需要保存,那就写个无参无返回值的静态方法,使用DBException.AddEvent += 你的方法名   即可。

      上面对数据库的配置好处就是,如果数据库改变了,或是原本是mysq,现在升级成sql,那配置里修改即可,代码都不需要动。

    好了,配置完成了。来介绍下使用方式,按上边看,就知道了有两种使用方式。

      第一种较为简单,使用Select,Update,Delete和Insert扩展方法,都要先实例模型对象,然后在模型对象上使用方法。

      Select,Delete,Update使用的要求是主键要有值,这样才能找出你要操作是哪个是吧。Update不会更新主键部分;Insert就没什么要求,所有字段有值就可以。

      这几个方法都有一个可选参数,就是操作的字段(除了Delete)。在使用的地方要引用该类库。

      第二种方式:

      使用DBHelper,在使用后要调用dispose,或者using来释放空间。

      DBHelper里有几种最终执行的方法,比如执行影响行数,获取List,等等。这里最重要的是ExcuteString方法。

      DBHelper因为是链式的,因此有先后执行顺序,使用方法的顺序是:

      helper先调用Connection(string name)获取数据库(数据库name) 或者createConnection(string Name, string ConnectionString, string type) 创建数据库。

      其次就是先使用ExcuteString()

      最后是最后执行的操作,ToList,ToModel,ExcuteResult等等,在项目里有注释各个功能。

      ExcuteString需要解释下,这里面其实是拼接字符串,也同样是链式编程。使用格式如下:

      (Sleect | Delete | Insert | Update) + Form(可选参数,给视图,存储过程使用) +AndPKey(补充主键约束,如果是模型中的表,使用这个就可以了,如果多表那就使用AndMulTable,自动补充表间关联字段) + (where 条件 | or 条件 | where 不等 条件 | or 不等条件) + OrderBy(可选参数) + Top(可选参数)

      例子:

    helper.ExcuteString(o => o.Select<PlaceInfo>().AndNIn("SAddNo", o1 => o1.Select<PlaceInfo>().Top(5)).Top(5)).ToList<PlaceInfo>();

      支持嵌套查询,因此做最常用的分页也不是难事。上边这个是分页的操作,如果把两个top里面数值改成需要传的参数,就可以改造成任意的页了,项目中也写好了注释。

      好了,使用方式就到此为止,来分析下框架吧。

      首先,已经屏蔽掉所有底层的东西了。

      第二,因为里面大量的使用反射,时间消耗自然是很慢的,所以设置反射的缓存是必须的,不过缓存不是对数据,是在反射,还有搜索主键的地方,在使用久后,里面对各个模型类都已经有了缓存,使用就不会有问题了。

      第三,对多种数据库也只使用一套模型,如果是EF,那一套模型只对应一个数据库,如果下次更换数据库,那不是得重新的做。

      第四,扩展部分。之前文章里说过,框架是极大的支持开闭原则。因此,如果以后要扩展数据库,那只要再DBType里多增加一个你的字段比如 Oracle,然后底层的实现方法,新建三个实现IDBCode ,IDBExcute,IDBInstance接口的类,在三个类下实现那些方法。好了,这样就扩展了一个数据库。这时候如果要用这个数据库,只需要在配置处修改你想保存新的数据库中,其他代码可以一个字都不要动。

      缺点是:

      第一,没有可视化工具。他们工具都可以自动生成,这个目前没有,如果等我学校毕业后,有大量时间投在编代码上时,我就可以拿出许多时间写了。

      第二,链式编程,还没办法实现像EF这样,其实链式最厉害的应该是拼接,拼接如果能够做到前后顺序无关,我觉得是极大的提升。

      其他缺点,就留给读者去发现了。

      好了,对数据库的封装结束了,框架是EasyDb类库中。其他地方要使用就引用该类库就可以了,里面还有一个是我作为测试的控制台程序。

       链接是:http://files.cnblogs.com/files/jnxzk/EasyDbSolution.rar

      有什么问题可以在下边评论~~

  • 相关阅读:
    Tensor总结
    Tensorflow池化
    conda操作
    KS值计算
    supervisor实践
    npm/yarn实践
    nni 环境搭建
    阿里云个人邮箱配置
    Jinja2宏使用
    利用VS code 远程调试 docker 中的 dotnet 应用
  • 原文地址:https://www.cnblogs.com/zhaodahai/p/6831318.html
Copyright © 2011-2022 走看看