背景:

随着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单表操作 : Form2 {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(objectsender, EventArgs e)12 {13 LoadData();14 }15

16

17

18 private void 单表操作_Load(objectsender, EventArgs e)19 {20 LoadData();21

22 }23 private voidLoadData()24 {25 MDataTable dt;26 using (MAction action = newMAction(tableName))27 {28 dt = action.Select(Pager.PageIndex, Pager.PageSize, "order by" + action.Data.PrimaryCell.ColumnName + "desc");29 OutDebugSql(action.DebugInfo);30 }31 if (dt != null && dt.Rows.Count > 0)32 {33 if (txtUserID.Text == "")34 {35 dt.Rows[0].SetToAll(this);36 }37 }38 //dgView.DataSource = dt.ToDataTable();39 //

40 dt.Bind(dgView);41 Pager.DrawControl(dt.RecordsAffected);42 }43

44 private void OutDebugSql(stringmsg)45 {46 if (string.IsNullOrEmpty(msg))47 {48 msg = "Auto Cache...";//相关的配置,如:AppConfig.Cache.IsAutoCache = false;

49 }50 rtxtSql.Text =msg;51 }52

53 private void btnFill_Click(objectsender, EventArgs e)54 {55 using (MAction action = newMAction(tableName))56 {57 if(action.Fill(txtUserID))58 {59 action.UI.SetToAll(this);60 OutDebugSql(action.DebugInfo);61 }62 }63 }64

65 private void btnInsert_Click(objectsender, EventArgs e)66 {67 using (MAction action = newMAction(tableName))68 {69 if (!action.Exists(txtName))70 {71 action.AllowInsertID =chbInsertID.Checked;72 action.UI.SetAutoParentControl(this);//Web开发的不需要这条

73 if (action.Insert(true, InsertOp.ID))74 {75 action.UI.SetToAll(this);76 LoadData();77 }78 }79 OutDebugSql(action.DebugInfo);80 }81 }82

83 private void btnUpdate_Click(objectsender, EventArgs e)84 {85 using (MAction action = newMAction(tableName))86 {87 action.UI.SetAutoParentControl(this);88 if (action.Update(true))89 {90 LoadData();91 }92 OutDebugSql(action.DebugInfo);93 }94 }95

96 private void btnDelete_Click(objectsender, EventArgs e)97 {98 using (MAction action = newMAction(tableName))99 {100 if(action.Delete(txtUserID))101 {102 LoadData();103 }104 OutDebugSql(action.DebugInfo);105 }106 }107

108 private void btnNoDelete_Click(objectsender, EventArgs e)109 {110 AppConfig.DB.DeleteField = "IsDeleted";//演示用代码,一般配置在config对全局起使用。

111 btnDelete_Click(sender, e);112 AppConfig.DB.DeleteField = "";113 }114

115

116

117 private void btn_Click(objectsender, EventArgs e)118 {119 using (MAction action = newMAction(tableName))120 {121 action.Exists(txtUserID);122 action.Exists(txtName);//自动推导

123 OutDebugSql(action.DebugInfo);124 }125 }126 private void btnOpenMutipleTable_Click(objectsender, EventArgs e)127 {128 多表查询 m = new多表查询();129 m.Show();130 }131 private void btnMutipleOperator_Click(objectsender, EventArgs e)132 {133 多表操作 m = new多表操作();134 m.Show();135 }136

137 }

3:补充讲解:

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

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

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

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

多表查询:

1:界面:

2:代码:

1 public partial class多表查询 : Form2 {3 public多表查询()4 {5 AppDebug.Start();6 InitializeComponent();7 }8 private voidOutSql()9 {10 rtxtSql.Text =AppDebug.Info;11 AppDebug.Stop();12 AppDebug.Start();13 }14 private void btnView_Click(objectsender, 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(objectsender, 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 = newMAction(sql))30 {31 dt = action.Select("order by userid desc");32 OutSql();33 }34 dt.Bind(dgvView);35 }36

37 private void btnJoin_Click(objectsender, 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多表操作 : Form2 {3 public多表操作()4 {5 InitializeComponent();6 }7 private void OutSql(stringmsg)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(1, 100, where);18 }19 dt.Bind(dgvView);20 }21 private void btnTransation_Click(objectsender, 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(1, 5));31 action.Set("Password", "123456");32 int id = 0;33 if (action.Insert())//第一个执行时,事务才被加载

34 {35 id = action.Get(0);36 action.ResetTable("Article");37 action.Set("UserID", id);38 action.Set("Title", guid.Substring(3, 5));39 action.Set("Content", guid.Substring(5, 5));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(objectsender, EventArgs e)61 {62 LoadData(null);63 }64

65 private void btnShowInfo_Click(objectsender, EventArgs e)66 {67 StringBuilder sb = newStringBuilder();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(objectsender, 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 连接mysql_CYQ.Data V5 从入门到放弃ORM系列:教程 - MAction类使用相关推荐

  1. cyq.data 连接mysql_CYQ.Data V5 从入门到放弃ORM系列

    背景: 随着V5框架使用者的快速增加,终于促使我开始对整个框架编写完整的Demo. 上周大概花了一星期的时间,每天写到夜里3点半,终完成了框架所有功能的Demo. 同时,按V5框架名称空间的顺序,对每 ...

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

    背景: 随着V5框架使用者的快速增加,终于促使我开始对整个框架编写完整的Demo. 上周大概花了一星期的时间,每天写到夜里3点半,终完成了框架所有功能的Demo. 同时,按V5框架名称空间的顺序,对每 ...

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

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

  4. cyq.data 连接mysql_CYQ.Data 轻量数据层之路 使用篇一曲 裸身走天涯(十二)

    其实本来是不想写使用帮助的,因为在以下的文章中,都有大量的示例存在: 不过很多人还是很懒啊,一进群就用问怎么用. 发个文章路径让其看吧,又说太麻烦,使用复杂,于是想了想,还是写写使用教程,让这部分懒人 ...

  5. cyq.data 连接mysql_CYQ.Data V5文本数据库技术原理解密

    前言: 这两天有点感冒状态,除了以前折腾 微博粉丝精灵 腾到三更,最近也在折腾个别工具到四更,偶尔心来心潮,赶紧写写文章,最近有很多朋友对CYQ.Data V5里的文本数据库感兴趣,这里就给大伙说下文 ...

  6. cyq.data 连接mysql_CYQ.Data V5 文本数据库支持SQL语句操作(实现原理解说)

    CYQ.Data V5版本的文本数据库,以前有过相关的介绍: 周末一起用文本数据库玩玩Code First 数据的存储,是基于json格式或xml格式的,而实现的原理,也有一篇介绍: CYQ.Data ...

  7. cyq.data 连接mysql_CYQ.Data V5 文本数据库支持SQL语句操作(实现原理解说)-阿里云开发者社区...

    CYQ.Data V5版本的文本数据库,以前有过相关的介绍:周末一起用文本数据库玩玩Code First 数据的存储,是基于json格式或xml格式的,而实现的原理,也有一篇介绍: CYQ.Data ...

  8. cyq.data 连接mysql_cyq.data 常见使用方法

    配置数据库链接:(这只是其中一种方式) AppConfig.DB.CommandTimeout = 800; AppConfig.DB.DefaultConn = "数据库链接地址" ...

  9. cyq.data 连接mysql_CYQ.Data 轻量数据访问层(一) 概述

    在很久很久以前.2007年底,我曾发布过CYQ.Data.DLL,那时的学术氛围很浓,评论的也比较重 在那里,我曾做过一些简介与使用方法的帮助 在这个系列中,我将一步一步开源并讲解实现的过程,由于文章 ...

最新文章

  1. (转)金额转中文大写
  2. java 有界类型_Java™ 教程(有界类型参数)
  3. LINQ圣经——《LINQ实战》
  4. java 8u111 8u112_JDK 8U112
  5. WordPress打开速度很慢的解决方法
  6. 达摩院携手交通部公路科学研究院 探索国内首个道路智能解决方案
  7. 因为sudoers权限而引起的sudo失效
  8. git安装【Windows】
  9. 使用思科模拟器Packet Tracer与GNS3配置IPv6隧道
  10. PHP不读取Excel空行,phpexcel中遇到空单元格不跳过
  11. php优先级,PHP运算优先级——神一般的设定
  12. 「小算法」回文数与数值合法性检验
  13. React Native实例
  14. 第4阶段——制作根文件系统之分析init_post()如何启动第1个程序(1)
  15. Octave教程 Octave Tutorial
  16. PAT Basic 1011
  17. 一个PHP程序员应该掌握的10项技能!【更新】
  18. 用python分析拼多多_python:拼多多订单接口api
  19. RHEL6.1 去掉开机总是提示注册啊,去掉rhsm-compliance-icon小图标
  20. NWT内斗:为了还不值钱的股份

热门文章

  1. matlab拟合空间曲线。散点拟合三维曲线
  2. sql显错注入靶机演示
  3. charles抓包安卓手机心得实战抓取QQqq语音请求
  4. 什么是抖音SEO?抖音SEO优化怎么做?
  5. linux基本功系列之mount命令实战
  6. 关于GIS查询搜索的见解
  7. 知识点总结Day02——JAVA类型转换、运算符、方法入门及JShell
  8. acs java_ACS 4.2 安装图解
  9. 如何成功打jar 包以及运行
  10. 美国电影超短200句