背景:

随着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  17  18         private void 单表操作_Load(object sender, EventArgs e) 19         { 20             LoadData(); 21  22         } 23         private void LoadData() 24         { 25             MDataTable dt; 26             using (MAction action = new MAction(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(string msg) 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(object sender, EventArgs e) 54         { 55             using (MAction action = new MAction(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(object sender, EventArgs e) 66         { 67             using (MAction action = new MAction(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(object sender, EventArgs e) 84         { 85             using (MAction action = new MAction(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(object sender, EventArgs e) 97         { 98             using (MAction action = new MAction(tableName)) 99             {100                 if (action.Delete(txtUserID))101                 {102                     LoadData();103                 }104                 OutDebugSql(action.DebugInfo);105             }106         }107 108         private void btnNoDelete_Click(object sender, 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(object sender, EventArgs e)118         {119             using (MAction action = new MAction(tableName))120             {121                 action.Exists(txtUserID);122                 action.Exists(txtName);//自动推导123                 OutDebugSql(action.DebugInfo);124             }125         }126         private void btnOpenMutipleTable_Click(object sender, EventArgs e)127         {128             多表查询 m = new 多表查询();129             m.Show();130         }131         private void btnMutipleOperator_Click(object sender, 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 多表查询 : 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(1, 100, 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(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(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下载地址:http://code.taobao.org/svn/cyqopen/trunk/CYQ.Data.GettingStarted/

5:谢谢支持!

cyq.data 连接mysql_CYQ.Data V5 从入门到放弃ORM系列相关推荐

  1. cyq.data 连接mysql_CYQ.Data V5 从入门到放弃ORM系列:教程 - MAction类使用

    背景: 随着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. PHP引擎php.ini 和fastcti优化
  2. SharePoint 2013 调用WCF服务简单示例
  3. SAP MM MD04中PR单据的显示
  4. python numpy模块
  5. 新建站点如何与服务器,新建站点如何收录更快
  6. 检索数据_13_从表中查询空值
  7. 知乎问答:一年内的前端看不懂前端框架源码怎么办?
  8. 用pv操作描述如下前驱图_LinkedList实现分析(二)——常用操作
  9. 面向对象之类的内建函数
  10. 如何才干创建一个空的IBM DB2 ECO数据库
  11. python中的class类使用方法[探索3]
  12. jdk动态代理详解(通俗易懂,5分钟带你快速理解动态代理)全网最简
  13. 一个php网站加入背景音乐,html页面中如何添加背景音乐
  14. android studio 配置应用生成多个dex
  15. QQ等级:QQ在线等级说明
  16. AD(altium designer)15原理图与PCB设计教程(七)——印制电路板的布局设计
  17. 测试菜鸟学习网站汇总
  18. 学临床专业和计算机哪个好,大学里“炙手可热”的专业,未来10年也不会被淘汰,发展前景更好...
  19. PromQL 直方图 跟踪请求的延迟或响应大小 99%的请求是在多少延迟下完成的?
  20. DELL T7910服务器工作站的双系统安装!

热门文章

  1. 面试常问到的经典100问 附答案和点评 参加过面试的人就知道这些题目出现的频率有多高啦 ①
  2. 祝福版的3D标签云动画特效
  3. 英语阶段总结—历程回顾
  4. 常见分组加密算法和加密模式
  5. 前端给身份证以及电话做敏感加密
  6. 英伟达NX上使用 Python 硬解码ip摄像头h264视频流
  7. 计算机科学加急审稿300元,计算机四区sci期刊加急发表sci正刊审稿20天录用
  8. 拼多多启动第四届农货节:携手10万涉农店铺,与8.8亿消费者共享“秋收喜悦”
  9. 计算机应用技能大赛方案,小学电脑技能大赛活动方案
  10. 8、Python 机器学习基础知识Pandas库中的DataFrom(二)