C# DataTable与Model互转的示例代码

/// <summary>
 /// 实体转换辅助类
 /// </summary>
 public class ModelConvertHelper<T> where T : new()
 {
  /// <summary>
  /// List泛型转换DataTable.
  /// </summary>
  public DataTable ListToDataTable<T>(List<T> items)
  {
   var tb = new DataTable(typeof(T).Name);

   PropertyInfo[] props = typeof(T).GetProperties(BindingFlags.Public | BindingFlags.Instance);

   foreach (PropertyInfo prop in props)
   {
    Type t = GetCoreType(prop.PropertyType);
    tb.Columns.Add(prop.Name, t);
   }

   foreach (T item in items)
   {
    var values = new object[props.Length];

    for (int i = 0; i < props.Length; i++)
    {
     values[i] = props[i].GetValue(item, null);
    }

    tb.Rows.Add(values);
   }

   return tb;
  }

  /// <summary>
  /// model转换DataTable
  /// </summary>
  /// <typeparam name="T"></typeparam>
  /// <param name="items"></param>
  /// <returns></returns>
  public DataTable ModelToDataTable<T>(T items)
  {
   var tb = new DataTable(typeof(T).Name);

   PropertyInfo[] props = typeof(T).GetProperties(BindingFlags.Public | BindingFlags.Instance);

   foreach (PropertyInfo prop in props)
   {
    Type t = GetCoreType(prop.PropertyType);
    tb.Columns.Add(prop.Name, t);
   }

   var values = new object[props.Length];

   for (int i = 0; i < props.Length; i++)
   {
    values[i] = props[i].GetValue(items, null);
   }

   tb.Rows.Add(values);

   return tb;
  }

  /// <summary>
  /// Determine of specified type is nullable
  /// </summary>
  public static bool IsNullable(Type t)
  {
   return !t.IsValueType || (t.IsGenericType && t.GetGenericTypeDefinition() == typeof(Nullable<>));
  }

  /// <summary>
  /// Return underlying type if type is Nullable otherwise return the type
  /// </summary>
  public static Type GetCoreType(Type t)
  {
   if (t != null && IsNullable(t))
   {
    if (!t.IsValueType)
    {
     return t;
    }
    else
    {
     return Nullable.GetUnderlyingType(t);
    }
   }
   else
   {
    return t;
   }
  }

  /// <summary>
  /// DataTable转换泛型List
  /// </summary>
  /// <param name="dt"></param>
  /// <returns></returns>
  public static List<T> DataTableToList(DataTable dt)
  {
   // 定义集合
   List<T> ts = new List<T>();

   // 获得此模型的类型
   Type type = typeof(T);
   string tempName = "";
   foreach (DataRow dr in dt.Rows)
   {
    T t = new T();
    // 获得此模型的公共属性
    PropertyInfo[] propertys = t.GetType().GetProperties();
    foreach (PropertyInfo pi in propertys)
    {
     tempName = pi.Name; // 检查DataTable是否包含此列

     if (dt.Columns.Contains(tempName))
     {
      // 判断此属性是否有Setter
      if (!pi.CanWrite) continue;

      object value = dr[tempName];
      if (value != DBNull.Value)
       pi.SetValue(t, value, null);
     }
    }
    ts.Add(t);
   }
   return ts;
  }

  public static T DataTableToModel(DataTable dt)
  {
   // 定义实体
   T t = new T();

   // 获得此模型的类型
   Type type = typeof(T);
   string tempName = "";

   foreach (DataRow dr in dt.Rows)
   {

    // 获得此模型的公共属性
    PropertyInfo[] propertys = t.GetType().GetProperties();
    foreach (PropertyInfo pi in propertys)
    {
     tempName = pi.Name; // 检查DataTable是否包含此列

     if (dt.Columns.Contains(tempName))
     {
      // 判断此属性是否有Setter
      if (!pi.CanWrite) continue;

      object value = dr[tempName];
      if (value != DBNull.Value)
       pi.SetValue(t, value, null);
     }
    }
    break;
   }
   return t;
  }
 }

以上就是C#DataTable与Model互转的示例代码的详细内容,更多关于C#DataTable与Model互转的资料请关注我们其它相关文章!

(0)

相关推荐

  • C# DataTable常见用法汇总

    C# DataTable 的常见用法: (1)新建数据表. DataTable dt=new DataTable();如果带个String参数,此参数表示表名. (2)向表添加列. //数据库的Nvarchar等类型,在此可用String兼容.可不指明数据类型 DataColumn dc = new DataColumn("商品编号", typeof(system.string)); dt.Columns.Add(dc); (3)设置表特定行与列的数据值. dt.Rows[i].Set

  • C#实现DataTable映射成Model的方法(附源码)

    本文实例讲述了C#实现DataTable映射成Model的方法.分享给大家供大家参考,具体如下: 这是数据库开发中经常遇到的问题,当然,这可以用现成的ORM框架来解决,但有些时候,如果DataSet/DataTable是第三方接口返回的,ORM就不方便了,还得自己处理. 反射自然必不可少的,另外考虑到DataTable中的ColumnName通常与Model的PropertyName并不严格对应,可以用Attribute来记录这种映射关系. 步骤1:先创建一个DataFieldAttribute

  • C#实现利用泛型将DataSet转为Model的方法

    本文实例讲述了C#实现利用泛型将DataSet转为Model的方法.分享给大家供大家参考.具体如下: 因为网站需要用C#开发,习惯了java的泛型,所以看了一下C#下,也可以这样做,随便写了一个. public static List<T> PutAllVal<T>(T entity, DataSet ds) where T : new() { List<T> lists = new List<T>(); if (ds.Tables[0].Rows.Coun

  • 详解C#把DataTable中数据一次插入数据库的方法

    现在实际的情况是这样的: 客户有一台打卡机,员工打卡的信息全部储存在打卡机的Access数据库里面,现在客户引入了一种新的管理系统,需要将Access数据库中的打卡数据同步到SQL Server数据库中,由于时间比较久,数据积累了有40多万条. 软件功能: 选择Access数据库文件,填入目标SQL Server数据库的IP地址,然后开始进行同步. 实现方法: 1.先把Access数据库中要导入的数据存入DataTable中 配置文件中的数据库连接字符串 <connectionStrings>

  • C#读取Excel到DataTable的方法示例

    前提 在Windows下进行数据处理的时候最常见的情况莫过于读取Microsoft的Excel文件了,Excel的普及率惊人,是事实上的标准.以前的开发中我采用调用第三方类库 NPOI的方式来处理Excel.这个方式有两个缺点: 需要依赖第三方类库NPOI NPOI支持几乎全功能的Office条件,缺点就是复杂度也高. 如果只是简单的导入数据,完全可以有更加简单的方案,方案的限制条件为: 只支持Windows平台 只读取Excel文件 支持xls和xlsx文件格式 依赖 还是有依赖的 2007

  • C#实现Json转DataTable并导出Excel的方法示例

    本文实例讲述了C#实现Json转DataTable并导出Excel的方法.分享给大家供大家参考,具体如下: 需求:有一个log文件,需要整理成Excel,日志文件里面的数据都是json字符串 思路是,把Json字符串转换成DataTable,然后导出到Excel 在网上找了一些资料,整理了以下三种类型的Json 一.Json转换DataTable 1.处理简单Json: [{"mac":"20:f1:7c:c5:cd:80","rssi":&qu

  • C#中DataTable 转实体实例详解

    因为Linq的查询功能很强大,所以从数据库中拿到的数据为了处理方便,我都会转换成实体集合List<T>. 开始用的是硬编码的方式,好理解,但通用性极低,下面是控件台中的代码: using System; using System.Collections.Generic; using System.Data; using System.Linq; using System.Text; using System.Threading.Tasks; namespace Demo1 { class Pr

  • C# MVC模式中应该怎样区分应用程序逻辑(Controller层)和业务逻辑(Model层)?

    现在的大部分框架都是 MVC 模式,但 MVC 三个部分怎么配合,这里做了一点总结: 基本原则:业务逻辑代码应该写在 M 里面,而应用程序逻辑应该写在 C 里面.V 只是单纯的展示数据. 举个简单例子吧:用户往购物车添加一个商品 用户点击商品的"添加到购物车"按钮,引起一次请求.服务器开始处理该请求,过程: 1.检查当前用户是否有权限(比如是否已经登录.用户帐户状态.是否可以购物等) 2.检查要添加的商品ID是否有效. 3.检查要添加的商品库存是否足够 4.将商品加入购物车,并保存购物

  • C# DataTable与Model互转的示例代码

    /// <summary> /// 实体转换辅助类 /// </summary> public class ModelConvertHelper<T> where T : new() { /// <summary> /// List泛型转换DataTable. /// </summary> public DataTable ListToDataTable<T>(List<T> items) { var tb = new D

  • Spring Security OAuth2 实现登录互踢的示例代码

    本文主要介绍了Spring Security OAuth2 实现登录互踢的示例代码,分享给大家,具体如下: 背景说明 一个账号只能一处登录,类似的业务需求在现有后管类系统是非常常见的. 但在原有的 spring security oauth2 令牌方法流程(所谓的登录)无法满足类似的需求. 我们先来看 TokenEndpoint 的方法流程 客户端 带参访问 /oauth/token 接口,最后去调用 TokenGranter TokenGranter 根据不同的授权类型,获取用户认证信息 并去

  • laravel model 两表联查示例

    1对一 定义一对一关联 一对一关联是很基本的关联.例如一个 User 模型会对应到一个 Phone . 在 Eloquent 里可以像下面这样定义关联: class User extends Model { public function phone() { return $this->hasOne('App\Phone'); } } 传到 hasOne 方法里的第一个参数是关联模型的类名称.定义好关联之后,就可以使用 Eloquent 的动态属性取得关联对象: $phone = User::f

  • Python+Opencv实现把图片、视频互转的示例

    1. 安装Opencv包 pip install opvencv-python 2.实现代码: 视频转为图片: import cv2 cap=cv2.VideoCapture('E:/video/video-02.mp4') # 获取一个视频打开cap isOpened=cap.isOpened # 判断是否打开 print(isOpened) fps=cap.get(cv2.CAP_PROP_FPS) print(fps) # 获取宽度 width=int(cap.get(cv2.CAP_PR

  • C#实现XML文件与DataTable、Dataset互转

    一.DataTable转XML #region DataTableToXml /// <summary> /// 将DataTable对象转换成XML字符串 /// </summary> /// <param name="ds">DataSet对象</param> /// <returns>XML字符串</returns> public static string DataTableToXml(DataTable

  • ThinkPHP整合datatables实现服务端分页的示例代码

    最近做东西有一个需求,因为数据量很大,在这里我决定使用datatables的服务端分页,同时还需要传递查询条件到服务端.在网上搜索的大部分文章都感觉有些误差,于是自己封装了一下,主要配置/工具为: 服务端:php(使用thinkphp) 页面样式来自于H-ui框架(datatables版本为1.10.0) 主要修改(databases)配置项为: 1) bProcessing:true 使用ajax源 2) serverSide:true 使用服务端分页 3) createdRow:functi

  • C#模拟实现抽奖小程序的示例代码

    目录 1.抽奖主界面 2.操作步骤 2.1 抽奖界面 2.2 抽奖结果导出 3.源码 3.1 数据库连接 3.2 抽奖程序 1.抽奖主界面 2.操作步骤 S键开始: 0.1.2.3.4.5键分别对应6次奖项: 分别是 特等奖.一等奖.二等奖.三等奖.四等奖.五等奖 9键是加抽奖: 空格退出抽奖结果界面: P键关闭气泡效果. 2.1 抽奖界面 2.2 抽奖结果导出 *************特等奖奖获得者:(抽奖时间:2021/12/30 22:41:22)*************** 工号:1

  • ASP.NET MVC4异步聊天室的示例代码

    本文介绍了ASP.NET MVC4异步聊天室的示例代码,分享给大家,具体如下: 类图: Domain层 IChatRoom.cs using System; using System.Collections.Generic; namespace MvcAsyncChat.Domain { public interface IChatRoom { void AddMessage(string message); void AddParticipant(string name); void GetM

  • vue.js实现表格合并示例代码

    前言 由于使用的是vue,想到MVVM是要用数据驱动的思想,所以考虑在Model做手脚,而不是渲染出数据来后做DOM操作,当然基本的CSS还是要有的.因此这个方法对所有数据驱动的框架都有效,比如说Angular和React. 最后的实现效果是这样的: 实现思路 原本的正常表格的代码长这样: <tr v-for="item in items"> <td width="3%">{{ $index + 1 }}</td> <td

  • Java利用Redis实现消息队列的示例代码

    本文介绍了Java利用Redis实现消息队列的示例代码,分享给大家,具体如下: 应用场景 为什么要用redis? 二进制存储.java序列化传输.IO连接数高.连接频繁 一.序列化 这里编写了一个java序列化的工具,主要是将对象转化为byte数组,和根据byte数组反序列化成java对象; 主要是用到了ByteArrayOutputStream和ByteArrayInputStream; 注意:每个需要序列化的对象都要实现Serializable接口; 其代码如下: package Utils

随机推荐