zoukankan      html  css  js  c++  java
  • DataTable转对象Model

    我们经常需要从数据库表中取数,取数是以取DataTable的方式,但是我么希望以对象为单位进行这种操作。即存在把取到的DataTable(数据表)转换为ModelList(对象集合)的需求。
    原理稍微复杂,因此我画了一下:
    这是DataSet中的DataTable

    这是DataTable如何转换成ModelList(对象集合),这样我们就能从对象集合里取到对应对象来以对象为单位进行传数

    完成此功能需要以下函数:

    返回DataTable具体位置的值时需要 NvlReturn函数,这里写了四种,逻辑是判断某个值是否为空值,若不为空值则输出,若为空值,返回指定值(Int Long String Double四种类型)

    Int类型

            public static int NvlReturnInt(object obj)
            {
                try
                {
                    if (obj != null) return obj.ToString().Length == 0 ? 0 : Convert.ToInt32(obj);
                    return 0;
                }
                catch
                {
                    return 0;
                }
            }
    

    Long类型

            public static long NvlReturnLong(object obj)
            {
                try
                {
                    if (obj != null)
                        return obj.ToString().Length == 0 ? 0 : Convert.ToInt64(obj);
                    return 0;
                }
                catch
                {
                    return 0;
                }
            }
    

    String类型

            public static string NvlReturnString(object strObject, bool blTrim = false, bool blUpper = false)
            {
                try
                {
                    if (strObject == null) return string.Empty;
                    var returnString = strObject.ToString();
                    if (blTrim) returnString = returnString.Trim();
                    if (blUpper) returnString = returnString.ToUpper();
                    return returnString;
                }
                catch
                {
                    return string.Empty;
                }
            }
    

    Double类型

            public static double NvlReturnDouble(object obj)
            {
                try
                {
                    if (obj != null) return obj.ToString().Length == 0 ? 0 : Convert.ToDouble(obj);
                    return 0;
                }
                catch
                {
                    return 0;
                }
            }
    

    把DataTable表的每一行转换成一个对象,这需要我们把每一行的每一个位置一个个输入对象的属性,类似把一个二维表(DataTable)输入一个一维表(对象)的集合,这个表转换成为一个对象的集合,传入的表在这里被称为ThisTable

            public static List<T> ConvertDataTableToModel<T>(DataTable ThisTable)
            {
    
                //使用typeof运算符来获取Type对象,只需要提供类型名作为操作数,会返回Type对象的引用
                //var ModelType = typeof运算(XXXClass)希望的Type对象类型;
                var ModelType = typeof(T);
                if (ThisTable == null || ThisTable.Rows.Count == 0)
                    return null;
                var ModelList = new List<T>();
    
                var DataRowCollection = ThisTable.Rows;
                var DataColumnCollection = ThisTable.Columns;
                //两层循环来遍历这个二维数组
                //第一层循环,循环行
                foreach (DataRow DR in DataRowCollection)//DataRow类的DR表示 DataTable 中的一行数据。
                {
                    var a = DR[ThisTable.Columns[0]];//a是这个这么多行里的一行,并且每次循环会换一下(相当于各个行组成个数组,a是i,++a)
    
                    var Model = ModelType.Assembly.CreateInstance(ModelType.FullName);//从此程序集中查找某个类型,然后使用系统激活器创建它的实例。FullName获取该类型的完全限定名称,包括其命名空间,但不包括程序集
                    //第二层循环,循环每行中的属性
                    foreach (var p in Model.GetType().GetProperties())//GetType得到运行时的类,GetProperties返回这个类的所有公共属性。在这一行a中,p是这个属性里的一项,并且每次循环会换一下(相当于属性组成个数组,p是i,++p)
                    {
                        if (DR[DataColumnCollection[p.Name]] is DBNull)//Name获取当前成员的名称。p.Name就是当前行当前列的属性名
                        {
                            p.SetValue(Model, null);
                        }
                        else
                        {
                            switch (p.PropertyType.Name)//switch(p这个属性的.属性类型.属性类型名)
                            {
                                case "Int":
                                    p.SetValue(Model, PubFunc.NvlReturnInt(DR[DataColumnCollection[p.Name]]));
                                    break;
                                case "Long":
                                    p.SetValue(Model, PubFunc.NvlReturnLong(DR[DataColumnCollection[p.Name]]));
                                    break;
                                case "String":
                                    p.SetValue(Model, PubFunc.NvlReturnString(DR[DataColumnCollection[p.Name]]));
                                    break;
                                case "Double":
                                    p.SetValue(Model, PubFunc.NvlReturnDouble(DR[DataColumnCollection[p.Name]]));
                                    break;
                                default:
                                    p.SetValue(Model, null);
                                    break;
                            }
                        }
                        ModelList.Add((T)Model);
                    }               
                }
                return ModelList;
            }
    

    使用注意!使用注意!使用注意!使用注意!使用注意!使用注意!

    首先,要求数据库中你使用的这张数据表的各个字段,与你要转换成类的类型完全相同,即你的表中字段的名字要与你定义的类的属性一一对应。
    举例:(我特意定义了一个数据库中表传数据专用的类(TableInfo),来实现字段与属性的一一对应)
    这里是Sqlite可视化应用里显示的数据库表结构

    这里是Model层定义的专用类(TableInfo)

    这里sqlite数据库表中的字段与专用类(TableInfo)中的属性必须一一对应!

    我原本用来作为传输单位的类(UserInfo)结构比这个特地定义的数据库中表传数据专用的类(TableInfo)包含的属性多一些

    然后调用时候的方式是这样的

    这个函数返回true,在UI层就可以接收到true的返回值

    程序会弹出 登录成功!

  • 相关阅读:
    【黑金原创教程】【FPGA那些事儿-驱动篇I 】实验二十六:VGA模块
    mini2440 u-boot下设置tftp
    mini2440 u-boot禁止蜂鸣器
    【转载】帧缓冲驱动程序分析及其在BSP上的添加
    debian7 amd64版本添加对x86包的支持
    debian7配置
    u盘安装debian 7(Wheezy) stabe
    【python练习题】实现字符串反转
    【python练习题】 删除列表中的重复元素(list的应用)
    【python练习题】冒泡排序 和插入排序 (list的应用)
  • 原文地址:https://www.cnblogs.com/maomaodesu/p/11497965.html
Copyright © 2011-2022 走看看