CYQ.Data V5 從入門到放棄ORM系列:教程 - MAction類使用

来源:http://www.cnblogs.com/cyq1162/archive/2016/07/18/5681000.html
-Advertisement-
Play Games

隨著V5框架使用者的快速增加,終於促使我開始對整個框架編寫完整的Demo。上周大概花了一星期的時間,每天寫到夜裡3點半,終完成了框架所有功能的Demo。同時,按V5框架名稱空間的順序,對每個類的使用,補充相應的文章介紹,以漏補缺。 ...


背景:

隨著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:謝謝支持!


您的分享是我們最大的動力!

-Advertisement-
Play Games
更多相關文章
  • 設計界面: 代碼: using System; using System.Collections.Generic; using System.ComponentModel; using System.Drawing; using System.Data; using System.Linq; usi ...
  • 前幾天,領導讓我找一下老系統(Java)里getRemoteUser方法都哪個文件用了,package是什麼,方法被調用了多少次,當時因為著急,所以,直接人工找的,但是以後要是再出現,人工找就太討厭了,畢竟程式員以懶著稱,因此,寫了一個小工具進行查詢。 一、效果圖 從圖中不難看出,現在的功能只能查詢 ...
  • 先看一段代碼,本文所有的例子,都是在這段代碼的基礎上進行的. 一個矩形rec,放到佈局容器內,這個矩形就是被動畫控制的對象,一個double類型的動畫. 以前我後臺寫動畫,都是通過先給對象註冊名稱,通過名稱,把對象(Rectangle)和動畫(DoubleAnimation)通過Storyboard ...
  • 快捷鍵是Ctrl+F8 快捷鍵是Ctrl+Shift +Alt +A ...
  • 作為一個菜鳥,避免不了被老鳥罵爹,但是如果能有一手漂亮的代碼給你作盾牌,多少能擋掉不少的鋒芒,作為菜鳥中的菜鳥的我,便嘗試起了重構自己的代碼。 這是一種不堪的憂傷…… 首先,教材入手《重構:改善即有代碼的設計》,重點是PDF版本,又是憂傷,買本書都沒錢了,又是一種憂傷…… 然後就對著書,邊學習,便嘗... ...
  • 在我們前面的代碼中已經接觸到了C#的類(class)還有類的方法。我們的代碼主要都放在Program 類的Main方法裡邊。我們也創建了我們自己的方法。同時我們也使用了類Console的writeline等方法。但是我想到目前為止我們還是不是很清楚類是一個什麼東西。接下來我就給大家介紹一下類還有面向 ...
  • 在離線環境中使用.NET Core 0x00 寫在開始 很早開始就對.NET Core比較關註,一改微軟之前給人的印象,變得輕量、開源、跨平臺。最近打算試著在工作中使用。但工作是在與互聯網完全隔離的網路中進行的,因此就開始了在離線環境中部署.NET Core開發環境的嘗試。總的來說還是比較蛋疼的,幾 ...
  • 分頁和排序,應該是軟體開發中,需要必知必會的技能了,對於分頁,網上很多教程,當然,別人終究是別人的,只有自己理解,會了,並且吸收之後,再用自己的語言,傳授出來,這才是硬道理。好了,廢話說多了。現在我們進入正題: 這裡,我打算使用EF Code-First方式分頁控制項就是用PagedList.MVC, ...
一周排行
    -Advertisement-
    Play Games
  • 移動開發(一):使用.NET MAUI開發第一個安卓APP 對於工作多年的C#程式員來說,近來想嘗試開發一款安卓APP,考慮了很久最終選擇使用.NET MAUI這個微軟官方的框架來嘗試體驗開發安卓APP,畢竟是使用Visual Studio開發工具,使用起來也比較的順手,結合微軟官方的教程進行了安卓 ...
  • 前言 QuestPDF 是一個開源 .NET 庫,用於生成 PDF 文檔。使用了C# Fluent API方式可簡化開發、減少錯誤並提高工作效率。利用它可以輕鬆生成 PDF 報告、發票、導出文件等。 項目介紹 QuestPDF 是一個革命性的開源 .NET 庫,它徹底改變了我們生成 PDF 文檔的方 ...
  • 項目地址 項目後端地址: https://github.com/ZyPLJ/ZYTteeHole 項目前端頁面地址: ZyPLJ/TreeHoleVue (github.com) https://github.com/ZyPLJ/TreeHoleVue 目前項目測試訪問地址: http://tree ...
  • 話不多說,直接開乾 一.下載 1.官方鏈接下載: https://www.microsoft.com/zh-cn/sql-server/sql-server-downloads 2.在下載目錄中找到下麵這個小的安裝包 SQL2022-SSEI-Dev.exe,運行開始下載SQL server; 二. ...
  • 前言 隨著物聯網(IoT)技術的迅猛發展,MQTT(消息隊列遙測傳輸)協議憑藉其輕量級和高效性,已成為眾多物聯網應用的首選通信標準。 MQTTnet 作為一個高性能的 .NET 開源庫,為 .NET 平臺上的 MQTT 客戶端與伺服器開發提供了強大的支持。 本文將全面介紹 MQTTnet 的核心功能 ...
  • Serilog支持多種接收器用於日誌存儲,增強器用於添加屬性,LogContext管理動態屬性,支持多種輸出格式包括純文本、JSON及ExpressionTemplate。還提供了自定義格式化選項,適用於不同需求。 ...
  • 目錄簡介獲取 HTML 文檔解析 HTML 文檔測試參考文章 簡介 動態內容網站使用 JavaScript 腳本動態檢索和渲染數據,爬取信息時需要模擬瀏覽器行為,否則獲取到的源碼基本是空的。 本文使用的爬取步驟如下: 使用 Selenium 獲取渲染後的 HTML 文檔 使用 HtmlAgility ...
  • 1.前言 什麼是熱更新 游戲或者軟體更新時,無需重新下載客戶端進行安裝,而是在應用程式啟動的情況下,在內部進行資源或者代碼更新 Unity目前常用熱更新解決方案 HybridCLR,Xlua,ILRuntime等 Unity目前常用資源管理解決方案 AssetBundles,Addressable, ...
  • 本文章主要是在C# ASP.NET Core Web API框架實現向手機發送驗證碼簡訊功能。這裡我選擇是一個互億無線簡訊驗證碼平臺,其實像阿裡雲,騰訊雲上面也可以。 首先我們先去 互億無線 https://www.ihuyi.com/api/sms.html 去註冊一個賬號 註冊完成賬號後,它會送 ...
  • 通過以下方式可以高效,並保證數據同步的可靠性 1.API設計 使用RESTful設計,確保API端點明確,並使用適當的HTTP方法(如POST用於創建,PUT用於更新)。 設計清晰的請求和響應模型,以確保客戶端能夠理解預期格式。 2.數據驗證 在伺服器端進行嚴格的數據驗證,確保接收到的數據符合預期格 ...