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

转载地址:https://blog.csdn.net/cyq1162/article/details/53303611

最近有网友问了我 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通用分页控件实战篇(提供源码下载)

 

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值