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

背景:

随着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<int>(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:谢谢支持!

本文原创发表于博客园,作者为路过秋天,原文链接:http://www.cnblogs.com/cyq1162/p/5681000.html

时间: 2024-09-18 19:49:17

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

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

前言: 框架开源后,学习使用的人越来越多了,所以我也更加积极的用代码回应了. 在框架完成了:数据库读写分离功能 和 分布式缓存功能 后: 经过三天三夜的不眠不休,终于完成框架第三个重量级的功能:自动化分布式缓存. 源代码已经提交,源码地址见:终于等到你:CYQ.Data V5系列 (ORM数据层)最新版本开源了 记得很多年前,大概2010年左右吧,CYQ.Data框架进入快速更新版本阶段的时候, 那时候的我会经常在一些技术群里有意无意的说起自己的框架,然后群里总有那么一些自我而自负的人会说: 你

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

Log 静态类介绍: Public Static (Shared) Methods GetExceptionMessage 获取异常的内部信息 WriteLogToDB Overloaded. 将日志写到数据库中[需要配置LogConn项后方生效 ] WriteLogToTxt Overloaded. 将日志写到外部txt[web.config中配置路径,配置项为Logpath,默认路径为 "Logs/" ]  说明: 1:这个类很简单,主要的使用方法只有:WriteLogToTxt.

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

MProc介绍 MProc:是一个用于执行SQL或存储过程的数据库操作类,它轻量高性能地类似于Dapper. MProc:它出现的场景很少,因为MAction自身就能处理掉90%-100%的数据操作(以存储过程为核心操作的除外) MProc项目Demo 1:项目图:只有一个控制台代码,说明此类的使用极度简单. 2:示例代码: 1 class Program 2 { 3 4 static void Main(string[] args) 5 { 6 //MAction已经演示了配置文件配置链接,这

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

1:AppConfig类的介绍: Public Static (Shared) Properties IsEnumToInt 是否使用表字段枚举转Int方式(默认为false). 设置为true时,可以加快一点性能,但生成的表字段枚举必须和数据库一致. Aop Aop 插件配置项 示例配置:[ 完整类名,程序集(dll)名称]<add key="Aop" value="Web.Aop.AopAction,Aop"/> ThreadBreakPath To

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

前言: 随着CYQ.Data 开始回归免费使用之后,发现用户的情绪越来越激动,为了保持这持续的激动性,让我有了开源的念头. 同时,由于框架经过这5-6年来的不断演进,以前发的早期教程已经太落后了,包括使用方式,及相关介绍,都容易引人误解. 为此,我打算重新写个系列来介绍最新的版本,让大伙从传统的ORM编程过渡到自动化框架型思维编程(自已造的词). 于是:这个新系列的名称就叫:CYQ.Data 从入门到放弃ORM系列 什么是:CYQ.Data 1:它是一个ORM框架. 2:它是一个数据层组件. 3

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

前言: 不要问我框架为什么从收费授权转到免费开源,人生没有那么多为什么,这些年我开源的东西并不少,虽然这个是最核心的,看淡了就也没什么了. 群里的网友:太平说: 记得一年前你开源另一个项目的时候我就说过  这么多年 秋天有两点没变 一是还是单身 另外一个就是cyq.data还没开源  终于等到开源了! 也许吧,只有把cyq.data最终开源了,才能解决单身问题,不然我在这上面花的时间太多,都没时间和妹子聊天了.   几个重要网址: 源码SVN地址:https://github.com/cyq11

CYQ.Data V5文本数据库技术原理解密

前言: 这两天有点感冒状态,除了以前折腾 微博粉丝精灵 腾到三更,最近也在折腾个别工具到四更,偶尔心来心潮,赶紧写写文章,最近有很多朋友对CYQ.Data V5里的文本数据库感兴趣,这里就给大伙说下文本数据库技术原理,给大伙解下密.     CYQ.Data 框架的稳定与前进: CYQ.Data 对于V4系列,版本号就在V4.55版本就不再提高了,主要是为了保留一个最稳定的版本,基本除了Bug修正,不会再有大于V4.N的版本号出现了. 而V5版本,这一两年来,事实上,代码改动相当大,内部类的结构

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

CYQ.Data V5 分布式自动化缓存设计介绍(二) 前言: 最近一段时间,开始了<IT连>创业,所以精力和写的文章多数是在分享创业的过程. 而关于本人三大框架CYQ.Data.Aries.Taurus.MVC的相关文章,基本都很少写了. 但框架的维护升级,还是时不时的在进行中的,这点从开源的Github上的代码提交时间上就可以看出来了. 毕竟<IT连>的后台WebAPI,用的是Taurus.MVC,后台系统管理用的是Aries. 不过今天,就不写创业相关的文章了,先分享篇技术类

CYQ.Data 轻量数据层之路 使用篇-MAction 数据查询 视频 E (二十二)

说明: 本次录制主要为使用篇:CYQ.Data 轻量数据层之路 使用篇二曲 MAction 数据查询(十三)   的附加视频教程-下半部分. 本次视频介绍了: 1:GridView/DataList/Repeater控件配合分页控件实现列表绑定. 2:利用视图实现多表操作 3:得用自定SQL语句实现多表操作.   这本次录制的视频上传于-秋色园: 注意如果要看清晰版本,要点击视频下面的:查看原始大小的动画 本次视频大小分辨率为:1024*768,依旧坚持走高清.无码的路线,为观众提供良好视觉享受