CYQ.Data 数据层框架

CYQ.Data 是一款由路过秋天创作的支持多数据库应用[Txt,Xml,Access,MSSQL,Oracle,SQLite,MySql]的底层数据库操作类库,使用本类库可以轻松快速开发项目(QQ群:6033006)。

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

框架技术交流区 | | | 发表日期 :2013/5/22 0:29:51#楼主  
最近有网友问了我 CYQ.Data 要怎么实现批量修改,于是我就给写了以下的示例:

示例为Winform应用,现实对DataGridView控件单元格的内容后,可以实现自动更新到数据库。

先上最终结果图:


接下上一张项目解决方案图:


由于是写Demo,所以我一般都选择用文本数据库做为示例。

我新建了一个Users.ts,内容为:

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

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

对应的标准型枚举文件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通用分页控件实战篇(提供源码下载)




新浪微博粉丝精灵,刷粉丝、刷评论、刷转发、企业商家微博营销必备工具"
游客[注册][106.104.43.*]2013/9/18 1:22:27#1
我想请问,关於app.config有什麽好的保密方法?
回复不用app.config,可以把默认数据库链接写在代码里,对AppConfig.DB.DefaultConn赋值数据库链接也可以全局有效。

发表评论

论坛公告

    数据框架 CYQ.Data QQ群:6033006
    使用本框架进行开发,入门简单,开发效率高,性能优越,更有详尽的API文档,有相关的使用帮助文章、示例文章、更甚有相关的视频教程及辅助工具。 关键还是免费与开源,实在是居家旅行、项目开发、学习研究的必备良品!!!!!!


    在线帮助:欢迎联系

帖子搜索