前言:

以下功能在国庆期就完成并提前发布了,但到今天才有时间写文介绍,主要是国庆后还是选择就职了,悲催的是上班的地方全公司都能上网,唯独开发部竟不让上网,是个局域网。

也不是全不能上,房间里有三台能上网的机子(两台笔记本+一台台式机),下载资料还得用公司的U盘再转到自己电脑,这种半封闭的环境,相当的让人不适应,有种欲仰天吐血的感觉。

这一周我都向三个带总的领导反映了上网问题,不过没啥响应,估计是没戏。

于是我只有把其中一台能上网的笔记本拿到自己桌子上去独自占用了,勉强也能上下网了,不过基于安全问题,我也不好在那机子里登陆私人账号。

经过一周的研究,我发现解决方案还是有的:因为公司的规定只是开发的机子不让上网而已,自己按理应该可以带笔记本去上网,不过我奇怪的是竟然整个部门都没人带笔记本去,不知道搞啥名头。

好了,废话不多说了,下面入文章的正题:

CYQ.Data V5 配置工具:

最新更新了配置工具,新的界面截图如下:

本次调整的功能如下:

  1. 1:编码模式:新增加纯实体的生成:
  2.  
  3. 至此,CYQ.Data 就有了三种编码模式,分别是:
  4. A 枚举型(MActionMProc)- 性能最优的编码模式
  5. B 实体型(充血型的ORM操作 - 需要实体类继承CYQ.Data.Orm.OrmBase,也支持CodeFirst模式)
  6. C 纯实体(贫血型的ORM操作 - 通过本次新增的CYQ.Data.Orm.DBFast 静态类来操作)
  7.  
  8. 2:生成的实体带说明文字。
  9. 3:默认名称空间增加{0}来代表数据库名称。
  10. 4:多数据库模式下,默认的数据库链接,约定对应的Web.Config的配置为"数据库名称Conn“。

下面示例生成一个实体类如下:

  1. using System;
  2.  
  3. namespace Web.Entity.Demo
  4.  
  5. {
  6.  
  7.     public class Users 
  8.  
  9.     {
  10.  
  11.         /// <summary>
  12.  
  13.         /// 标识ID
  14.  
  15.         /// </summary>
  16.  
  17.         public int? ID { get; set; }
  18.  
  19.         /// <summary>
  20.  
  21.         /// 用户名
  22.  
  23.         /// </summary>
  24.  
  25.         public string UserName { get; set; }
  26.  
  27.         /// <summary>
  28.  
  29.         /// 创建日期
  30.  
  31.         /// </summary>
  32.  
  33.         public DateTime? CreateTime { get; set; }
  34.  
  35.     }
  36.  
  37. }

对于这样的实体,默认的数据库链接就是:

  1. <add name="DemoConn" connectionString="server=.;database=demo;uid=sa;pwd=123456"/> 

如果DemoConn不存在,则会取默认的Conn项。

工具的源码下载地址:http://www.cyqdata.com/download/article-detail-426

CYQ.Data.Orm.DBFast 类介绍

这是我最近新增加的静态类,主要是为了节省点代码,方便一些基础的操作。

示例代码(以上面的的Users实体为示例):

  1. 查询实体:
  2. Users u=DBFast.Find<Users>(1);//一行查一个实体。
  3. List<Users> uList=DBFast.Select<Users>(2,10,"id>10");//分页查询满足条件的列表。
  4. 增加数据:
  5. DBFast.Insert<Users>(new Users{UserName="a";});
  6. 更新数据: 
  7. DBFast.Update<Users>(new Users{UserName="a";},1);
  8.  
  9. 删除数据: 
  10. DBFast.Delete<Users>(1);

以上就是简的操作,增加这个静态类的意图,是为了简化一些常规的操作,让一行代码去解决,减少代码量。

所以这个静态类并不是万能的,其它复杂性的的操作方式, 建议使用枚举型的常规操作。

下面提供这个DBFast静态类的源码,细看源码,会发现这些DBFast类操作都仅是MAction类的二次封装形成的:

  1. using System;
  2.  
  3. using System.Collections.Generic;
  4.  
  5. using System.Text;
  6.  
  7. using CYQ.Data.Table;
  8.  
  9. namespace CYQ.Data.Orm
  10.  
  11. {
  12.  
  13.     /// <summary>
  14.  
  15.     /// 快速操作操作类。
  16.  
  17.     /// </summary>
  18.  
  19.     public static class DBFast
  20.  
  21.     {
  22.  
  23.         /// <summary>
  24.  
  25.         /// 查找单条记录
  26.  
  27.         /// </summary>
  28.  
  29.         /// <typeparam name="T">实体类型</typeparam>
  30.  
  31.         /// <param name="where">条件</param>
  32.  
  33.         /// <param name="columns">指定查询的列(可选)</param>
  34.  
  35.         /// <returns></returns>
  36.  
  37.         public static T Find<T>(object where, params string[] columns)
  38.  
  39.         {
  40.  
  41.             T result = default(T);
  42.  
  43.             MDataRow row = null;
  44.  
  45.             using (MAction action = GetMAction<T>())
  46.  
  47.             {
  48.  
  49.                 if (columns != null && columns.Length > )
  50.  
  51.                 {
  52.  
  53.                     action.SetSelectColumns(columns);
  54.  
  55.                 }
  56.  
  57.                 if (action.Fill(where))
  58.  
  59.                 {
  60.  
  61.                     row = action.Data;
  62.  
  63.                 }
  64.  
  65.             }
  66.  
  67.             if (row != null)
  68.  
  69.             {
  70.  
  71.                 result = row.ToEntity<T>();
  72.  
  73.             }
  74.  
  75.             return result;
  76.  
  77.         }
  78.  
  79.         public static List<T> Select<T>()
  80.  
  81.         {
  82.  
  83.             int count;
  84.  
  85.             return Select<T>(, , null, out count, null);
  86.  
  87.         }
  88.  
  89.         /// <summary>
  90.  
  91.         /// 列表查询
  92.  
  93.         /// </summary>
  94.  
  95.         /// <param name="where">查询条件[可附带 order by 语句]</param>
  96.  
  97.         /// <returns></returns>
  98.  
  99.         public static List<T> Select<T>(string where, params string[] columns)
  100.  
  101.         {
  102.  
  103.             int count;
  104.  
  105.             return Select<T>(, , where, out count, columns);
  106.  
  107.         }
  108.  
  109.         /// <summary>
  110.  
  111.         /// 列表查询
  112.  
  113.         /// </summary>
  114.  
  115.         /// <param name="topN">查询几条</param>
  116.  
  117.         /// <param name="where">查询条件[可附带 order by 语句]</param>
  118.  
  119.         /// <returns></returns>
  120.  
  121.         public static List<T> Select<T>(int topN, string where, params string[] columns)
  122.  
  123.         {
  124.  
  125.             int count;
  126.  
  127.             return Select<T>(, topN, where, out count, columns);
  128.  
  129.         }
  130.  
  131.         public static List<T> Select<T>(int pageIndex, int pageSize, params string[] columns)
  132.  
  133.         {
  134.  
  135.             int count;
  136.  
  137.             return Select<T>(pageIndex, pageSize, null, out count, columns);
  138.  
  139.         }
  140.  
  141.         public static List<T> Select<T>(int pageIndex, int pageSize, string where, params string[] columns)
  142.  
  143.         {
  144.  
  145.             int count;
  146.  
  147.             return Select<T>(pageIndex, pageSize, where, out count, columns);
  148.  
  149.         }
  150.  
  151.         /// <summary>
  152.  
  153.         /// 查找多条记录
  154.  
  155.         /// </summary>
  156.  
  157.         /// <typeparam name="T">实体类型</typeparam>
  158.  
  159.         /// <param name="pageIndex">第N页</param>
  160.  
  161.         /// <param name="pageSize">每页N条</param>
  162.  
  163.         /// <param name="where">条件</param>
  164.  
  165.         /// <param name="count">返回记录总数</param>
  166.  
  167.         /// <param name="columns">指定查询的列(可选)</param>
  168.  
  169.         /// <returns></returns>
  170.  
  171.         public static List<T> Select<T>(int pageIndex, int pageSize, object where, out int count, params string[] columns)
  172.  
  173.         {
  174.  
  175.             MDataTable dt = null;
  176.  
  177.             using (MAction action = GetMAction<T>())
  178.  
  179.             {
  180.  
  181.                 if (columns != null && columns.Length > )
  182.  
  183.                 {
  184.  
  185.                     action.SetSelectColumns(columns);
  186.  
  187.                 }
  188.  
  189.                 dt = action.Select(pageIndex, pageSize, where, out count);
  190.  
  191.             }
  192.  
  193.             return dt.ToList<T>();
  194.  
  195.         }
  196.  
  197.         /// <summary>
  198.  
  199.         /// 删除记录
  200.  
  201.         /// </summary>
  202.  
  203.         /// <typeparam name="T">实体类型</typeparam>
  204.  
  205.         /// <param name="where">条件</param>
  206.  
  207.         /// <returns></returns>
  208.  
  209.         public static bool Delete<T>(object where)
  210.  
  211.         {
  212.  
  213.             bool result = false;
  214.  
  215.             using (MAction action = GetMAction<T>())
  216.  
  217.             {
  218.  
  219.                 result = action.Delete(where);
  220.  
  221.             }
  222.  
  223.             return result;
  224.  
  225.         }
  226.  
  227.         public static bool Insert<T>(T t)
  228.  
  229.         {
  230.  
  231.             return Insert<T>(t, InsertOp.ID);
  232.  
  233.         }
  234.  
  235.         /// <summary>
  236.  
  237.         /// 添加一条记录
  238.  
  239.         /// </summary>
  240.  
  241.         /// <typeparam name="T">实体类型</typeparam>
  242.  
  243.         /// <param name="t">实体对象</param>
  244.  
  245.         /// <returns></returns>
  246.  
  247.         public static bool Insert<T>(T t, InsertOp op)
  248.  
  249.         {
  250.  
  251.             bool result = false;
  252.  
  253.             MDataRow row = null;
  254.  
  255.             using (MAction action = GetMAction<T>())
  256.  
  257.             {
  258.  
  259.                 action.Data.SetFromEntity(t);
  260.  
  261.                 result = action.Insert(op);
  262.  
  263.                 if (op != InsertOp.None)
  264.  
  265.                 {
  266.  
  267.                     row = action.Data;
  268.  
  269.                 }
  270.  
  271.             }
  272.  
  273.             if (row != null)
  274.  
  275.             {
  276.  
  277.                 row.SetToEntity(t);
  278.  
  279.             }
  280.  
  281.             return result;
  282.  
  283.         }
  284.  
  285.         public static bool Update<T>(T t)
  286.  
  287.         {
  288.  
  289.             return Update<T>(t, null);
  290.  
  291.         }
  292.  
  293.         /// <summary>
  294.  
  295.         /// 更新记录
  296.  
  297.         /// </summary>
  298.  
  299.         /// <typeparam name="T">实体类型</typeparam>
  300.  
  301.         /// <param name="t">实体对象</param>
  302.  
  303.         /// <param name="where">条件</param>
  304.  
  305.         /// <returns></returns>
  306.  
  307.         public static bool Update<T>(T t, object where)
  308.  
  309.         {
  310.  
  311.             bool result = false;
  312.  
  313.             using (MAction action = GetMAction<T>())
  314.  
  315.             {
  316.  
  317.                 action.Data.SetFromEntity(t);
  318.  
  319.                 result = action.Update(where);
  320.  
  321.             }
  322.  
  323.             return result;
  324.  
  325.         }
  326.  
  327.         private static MAction GetMAction<T>()
  328.  
  329.         {
  330.  
  331.             string conn = string.Empty;
  332.  
  333.             MAction action = new MAction(GetTableName<T>(out conn), conn);
  334.  
  335.             action.SetNoAop();
  336.  
  337.             return action;
  338.  
  339.         }
  340.  
  341.         private static string GetTableName<T>(out string conn)
  342.  
  343.         {
  344.  
  345.             conn = string.Empty;
  346.  
  347.             Type t = typeof(T);
  348.  
  349.            
  350.  
  351.             string[] items = t.FullName.Split('.');
  352.  
  353.             if (items.Length > )
  354.  
  355.             {
  356.  
  357.                 conn = items[items.Length - ] + "Conn";
  358.  
  359.                 items = null;
  360.  
  361.             }
  362.  
  363.             string tName = t.Name;
  364.  
  365.             t = null;
  366.  
  367.             return tName;
  368.  
  369.         }
  370.  
  371.     }
  372.  

结束语:

新进的公司,一开始以为是开发电子商务类的网站,所以我经三考虑的架构选型不是WebForm也不是MVC,而是打算采用QBlog那一套的框架,还特意思改进了CYQ.Data里的XHtmlAction模板引擎,增加了CMS的标签功能,以为要上战场,结果进去一天就发现,是开发的分销商订单系统,数据是和ERP对接,于是架构目前选型就变更为EasyUI+CYQ.Data+WebForm了。

下周应该会招一两个战友,人在广州的有兴趣的可以给我发私信。 

CYQ.Data.Orm.DBFast 新增类介绍(含类的源码及新版本配置工具源码)的更多相关文章

  1. CYQ.Data V5 MDataTable 专属篇介绍

    前言 以前一两个月才出一篇,这三天有点变态地连续1天1篇(其实都是上周末两天写好的存货). 短期应该没有新的和此框架相关的文章要写了,这应该是最后一篇,大伙且看且珍惜. 前两篇讲数据库读写分离和分布式 ...

  2. CYQ.Data 从入门到放弃ORM系列:开篇:自动化框架编程思维

    前言: 随着CYQ.Data 开始回归免费使用之后,发现用户的情绪越来越激动,为了保持这持续的激动性,让我有了开源的念头. 同时,由于框架经过这5-6年来的不断演进,以前发的早期教程已经太落后了,包括 ...

  3. CyQ.data MDataTable

    前言 以前一两个月才出一篇,这三天有点变态地连续1天1篇(其实都是上周末两天写好的存货). 短期应该没有新的和此框架相关的文章要写了,这应该是最后一篇,大伙且看且珍惜. 前两篇讲数据库读写分享和分布式 ...

  4. CYQ.Data 支持WPF相关的数据控件绑定(2013-08-09)

    事件的结果 经过多天的思考及忙碌的开发及测试,CYQ.Data 终于在UI上全面支持WPF,至此,CYQ.Data 已经可以方便支持wpf的开发,同时,框架仍保留最低.net framework2.0 ...

  5. CYQ.Data 支持WPF相关的数据控件绑定.Net获取iis版本

    CYQ.Data 支持WPF相关的数据控件绑定(2013-08-09) 事件的结果 经过多天的思考及忙碌的开发及测试,CYQ.Data 终于在UI上全面支持WPF,至此,CYQ.Data 已经可以方便 ...

  6. CYQ MAction,子表 新增,删除,修改 集合

    using System;using System.Collections.Generic;using System.Linq;using System.Text;using System.Threa ...

  7. CYQ.Data V5 从入门到放弃ORM系列:教程 - Log、SysLogs两个日志类使用

    Log 静态类介绍: Public Static (Shared) Methods GetExceptionMessage 获取异常的内部信息 WriteLogToDB Overloaded. 将日志 ...

  8. CYQ.Data V5 从入门到放弃ORM系列:教程 - AppConfig、AppDebug类的使用

    1:AppConfig类的介绍: Public Static (Shared) Properties IsEnumToInt 是否使用表字段枚举转Int方式(默认为false). 设置为true时,可 ...

  9. CYQ.Data V5 从入门到放弃ORM系列:教程 - MProc类使用

    MProc介绍 MProc:是一个用于执行SQL或存储过程的数据库操作类,它轻量高性能地类似于Dapper. MProc:它出现的场景很少,因为MAction自身就能处理掉90%-100%的数据操作( ...

随机推荐

  1. APP开发 Token生成 验证

    准备好协议(HTTP).数据表示方法(JSON).请求数据的方法(REST) 选择一个合适的框架 接口特点汇总: 1.因为是非开放性的,所以所有的接口都是封闭的,只对公司内部的产品有效: 2.因为是非 ...

  2. Selenium安装失败WebDriverException: Message: 'gechodriver' executable needs to be in PATH

    在搭建Python+Selenium自动化测试时,用python通过WebDriver驱动Firefox浏览器时,一直无法执行测试用例. 报错信息:WebDriverException: Messag ...

  3. CozyRSS开发记录22-界面退化

    CozyRSS开发记录22-界面退化 1.问题1-HtmlTextBlock 找的这个HtmlTextBlock有很严重的bug,有时候显示不完全,有时候直接就崩了.然后看了下代码,完全是学生仔水平写 ...

  4. JavaScript高级程序设计-(3) 变量、作用域和内存问题

    传递参数 ECMAScript所有函数参数都是按值传递的,即使对象在函数内部修改了参数的值,原始的引用任然不变,局部对象在函数执行完毕后被销毁

  5. 树链剖分+线段树 CF 593D Happy Tree Party(快乐树聚会)

    题目链接 题意: 有n个点的一棵树,两种操作: 1. a到b的路径上,给一个y,对于路径上每一条边,进行操作,问最后的y: 2. 修改某个条边p的值为c 思路: 链上操作的问题,想树链剖分和LCT,对 ...

  6. 单链表、循环链表的JS实现

    数据结构系列前言: 数据结构作为程序员的基本知识,需要我们每个人牢牢掌握.近期我也展开了对数据结构的二次学习,来弥补当年挖的坑......   当时上课的时候也就是跟着听课,没有亲自实现任何一种数据结 ...

  7. 数据泵Expdp和Impdp

    一.数据泵导入导出技术 1.结构 2.目录对象 二.EXPDP参数 1.attach 2.content 3.directory 4.dumpfile 5.estimate 6.estimate_on ...

  8. BZOJ2506: calc

    Description            给一个长度为n的非负整数序列A1,A2,…,An.现有m个询问,每次询问给出l,r,p,k,问满足l<=i<=r且Ai mod p = k的值 ...

  9. Spring MVC篇一、搭建Spring MVC框架

    本项目旨在搭建一个简单的Spring MVC框架,了解Spring MVC的基础配置等内容. 一.项目结构 本项目使用idea intellij创建,配合maven管理.整体的目录结构如图: 其中ja ...

  10. common.js js中常用方法

    //创建CSS样式段 //classid: CSS样式段ID//font: 字体//size: 字体大小//color: 字体颜色//style: 字体风格function FCMakeCSSClas ...