背景:

随着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:代码:

 public partial class 单表操作 : Form
{
string tableName = "Users";
public 单表操作()
{
AppConfig.DB.EditTimeFields = "EditTime";//该配置的字段,在更新时会自动被更新时间。
InitializeComponent();
Pager.OnPageChanged += Pager_OnPageChanged;
} void Pager_OnPageChanged(object sender, EventArgs e)
{
LoadData();
} private void 单表操作_Load(object sender, EventArgs e)
{
LoadData(); }
private void LoadData()
{
MDataTable dt;
using (MAction action = new MAction(tableName))
{
dt = action.Select(Pager.PageIndex, Pager.PageSize, "order by " + action.Data.PrimaryCell.ColumnName + " desc");
OutDebugSql(action.DebugInfo);
}
if (dt != null && dt.Rows.Count > )
{
if (txtUserID.Text == "")
{
dt.Rows[].SetToAll(this);
}
}
// dgView.DataSource = dt.ToDataTable();
//
dt.Bind(dgView);
Pager.DrawControl(dt.RecordsAffected);
} private void OutDebugSql(string msg)
{
if (string.IsNullOrEmpty(msg))
{
msg = "Auto Cache...";//相关的配置,如:AppConfig.Cache.IsAutoCache = false;
}
rtxtSql.Text = msg;
} private void btnFill_Click(object sender, EventArgs e)
{
using (MAction action = new MAction(tableName))
{
if (action.Fill(txtUserID))
{
action.UI.SetToAll(this);
OutDebugSql(action.DebugInfo);
}
}
} private void btnInsert_Click(object sender, EventArgs e)
{
using (MAction action = new MAction(tableName))
{
if (!action.Exists(txtName))
{
action.AllowInsertID = chbInsertID.Checked;
action.UI.SetAutoParentControl(this);//Web开发的不需要这条
if (action.Insert(true, InsertOp.ID))
{
action.UI.SetToAll(this);
LoadData();
}
}
OutDebugSql(action.DebugInfo);
}
} private void btnUpdate_Click(object sender, EventArgs e)
{
using (MAction action = new MAction(tableName))
{
action.UI.SetAutoParentControl(this);
if (action.Update(true))
{
LoadData();
}
OutDebugSql(action.DebugInfo);
}
} private void btnDelete_Click(object sender, EventArgs e)
{
using (MAction action = new MAction(tableName))
{
if (action.Delete(txtUserID))
{
LoadData();
}
OutDebugSql(action.DebugInfo);
}
} private void btnNoDelete_Click(object sender, EventArgs e)
{
AppConfig.DB.DeleteField = "IsDeleted";//演示用代码,一般配置在config对全局起使用。
btnDelete_Click(sender, e);
AppConfig.DB.DeleteField = "";
} private void btn_Click(object sender, EventArgs e)
{
using (MAction action = new MAction(tableName))
{
action.Exists(txtUserID);
action.Exists(txtName);//自动推导
OutDebugSql(action.DebugInfo);
}
}
private void btnOpenMutipleTable_Click(object sender, EventArgs e)
{
多表查询 m = new 多表查询();
m.Show();
}
private void btnMutipleOperator_Click(object sender, EventArgs e)
{
多表操作 m = new 多表操作();
m.Show();
} }

3:补充讲解:

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

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

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

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

多表查询:

1:界面:

2:代码:

  public partial class 多表查询 : Form
{
public 多表查询()
{
AppDebug.Start();
InitializeComponent();
}
private void OutSql()
{
rtxtSql.Text = AppDebug.Info;
AppDebug.Stop();
AppDebug.Start();
}
private void btnView_Click(object sender, EventArgs e)
{
MDataTable dt;
using (MAction action = new MAction("V_Article"))
{
dt = action.Select();
OutSql();
}
dt.Bind(dgvView);
} private void btnSql_Click(object sender, EventArgs e)
{
string sql = "select a.*,u.Name from article a left join users u on a.UserID=u.UserID";
MDataTable dt;
using (MAction action = new MAction(sql))
{
dt = action.Select("order by userid desc");
OutSql();
}
dt.Bind(dgvView);
} private void btnJoin_Click(object sender, EventArgs e)
{
MDataTable dt;
using (MAction action = new MAction("Article"))
{
dt = action.Select(); }
dt.JoinOnName = "UserID";
dt = dt.Join("Users", "UserID", "Name");
OutSql();
dt.Bind(dgvView); }
}

3:补充讲解:

有3种方法可以涉及多表

1:数据库里创建视图。

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

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

多表操作:

1:界面:

2:代码:

  public partial class 多表操作 : Form
{
public 多表操作()
{
InitializeComponent();
}
private void OutSql(string msg)
{
rtxtSql.Text = msg;
}
private void LoadData(string where)
{
MDataTable dt;
using (MAction action = new MAction("V_Article"))
{
action.SetSelectColumns("UserID", "Name", "Title", "Content", "PubTime");//设置要显示的列
dt = action.Select(, , where);
}
dt.Bind(dgvView);
}
private void btnTransation_Click(object sender, EventArgs e)
{
MDataTable dt = null;
string guid = Guid.NewGuid().ToString();
using (MAction action = new MAction("Users"))
{
bool result = false;
action.SetTransLevel(IsolationLevel.ReadCommitted);//可设置的事务级别,一般可以不用设置
action.BeginTransation();//设置开启事务标识
action.Set("Name", guid.Substring(, ));
action.Set("Password", "");
int id = ;
if (action.Insert())//第一个执行时,事务才被加载
{
id = action.Get<int>();
action.ResetTable("Article");
action.Set("UserID", id);
action.Set("Title", guid.Substring(, ));
action.Set("Content", guid.Substring(, ));
action.Set("PubTime", DateTime.Now);
result = action.Insert(InsertOp.None);
}
else
{
action.RollBack();//手工回滚
}
action.EndTransation();//提交事务
if (result)
{
LoadData("UserID=" + id);
}
OutSql(action.DebugInfo);
}
if (dt != null)
{
dt.Bind(dgvView);
}
} private void 多表操作_Load(object sender, EventArgs e)
{
LoadData(null);
} private void btnShowInfo_Click(object sender, EventArgs e)
{
StringBuilder sb = new StringBuilder();
MDataTable dt = null;
using (MAction action = new MAction("Article"))
{
sb.Append("AllowInsertID:");
sb.AppendLine(action.AllowInsertID.ToString()); sb.Append("ConnectionString:");
sb.AppendLine(action.ConnectionString); sb.Append("DalType:");
sb.AppendLine(action.DalType.ToString()); sb.Append("DalVersion:");
sb.AppendLine(action.DalVersion); sb.Append("DebugInfo:");
sb.AppendLine(action.DebugInfo); sb.Append("RecordsAffected:(通常在执行一个命令后,返回受影响的行数)");
sb.AppendLine(action.RecordsAffected.ToString()); sb.Append("TableName:");
sb.AppendLine(action.TableName); sb.Append("TimeOut:");
sb.AppendLine(action.TimeOut.ToString()); sb.Append("UI对象:");
sb.AppendLine(action.UI.ToString()); dt = action.Data.Columns.ToTable();
}
dt.Bind(dgvView);
rtxtSql.Text = sb.ToString();
} private void btnPara_Click(object sender, EventArgs e)
{
MDataTable dt;
using (MAction action = new MAction("Users"))
{
action.SetPara("Name", "0%", DbType.String);
dt = action.Select("Name like @Name");
}
dt.Bind(dgvView);
}
}

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. 彻底理解AC多模式匹配算法

    (本文尤其适合遍览网上的讲解而仍百思不得姐的同学) 一.原理 AC自动机首先将模式组记录为Trie字典树的形式,以节点表示不同状态,边上标以字母表中的字符,表示状态的转移.根节点状态记为0状态,表示起 ...

  2. JS核心系列:浅谈原型对象和原型链

    在Javascript中,万物皆对象,但对象也有区别,大致可以分为两类,即:普通对象(Object)和函数对象(Function). 一般而言,通过new Function产生的对象是函数对象,其他对 ...

  3. 关于 devbridge-autocomplete 插件多选操作的实现方法

    目前据我所知最好用的 autocomplete 插件就是 jquery-ui 的 autocomplete 以及 devbridge 的 autocomplete 插件. 我最终选择了 devbrid ...

  4. Velocity初探小结--Velocity在spring中的配置和使用

    最近正在做的项目前端使用了Velocity进行View层的数据渲染,之前没有接触过,草草过了一遍,就上手开始写,现在又回头细致的看了一遍,做个笔记. velocity是一种基于java的模板引擎技术, ...

  5. 最好的.NET开源免费ZIP库DotNetZip(.NET组件介绍之三)

    在项目开发中,除了对数据的展示更多的就是对文件的相关操作,例如文件的创建和删除,以及文件的压缩和解压.文件压缩的好处有很多,主要就是在文件传输的方面,文件压缩的好处就不需要赘述,因为无论是开发者,还是 ...

  6. 基于RN开发的一款视频配音APP(开源)

    在如今React.ng.vue三分天下的格局下,不得不让自己加快学习的脚步.虽然经常会陷入各种迷茫,学得越多会发现不会的东西也被无限放大,不过能用新的技术作出一些小项目小Demo还是会给自己些许自信与 ...

  7. EF上下文对象线程内唯一性与优化

    在一次请求中,即一个线程内,若是用到EF数据上下文对象,就创建一个,这也加是很多人的代码中习惯在使用上下文对象时,习惯将对象建立在using中,也是为了尽早释放上下文对象, 但是如果有一个业务逻辑调用 ...

  8. css选择器

    常用css选择器,希望对大家有所帮助,不喜勿喷. 1.*:通用选择器 * { margin: 0; padding: 0; } 选择页面上的全部元素,通常用于清除浏览器默认样式,不推荐使用. 2.#i ...

  9. BPM流程中心解决方案分享

    一.需求分析 在过去办公自动化的浪潮中,很多企业已经实施了OA流程,但随着客户的发展和对流程管理的越来越重视, 客户对流程应用需求越来越深 入,您可能面临以下需求: 1.流程功能不能满足需求,包括流程 ...

  10. 解决:win10_x64 VMware Workstation and Hyper-V are not compatible. Remove the Hyper-V role from the system before running VMware Workstation

    bcdedit /set hypervisorlaunchtype off A reboot of of the Windows OS is necessary  必须重启才能生效   To enab ...