加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 综合聚焦 > 服务器 > 安全 > 正文

一个实例化的DATATABLE的类

发布时间:2020-12-17 02:02:18 所属栏目:安全 来源:网络整理
导读:silverlight调用webservice,关键是调用类的实体。而原先编程基于dataSet的模式。因此必要提出了dataset与实体之间的转化方法: ?????? List灌溉计划 jh = new List灌溉计划(); ??????? string sql = "select * from [灌溉计划]"; ??????? DataSet ds = dm.g

silverlight调用webservice,关键是调用类的实体。而原先编程基于dataSet的模式。因此必要提出了dataset与实体之间的转化方法:

?????? List<灌溉计划> jh = new List<灌溉计划>();
??????? string sql = "select * from [灌溉计划]";
??????? DataSet ds = dm.getsql(sql);
??????? jh=USTC.Func.ConvertDataTableToEntityCollections<灌溉计划>(ds.Tables[0]);//调用下面方法即可
??????? return jh.ToArray();

其中的灌溉计划是数据库表的实体类,可以通过直接建立linq的表实体,拖曳而成型

?

using System;
using System.Collections.Generic;
using System.Data;
using System.Reflection;

namespace USTC
{
??? /// <summary>
??? /// 数据服务基类对象
??? /// </summary>
??? public class DataServiceBase
??? {
??????? DM dm = new DM();
??????? #region Tabel 类型转换相关
??????? /// <summary>
??????? /// 转化Table成一个相对应的实体类集合
??????? /// </summary>
??????? /// <typeparam name="T"></typeparam>
??????? /// <param name="table"></param>
??????? /// <returns></returns>
??????? public? List<T> ConvertDataTableToEntityCollections<T>(DataTable table)
??????????? where T : class,new()
??????? {
??????????? if (table != null)
??????????? {
??????????????? Type tc =? typeof(T);
??????????????? List<T> list = new List<T>(table.Rows.Count);

??????????????? foreach (DataRow row in table.Rows)
??????????????? {
??????????????????? T t = new T();
??????????????????? foreach (PropertyInfo pInfo in tc.GetProperties())
??????????????????? {
??????????????????????? if (table.Columns.Contains(pInfo.Name))
??????????????????????? {
??????????????????????????? //HACK: 对象转换成指定的类型使用 Convert.ChangeType
??????????????????????????? // Convert.ChangeType(row[pInfo.Name],pInfo.PropertyType);
??????????????????????????? try
??????????????????????????? {
??????????????????????????????? pInfo.SetValue(t,ChangeType(row[pInfo.Name],pInfo.PropertyType),null);
??????????????????????????? }
??????????????????????????? catch (Exception ex)
??????????????????????????? {
??????????????????????????????? throw ex;
??????????????????????????? }
??????????????????????? }
??????????????????? }
??????????????????? list.Add(t);
??????????????? }
??????????????? return list;
??????????? }
??????????? return null;
??????? }
??????? /// <summary>
??????? /// 得到指定SQL执行的结果并返回结果的实体类集合对象
??????? /// 本方法综合了 ConvertDataTableToEntityCollections/ExecuteSQL 方法
??????? /// </summary>
??????? /// <typeparam name="T"></typeparam>
??????? /// <param name="sql">待执行的SQL</param>
??????? /// <returns></returns>
??????? public? List<T> GetEntityConllectionsFromSQL<T>(string sql)
??????????? where T : class,new()
??????? {
??????????? if (string.IsNullOrEmpty(sql))
??????????????? return null;
??????????? else
??????????????? return ConvertDataTableToEntityCollections<T>(dm.getsql(sql).Tables[0]);
??????? }
??????? /// <summary>
??????? /// 得到指定类型公开的属性
??????? /// </summary>
??????? /// <param name="type"></param>
??????? /// <returns></returns>
??????? private? PropertyInfo[] GetTypePropertyInfo(Type type)
??????? {
??????????? PropertyInfo[] infos = null;
??????????? //锁定防止 多次 ADD 进缓存
??????????? lock (_PROPERTYINFO_READ_LOCK)
??????????? {
??????????????? _PropertyInfoCache.TryGetValue(type,out infos);
??????????????? if (infos == null)
??????????????? {
??????????????????? infos = type.GetProperties();
??????????????????? _PropertyInfoCache.Add(type,infos);
??????????????? }
??????????? }
??????????? return infos;
??????? }
??????? /// <summary>
??????? /// 类型转换
??????? /// FROM: http://www.cnblogs.com/cnee5/archive/2006/05/21/405403.html
??????? /// </summary>
??????? /// <param name="value"></param>
??????? /// <param name="conversionType"></param>
??????? /// <returns></returns>
??????? protected?? object ChangeType(object value,Type conversionType)
??????? {
??????????? //INFO 对DBNull类型特殊处理
??????????? if (Convert.IsDBNull(value))
??????????? {
??????????????? //非可空类型的值类型处理
??????????????? if (!(conversionType.IsGenericType &&
??????????????????? conversionType.GetGenericTypeDefinition().Equals(typeof(Nullable<>))))
??????????????? {
??????????????????? if (!conversionType.IsValueType)
??????????????????????? return null;
??????????????????? else
??????????????????????? return Activator.CreateInstance(conversionType);
??????????????? }
??????????????? else
??????????????????? return null;
??????????? }
??????????? //可空类型类型处理
??????????? if (conversionType.IsGenericType &&
??????????????????? conversionType.GetGenericTypeDefinition().Equals(typeof(Nullable<>)))
??????????? {
??????????????? if (value == null)
??????????????????? return null;

??????????????? System.ComponentModel.NullableConverter nullableConverter
??????????????????? = new System.ComponentModel.NullableConverter(conversionType);

??????????????? conversionType = nullableConverter.UnderlyingType;
??????????? }

??????????? return Convert.ChangeType(value,conversionType);??????? }??????? private static object _PROPERTYINFO_READ_LOCK = new object();??????? /// <summary>??????? /// 实体类属性缓存??????? /// </summary>??????? private static Dictionary<Type,PropertyInfo[]> _PropertyInfoCache = new Dictionary<Type,PropertyInfo[]>();??????? #endregion??? }}

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读