• 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:代码:

    复制代码
      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:谢谢支持!

  • 相关阅读:
    SQLite 入门教程(一)基本控制台(终端)命令 (转)
    SQLite 入门教程(二)创建、修改、删除表 (转)
    SQLite 入门教程(三)好多约束 Constraints(转)
    《将博客搬至CSDN》
    Win32的绘图消息大集合
    使用VS开发的一个开机自启动启动、可接收指定数据关闭电脑或打开其他程序
    Android Studio(Kotlin)之RecyclerView
    Unity3D学习笔记
    win10永久激活方法-备份
    oracle整理
  • 原文地址:https://www.cnblogs.com/webenh/p/5681260.html
Copyright © 2020-2023  润新知