背景:
随着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:谢谢支持!
本博客Android APP 下载 |
![]() |
支持我们就给我们点打赏 |
![]() |
支付宝打赏 支付宝扫一扫二维码 |
![]() |
微信打赏 微信扫一扫二维码 |
![]() |
如果想下次快速找到我,记得点下面的关注哦!
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· SQL Server 2025 AI相关能力初探
· Linux系列:如何用 C#调用 C方法造成内存泄露
· AI与.NET技术实操系列(二):开始使用ML.NET
· 记一次.NET内存居高不下排查解决与启示
· 探究高空视频全景AR技术的实现原理
· 阿里最新开源QwQ-32B,效果媲美deepseek-r1满血版,部署成本又又又降低了!
· 单线程的Redis速度为什么快?
· SQL Server 2025 AI相关能力初探
· AI编程工具终极对决:字节Trae VS Cursor,谁才是开发者新宠?
· 展开说说关于C#中ORM框架的用法!