失眠网,内容丰富有趣,生活中的好帮手!
失眠网 > cyq.data 连接mysql_CYQ.Data V5 从入门到放弃ORM系列

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

时间:2022-09-11 19:22:02

相关推荐

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

背景:

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

1publicpartialclass单表操作:Form2{3stringtableName="Users";4public单表操作()5{6AppConfig.DB.EditTimeFields="EditTime";//该配置的字段,在更新时会自动被更新时间。7InitializeComponent();8Pager.OnPageChanged+=Pager_OnPageChanged;9}1011voidPager_OnPageChanged(objectsender,EventArgse)12{13LoadData();14}15161718privatevoid单表操作_Load(objectsender,EventArgse)19{20LoadData();2122}23privatevoidLoadData()24{25MDataTabledt;26using(MActionaction=newMAction(tableName))27{28dt=action.Select(Pager.PageIndex,Pager.PageSize,"orderby"+action.Data.PrimaryCell.ColumnName+"desc");29OutDebugSql(action.DebugInfo);30}31if(dt!=null&&dt.Rows.Count>0)32{33if(txtUserID.Text=="")34{35dt.Rows[0].SetToAll(this);36}37}38//dgView.DataSource=dt.ToDataTable();39//40dt.Bind(dgView);41Pager.DrawControl(dt.RecordsAffected);42}4344privatevoidOutDebugSql(stringmsg)45{46if(string.IsNullOrEmpty(msg))47{48msg="AutoCache...";//相关的配置,如:AppConfig.Cache.IsAutoCache=false;49}50rtxtSql.Text=msg;51}5253privatevoidbtnFill_Click(objectsender,EventArgse)54{55using(MActionaction=newMAction(tableName))56{57if(action.Fill(txtUserID))58{59action.UI.SetToAll(this);60OutDebugSql(action.DebugInfo);61}62}63}6465privatevoidbtnInsert_Click(objectsender,EventArgse)66{67using(MActionaction=newMAction(tableName))68{69if(!action.Exists(txtName))70{71action.AllowInsertID=chbInsertID.Checked;72action.UI.SetAutoParentControl(this);//Web开发的不需要这条73if(action.Insert(true,InsertOp.ID))74{75action.UI.SetToAll(this);76LoadData();77}78}79OutDebugSql(action.DebugInfo);80}81}8283privatevoidbtnUpdate_Click(objectsender,EventArgse)84{85using(MActionaction=newMAction(tableName))86{87action.UI.SetAutoParentControl(this);88if(action.Update(true))89{90LoadData();91}92OutDebugSql(action.DebugInfo);93}94}9596privatevoidbtnDelete_Click(objectsender,EventArgse)97{98using(MActionaction=newMAction(tableName))99{100if(action.Delete(txtUserID))101{102LoadData();103}104OutDebugSql(action.DebugInfo);105}106}107108privatevoidbtnNoDelete_Click(objectsender,EventArgse)109{110AppConfig.DB.DeleteField="IsDeleted";//演示用代码,一般配置在config对全局起使用。111btnDelete_Click(sender,e);112AppConfig.DB.DeleteField="";113}114115116117privatevoidbtn_Click(objectsender,EventArgse)118{119using(MActionaction=newMAction(tableName))120{121action.Exists(txtUserID);122action.Exists(txtName);//自动推导123OutDebugSql(action.DebugInfo);124}125}126privatevoidbtnOpenMutipleTable_Click(objectsender,EventArgse)127{128多表查询m=new多表查询();129m.Show();130}131privatevoidbtnMutipleOperator_Click(objectsender,EventArgse)132{133多表操作m=new多表操作();134m.Show();135}136137}

3:补充讲解:

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

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

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

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

多表查询:

1:界面:

2:代码:

1publicpartialclass多表查询:Form2{3public多表查询()4{5AppDebug.Start();6InitializeComponent();7}8privatevoidOutSql()9{10rtxtSql.Text=AppDebug.Info;11AppDebug.Stop();12AppDebug.Start();13}14privatevoidbtnView_Click(objectsender,EventArgse)15{16MDataTabledt;17using(MActionaction=newMAction("V_Article"))18{19dt=action.Select();20OutSql();21}22dt.Bind(dgvView);23}2425privatevoidbtnSql_Click(objectsender,EventArgse)26{27stringsql="selecta.*,u.Namefromarticlealeftjoinusersuona.UserID=u.UserID";28MDataTabledt;29using(MActionaction=newMAction(sql))30{31dt=action.Select("orderbyuseriddesc");32OutSql();33}34dt.Bind(dgvView);35}3637privatevoidbtnJoin_Click(objectsender,EventArgse)38{39MDataTabledt;40using(MActionaction=newMAction("Article"))41{42dt=action.Select();4344}45dt.JoinOnName="UserID";46dt=dt.Join("Users","UserID","Name");47OutSql();48dt.Bind(dgvView);4950}51}

3:补充讲解:

有3种方法可以涉及多表

1:数据库里创建视图。

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

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

多表操作:

1:界面:

2:代码:

1publicpartialclass多表操作:Form2{3public多表操作()4{5InitializeComponent();6}7privatevoidOutSql(stringmsg)8{9rtxtSql.Text=msg;10}11privatevoidLoadData(stringwhere)12{13MDataTabledt;14using(MActionaction=newMAction("V_Article"))15{16action.SetSelectColumns("UserID","Name","Title","Content","PubTime");//设置要显示的列17dt=action.Select(1,100,where);18}19dt.Bind(dgvView);20}21privatevoidbtnTransation_Click(objectsender,EventArgse)22{23MDataTabledt=null;24stringguid=Guid.NewGuid().ToString();25using(MActionaction=newMAction("Users"))26{27boolresult=false;28action.SetTransLevel(IsolationLevel.ReadCommitted);//可设置的事务级别,一般可以不用设置29action.BeginTransation();//设置开启事务标识30action.Set("Name",guid.Substring(1,5));31action.Set("Password","123456");32intid=0;33if(action.Insert())//第一个执行时,事务才被加载34{35id=action.Get(0);36action.ResetTable("Article");37action.Set("UserID",id);38action.Set("Title",guid.Substring(3,5));39action.Set("Content",guid.Substring(5,5));40action.Set("PubTime",DateTime.Now);41result=action.Insert(InsertOp.None);42}43else44{45action.RollBack();//手工回滚46}47action.EndTransation();//提交事务48if(result)49{50LoadData("UserID="+id);51}52OutSql(action.DebugInfo);53}54if(dt!=null)55{56dt.Bind(dgvView);57}58}5960privatevoid多表操作_Load(objectsender,EventArgse)61{62LoadData(null);63}6465privatevoidbtnShowInfo_Click(objectsender,EventArgse)66{67StringBuildersb=newStringBuilder();68MDataTabledt=null;69using(MActionaction=newMAction("Article"))70{71sb.Append("AllowInsertID:");72sb.AppendLine(action.AllowInsertID.ToString());7374sb.Append("ConnectionString:");75sb.AppendLine(action.ConnectionString);7677sb.Append("DalType:");78sb.AppendLine(action.DalType.ToString());7980sb.Append("DalVersion:");81sb.AppendLine(action.DalVersion);8283sb.Append("DebugInfo:");84sb.AppendLine(action.DebugInfo);8586sb.Append("RecordsAffected:(通常在执行一个命令后,返回受影响的行数)");87sb.AppendLine(action.RecordsAffected.ToString());8889sb.Append("TableName:");90sb.AppendLine(action.TableName);9192sb.Append("TimeOut:");93sb.AppendLine(action.TimeOut.ToString());9495sb.Append("UI对象:");96sb.AppendLine(action.UI.ToString());9798dt=action.Data.Columns.ToTable();99}100dt.Bind(dgvView);101rtxtSql.Text=sb.ToString();102}103104privatevoidbtnPara_Click(objectsender,EventArgse)105{106MDataTabledt;107using(MActionaction=newMAction("Users"))108{109action.SetPara("Name","0%",DbType.String);110dt=action.Select("Namelike@Name");111}112dt.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下载地址:/svn/cyqopen/trunk/CYQ.Data.GettingStarted/

5:谢谢支持!

如果觉得《cyq.data 连接mysql_CYQ.Data V5 从入门到放弃ORM系列》对你有帮助,请点赞、收藏,并留下你的观点哦!

本内容不代表本网观点和政治立场,如有侵犯你的权益请联系我们处理。
网友评论
网友评论仅供其表达个人看法,并不表明网站立场。