背景:

随着V5框架使用者的快速增加,终于促使我开始对整个框架编写完整的Demo。

上周大概花了一星期的时间,每天写到夜里3点半,终完成了框架所有功能的Demo。

同时,按V5框架名称空间的顺序,对每个类的使用,补充相应的文章介绍,以漏补缺。

以下开始介绍:

MAction Demo的项目文件:

1:项目解决方案:

2:两个文件在Debug目录里:

演示的是SQLite数据库(默认System.Data.SQLite.DLL是64位版本,如果运行提示加载出错,自己解压32位的复盖即可)

demo.db的数据库结构为:(后续的Demo也以此两表为示例)

3:App.Config文件配置的是数据库链接:

本类里面演示的是:单表、多表查询、多表操作,下面一个一个看:

单表操作:

1:界面:

2:代码:

  1. public partial class 单表操作 : Form
  2. {
  3. string tableName = "Users";
  4. public 单表操作()
  5. {
  6. AppConfig.DB.EditTimeFields = "EditTime";//该配置的字段,在更新时会自动被更新时间。
  7. InitializeComponent();
  8. Pager.OnPageChanged += Pager_OnPageChanged;
  9. }
  10.  
  11. void Pager_OnPageChanged(object sender, EventArgs e)
  12. {
  13. LoadData();
  14. }
  15.  
  16. private void 单表操作_Load(object sender, EventArgs e)
  17. {
  18. LoadData();
  19.  
  20. }
  21. private void LoadData()
  22. {
  23. MDataTable dt;
  24. using (MAction action = new MAction(tableName))
  25. {
  26. dt = action.Select(Pager.PageIndex, Pager.PageSize, "order by " + action.Data.PrimaryCell.ColumnName + " desc");
  27. OutDebugSql(action.DebugInfo);
  28. }
  29. if (dt != null && dt.Rows.Count > )
  30. {
  31. if (txtUserID.Text == "")
  32. {
  33. dt.Rows[].SetToAll(this);
  34. }
  35. }
  36. // dgView.DataSource = dt.ToDataTable();
  37. //
  38. dt.Bind(dgView);
  39. Pager.DrawControl(dt.RecordsAffected);
  40. }
  41.  
  42. private void OutDebugSql(string msg)
  43. {
  44. if (string.IsNullOrEmpty(msg))
  45. {
  46. msg = "Auto Cache...";//相关的配置,如:AppConfig.Cache.IsAutoCache = false;
  47. }
  48. rtxtSql.Text = msg;
  49. }
  50.  
  51. private void btnFill_Click(object sender, EventArgs e)
  52. {
  53. using (MAction action = new MAction(tableName))
  54. {
  55. if (action.Fill(txtUserID))
  56. {
  57. action.UI.SetToAll(this);
  58. OutDebugSql(action.DebugInfo);
  59. }
  60. }
  61. }
  62.  
  63. private void btnInsert_Click(object sender, EventArgs e)
  64. {
  65. using (MAction action = new MAction(tableName))
  66. {
  67. if (!action.Exists(txtName))
  68. {
  69. action.AllowInsertID = chbInsertID.Checked;
  70. action.UI.SetAutoParentControl(this);//Web开发的不需要这条
  71. if (action.Insert(true, InsertOp.ID))
  72. {
  73. action.UI.SetToAll(this);
  74. LoadData();
  75. }
  76. }
  77. OutDebugSql(action.DebugInfo);
  78. }
  79. }
  80.  
  81. private void btnUpdate_Click(object sender, EventArgs e)
  82. {
  83. using (MAction action = new MAction(tableName))
  84. {
  85. action.UI.SetAutoParentControl(this);
  86. if (action.Update(true))
  87. {
  88. LoadData();
  89. }
  90. OutDebugSql(action.DebugInfo);
  91. }
  92. }
  93.  
  94. private void btnDelete_Click(object sender, EventArgs e)
  95. {
  96. using (MAction action = new MAction(tableName))
  97. {
  98. if (action.Delete(txtUserID))
  99. {
  100. LoadData();
  101. }
  102. OutDebugSql(action.DebugInfo);
  103. }
  104. }
  105.  
  106. private void btnNoDelete_Click(object sender, EventArgs e)
  107. {
  108. AppConfig.DB.DeleteField = "IsDeleted";//演示用代码,一般配置在config对全局起使用。
  109. btnDelete_Click(sender, e);
  110. AppConfig.DB.DeleteField = "";
  111. }
  112.  
  113. private void btn_Click(object sender, EventArgs e)
  114. {
  115. using (MAction action = new MAction(tableName))
  116. {
  117. action.Exists(txtUserID);
  118. action.Exists(txtName);//自动推导
  119. OutDebugSql(action.DebugInfo);
  120. }
  121. }
  122. private void btnOpenMutipleTable_Click(object sender, EventArgs e)
  123. {
  124. 多表查询 m = new 多表查询();
  125. m.Show();
  126. }
  127. private void btnMutipleOperator_Click(object sender, EventArgs e)
  128. {
  129. 多表操作 m = new 多表操作();
  130. m.Show();
  131. }
  132.  
  133. }

3:补充讲解:

1:一开始的设想的Demo是:读数据库表(选择表)=》自动生成表单表=》然后实现上述的所有功能。

2:为了让新手看的容易明白,Demo走常规化,没写的那么自动化。

3:功能包含增删改查,检测存在,分页,排序等功能(事务在多表里演示)。

4:演示Demo中还有两个控件依赖(txtUserID,txtName),这两个也是可以传值的,所以整体是可无硬编码依存的。

多表查询:

1:界面:

2:代码:

  1. public partial class 多表查询 : Form
  2. {
  3. public 多表查询()
  4. {
  5. AppDebug.Start();
  6. InitializeComponent();
  7. }
  8. private void OutSql()
  9. {
  10. rtxtSql.Text = AppDebug.Info;
  11. AppDebug.Stop();
  12. AppDebug.Start();
  13. }
  14. private void btnView_Click(object sender, EventArgs e)
  15. {
  16. MDataTable dt;
  17. using (MAction action = new MAction("V_Article"))
  18. {
  19. dt = action.Select();
  20. OutSql();
  21. }
  22. dt.Bind(dgvView);
  23. }
  24.  
  25. private void btnSql_Click(object sender, EventArgs e)
  26. {
  27. string sql = "select a.*,u.Name from article a left join users u on a.UserID=u.UserID";
  28. MDataTable dt;
  29. using (MAction action = new MAction(sql))
  30. {
  31. dt = action.Select("order by userid desc");
  32. OutSql();
  33. }
  34. dt.Bind(dgvView);
  35. }
  36.  
  37. private void btnJoin_Click(object sender, EventArgs e)
  38. {
  39. MDataTable dt;
  40. using (MAction action = new MAction("Article"))
  41. {
  42. dt = action.Select();
  43.  
  44. }
  45. dt.JoinOnName = "UserID";
  46. dt = dt.Join("Users", "UserID", "Name");
  47. OutSql();
  48. dt.Bind(dgvView);
  49.  
  50. }
  51. }

3:补充讲解:

有3种方法可以涉及多表

1:数据库里创建视图。

2:自定义SQL语句【原来是视图语句,这里内部自动补充成视图语句,增加小小的用户体验】(不能有排序,排序应放在where中)

3:MDataTable的Join方法(优点是:A:可以跨(不同种类的)数据库;B:可以增加自动缓存的利用率【都是单表操作,内存关联】)

多表操作:

1:界面:

2:代码:

  1. public partial class 多表操作 : Form
  2. {
  3. public 多表操作()
  4. {
  5. InitializeComponent();
  6. }
  7. private void OutSql(string msg)
  8. {
  9. rtxtSql.Text = msg;
  10. }
  11. private void LoadData(string where)
  12. {
  13. MDataTable dt;
  14. using (MAction action = new MAction("V_Article"))
  15. {
  16. action.SetSelectColumns("UserID", "Name", "Title", "Content", "PubTime");//设置要显示的列
  17. dt = action.Select(, , where);
  18. }
  19. dt.Bind(dgvView);
  20. }
  21. private void btnTransation_Click(object sender, EventArgs e)
  22. {
  23. MDataTable dt = null;
  24. string guid = Guid.NewGuid().ToString();
  25. using (MAction action = new MAction("Users"))
  26. {
  27. bool result = false;
  28. action.SetTransLevel(IsolationLevel.ReadCommitted);//可设置的事务级别,一般可以不用设置
  29. action.BeginTransation();//设置开启事务标识
  30. action.Set("Name", guid.Substring(, ));
  31. action.Set("Password", "");
  32. int id = ;
  33. if (action.Insert())//第一个执行时,事务才被加载
  34. {
  35. id = action.Get<int>();
  36. action.ResetTable("Article");
  37. action.Set("UserID", id);
  38. action.Set("Title", guid.Substring(, ));
  39. action.Set("Content", guid.Substring(, ));
  40. action.Set("PubTime", DateTime.Now);
  41. result = action.Insert(InsertOp.None);
  42. }
  43. else
  44. {
  45. action.RollBack();//手工回滚
  46. }
  47. action.EndTransation();//提交事务
  48. if (result)
  49. {
  50. LoadData("UserID=" + id);
  51. }
  52. OutSql(action.DebugInfo);
  53. }
  54. if (dt != null)
  55. {
  56. dt.Bind(dgvView);
  57. }
  58. }
  59.  
  60. private void 多表操作_Load(object sender, EventArgs e)
  61. {
  62. LoadData(null);
  63. }
  64.  
  65. private void btnShowInfo_Click(object sender, EventArgs e)
  66. {
  67. StringBuilder sb = new StringBuilder();
  68. MDataTable dt = null;
  69. using (MAction action = new MAction("Article"))
  70. {
  71. sb.Append("AllowInsertID:");
  72. sb.AppendLine(action.AllowInsertID.ToString());
  73.  
  74. sb.Append("ConnectionString:");
  75. sb.AppendLine(action.ConnectionString);
  76.  
  77. sb.Append("DalType:");
  78. sb.AppendLine(action.DalType.ToString());
  79.  
  80. sb.Append("DalVersion:");
  81. sb.AppendLine(action.DalVersion);
  82.  
  83. sb.Append("DebugInfo:");
  84. sb.AppendLine(action.DebugInfo);
  85.  
  86. sb.Append("RecordsAffected:(通常在执行一个命令后,返回受影响的行数)");
  87. sb.AppendLine(action.RecordsAffected.ToString());
  88.  
  89. sb.Append("TableName:");
  90. sb.AppendLine(action.TableName);
  91.  
  92. sb.Append("TimeOut:");
  93. sb.AppendLine(action.TimeOut.ToString());
  94.  
  95. sb.Append("UI对象:");
  96. sb.AppendLine(action.UI.ToString());
  97.  
  98. dt = action.Data.Columns.ToTable();
  99. }
  100. dt.Bind(dgvView);
  101. rtxtSql.Text = sb.ToString();
  102. }
  103.  
  104. private void btnPara_Click(object sender, EventArgs e)
  105. {
  106. MDataTable dt;
  107. using (MAction action = new MAction("Users"))
  108. {
  109. action.SetPara("Name", "0%", DbType.String);
  110. dt = action.Select("Name like @Name");
  111. }
  112. dt.Bind(dgvView);
  113. }
  114. }

3:补充讲解:

1:这里的演示比较单纯,并没有使用单表操作时批量操作(因为是自己造数据,没有界面或外界传值)。

2:一般SQL操作内部有异常,事务是会自动回滚的,只要判断true,false就可以了;

3:如果是自己的代码异常,或业务判断需要回滚,就RollBack()一下。

总结:

1:本次演示,并没有使用框架操作的ProjectTool去生成枚举(后续ORM名称空间的Demo是有生成实体的):常规项目时,生成枚举,可代替硬编码问题。

2:SVN里对应的Demo示例相对丰富,每个类都有Demo,当然也有个别我偷懒了(直接链接到了文章,哈)。

3:在整个写Demo的一周里,(1:处理偏冷的小问题,少量不常用的方法新增或减少),版本的升级也很频繁,目前稳定在V5.6.3.2版本。

4:Demo的SVN下载地址:https://github.com/cyq1162/cyqdata

5:谢谢支持!

CYQ.Data V5 从入门到放弃ORM系列:教程 - MAction类使用的更多相关文章

  1. CYQ.Data V5 从入门到放弃ORM系列:框架的优势

    前言: 框架开源后,学习使用的人越来越多了,所以我也更加积极的用代码回应了. 在框架完成了:数据库读写分离功能 和 分布式缓存功能 后: 经过三天三夜的不眠不休,终于完成框架第三个重量级的功能:自动化 ...

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

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

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

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

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

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

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

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

  6. 终于等到你:CYQ.Data V5系列 (ORM数据层)最新版本开源了

    前言: 不要问我框架为什么从收费授权转到免费开源,人生没有那么多为什么,这些年我开源的东西并不少,虽然这个是最核心的,看淡了就也没什么了. 群里的网友:太平说: 记得一年前你开源另一个项目的时候我就说 ...

  7. 终于等到你:CYQ.Data V5系列 (ORM数据层,支持.NET Core)最新版本开源了

    前言: 不要问我框架为什么从收费授权转到免费开源,人生没有那么多为什么,这些年我开源的东西并不少,虽然这个是最核心的,看淡了就也没什么了. 群里的网友:太平说: 记得一年前你开源另一个项目的时候我就说 ...

  8. CYQ.Data V5 分布式自动化缓存设计介绍(二)

    前言: 最近一段时间,开始了<IT连>创业,所以精力和写的文章多数是在分享创业的过程. 而关于本人三大框架CYQ.Data.Aries.Taurus.MVC的相关文章,基本都很少写了. 但 ...

  9. CYQ.Data V5 分布式缓存Redis应用开发及实现算法原理介绍

    前言: 自从CYQ.Data框架出了数据库读写分离.分布式缓存MemCache.自动缓存等大功能之后,就进入了频繁的细节打磨优化阶段. 从以下的更新列表就可以看出来了,3个月更新了100条次功能: 3 ...

随机推荐

  1. 如何一步一步用DDD设计一个电商网站(五)—— 停下脚步,重新出发

    阅读目录 前言 单元测试 纠正错误,重新出发 结语 一.前言 实际编码已经写了2篇了,在这过程中非常感谢有听到观点不同的声音,借着这个契机,今天这篇就把大家提出的建议一个个的过一遍,重新整理,重新出发 ...

  2. 使用webstorm+webpack构建简单入门级“HelloWorld”的应用&&引用jquery来实现alert

    使用webstorm+webpack构建简单入门级"HelloWorld"的应用&&构建使用jquery来实现 1.首先你自己把webstorm安装完成. 请参考这 ...

  3. Android 6.0 权限知识学习笔记

    最近在项目上因为6.0运行时权限吃了亏,发现之前对运行时权限的理解不足,决定回炉重造,重新学习一下Android Permission. 进入正题: Android权限 在Android系统中,权限分 ...

  4. Android业务组件化之现状分析与探讨

    前言: 从个人经历来说的话,从事APP开发这么多年来,所接触的APP的体积变得越来越大,业务的也变得越来越复杂,总来来说只有一句话:这是一个APP臃肿的时代!所以为了告别APP臃肿的时代,让我们进入一 ...

  5. ASP.NET Core的路由[2]:路由系统的核心对象——Router

    ASP.NET Core应用中的路由机制实现在RouterMiddleware中间件中,它的目的在于通过路由解析为请求找到一个匹配的处理器,同时将请求携带的数据以路由参数的形式解析出来供后续请求处理流 ...

  6. JavaScript实现常用的排序算法

    ▓▓▓▓▓▓ 大致介绍 由于最近要考试复习,所以学习js的时间少了 -_-||,考试完还会继续的努力学习,这次用原生的JavaScript实现以前学习的常用的排序算法,有冒泡排序.快速排序.直接插入排 ...

  7. node模块加载层级优化

    模块加载痛点 大家也或多或少的了解node模块的加载机制,最为粗浅的表述就是依次从当前目录向上级查询node_modules目录,若发现依赖则加载.但是随着应用规模的加大,目录层级越来越深,若是在某个 ...

  8. gRPC源码分析1-SSL/TLS

    引子 前几天看到微信后台团队分享了TLS相关文章,正好gRPC里TLS数据加密是很重要的一块,于是整理出了这篇文章. 在gRPC里,如果仅仅是用来做后端微服务,可以考虑不加密.本文太长,先给个大纲. ...

  9. javascript排序

    利用array中的sort()排序 w3cfunction sortNumber(a,b) { return a - b } var arr = new Array(6) arr[0] = " ...

  10. Git快速入门

    如果你不想看长篇的Git教程,想快速了解Git的使用,那么本文可能会对你入门Git有所帮助.由于笔者用的是Windows系统,所以本文只写Git在Windows上的使用. 一.Git安装 去Git官网 ...