CYQ.Data V5 批量插入與批量更新示例


最近有網友問了我 CYQ.Data 要怎么實現批量修改,於是我就花了點時間給寫了以下的示例:

 

 
示例為Winform應用,現實對DataGridView控件單元格的內容后,可以實現自動更新到數據庫。

 

 
先上最終結果圖:
 
 
 

接下上一張項目解決方案圖:

 
 
 

由於是寫Demo,所以我一般都選擇用文本數據庫做為示例。

 
 

我新建了一個Users.ts,內容為:

 
ID,int;
UserName,string;
CreateTime,datetime;
 
 

意思就是表名為“Users”,字段為“ID,UserName,CreateTime”。

 

 
PS:文本數據庫,可用CodeFirst實體類方式,也可以直接用傳統枚舉型方式,以前的文章都是用CodeFirst模式演示,這里就有了枚舉型演示。

 

對應的標准型枚舉文件TableNames.cs內容為:

 
    /// <summary>
    /// TableNames 的摘要說明
    /// </summary>
    public enum TableNames
    {
       Users,
    }
    public enum Users
    {
        ID, UserName, CreateTime
    }
 
 

由於只是示例,可以用V5自帶的工具生成,也可以自己新建手寫了。

 
 
 

接下來先看一下部分代碼:

 

 
首先定義一個全局的MDataTable字段:
 
 public MDataTable table;
 
 

接下來寫個Load函數,頁面加載時顯示下數據,然后綁定到列表控件:

 
        private void LoadData()
        {
            using (MAction action = new MAction(TableNames.Users))
            {
                table = action.Select();
                table.Bind(gvUsers);
            }
        }
 
 

FormLoad的代碼:

 
        private void Form1_Load(object sender, EventArgs e)
        {
            LoadData();
            if (table.Rows.Count < 100)
            {
                //批量添加數據。
                //給table批量添加行。
                MDataRow row = null;
                for (int i = 0; i < 100; i++)
                {
                    row = table.NewRow();
                    row.Set(Users.UserName, "User:" + DateTime.Now.Millisecond);
                    row.Set(Users.CreateTime, DateTime.Now);
                    table.Rows.Add(row);
                }
                //調用表的批量添加。
                table.AcceptChanges(AcceptOp.Insert);
                //重新綁定到控件。
                table.Bind(gvUsers);
            }
        }
 
 

先綁定數據,這樣table就不為Null了,如果一開始沒數據,table也是有數據結構的。

 
判斷如果數據少於100行,下面的幾行代碼就是批量插入了,然后重新綁定到控件。
 
 

如何進行量更新呢?

 
 private void gvUsers_CellValueChanged(object sender, DataGridViewCellEventArgs e)
        {
            
            if (table.AcceptChanges(AcceptOp.Update))
            {
                index++;
                labTip.Text = "數據已更新到數據庫..." + index;
            }
            else
            {
                labTip.Text = "數據更新失敗";
            }
        }
 
 

方法很簡單,只要處理單元格的列值改變狀態就調用一下就可以了。

 
當然了了,由於是批量,你也可以把代碼放到一個按鈕里去,通過按鈕點擊再去確定指更新。

 

 
理論上,指量更新就到這里為止了,這里再補一點內容,就是列的中文顯示:
 
通常我們查詢后,列名都是英文的,但是系統多數是顯示中文的,這里給出一種解決方案:
 
        private void gvUsers_DataBindingComplete(object sender, DataGridViewBindingCompleteEventArgs e)
        {
            FieldKeyValue.FormatHeaderText(gvUsers);
        }
 
 

我們在控件的DataBindingComplete事件里,翻譯一下列頭就可以了。

 
這里我把它封裝到一個FieldKeyValue類里,代碼如下:
 
public class FieldKeyValue
    {
        public static void FormatHeaderText(DataGridView gv)
        {
            for (int i = 0; i < gv.Columns.Count; i++)
            {
                gv.Columns[i].HeaderText = GetName(gv.Columns[i].HeaderText);
            }

        }
        public static string GetName(string key)
        {
            return GetName(key, null);
        }
        public static string GetName(string key, string tableName)
        {
            Dictionary<string, string> dictionary = GetFieldDescriptionDictionary();
 
            if (dictionary != null)
            {
                if (tableName != null && dictionary.ContainsKey(tableName + "_" + key))
                {
                    return dictionary[tableName + "_" + key];
                }
                else if (dictionary.ContainsKey(key))
                {
                    return dictionary[key];
                }
            }
            return key;
        }
        private static Dictionary<string, string> _Dic = null;
        private static Dictionary<string, string> GetFieldDescriptionDictionary()
        {
            if (_Dic == null)
            {
                _Dic = new Dictionary<string, string>();
                #region 字典添加
 
                _Dic.Add("ID", "編號");
                _Dic.Add("UserName", "用戶名");
                _Dic.Add("CreateTime", "創建日期");
 
                #endregion
            }
            return _Dic;
        }
 
 

只要添加字典對應關系就可以了,由於有時候不同的表名,相同字段可能有不同的翻譯,所以字典是支持:

 
 _Dic.Add("TableA_ID", "編號");
 _Dic.Add("TableB_ID", "標識");
 
 

該類會優先判斷查詢“表名_字段名”,如果找不到才找“字段名”。

 

 
最后提供Demo項目源碼下載: CYQ.Data_V5_Test_Win.rar
 
 

對於Winform的分頁,可以下載我的Winform分頁控件:C#Winform通用分頁控件實戰篇(提供源碼下載)

 
 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM