• 反射+泛型+缓存 ASP.NET的数据层通用类


      1 using System;
      2 using System.Collections.Generic;
      3 using System.Text;
      4 using System.Reflection ;
      5 using System.Data ;
      6 using BaiChang.HealBlog.Model ;
      7 using System.Data.SqlClient;
      8 using BaiChang.SqlDBUtility;
      9 
     10 namespace BaiChang.Middle.Front
     11 {
     12     public  class DataAccess<T>where T:new()
     13     {
     14         #region Main Part
     15 
     16         public static DataAccess<T> GetDataAccess()
     17         {
     18             string name = "DataAccess" + typeof(T).Name;
     19             DataAccess<T> tObj = Utils.CurrentPage.Cache[name] as DataAccess<T>;
     20 
     21             object obj = new object();
     22             if (tObj == null)
     23             {
     24                 Utils.CurrentPage.Cache[name] = typeof(DataAccess < T>).Assembly.CreateInstance(typeof(DataAccess<T>).Name);
     25                 tObj = Utils.CurrentPage.Cache[name] as DataAccess<T>;
     26             }
     27             return tObj;
     28         }
     29 
     30         public static string ToSetString(string name)
     31         {
     32             string formate = "{0}={1}";
     33             return string.Format(formate, name, name);
     34         }
     35 
     36         public static List<T> ToModel(SqlDataReader reader)
     37         {
     38             Dictionary<string, PropertyInfo> ps = new Dictionary<string, PropertyInfo>();
     39             foreach (PropertyInfo p in typeof (T).GetProperties ())
     40             {
     41                 ps.Add(p.Name, p);
     42             }
     43 
     44             List<T> ms=new List<T> ();
     45             while (reader.Read())
     46             {
     47                 T m = new T();
     48                 object[] objs = null;
     49                 int count = reader.GetValues(objs);
     50                 int i = 0;
     51                 foreach (object o in objs)
     52                 {
     53                     ps[reader.GetName(i)].SetValue(m, o, null);
     54                     i++;
     55                 }
     56                 ms.Add(m);
     57             }
     58             return ms;
     59         }
     60         #region Properties
     61         //当前实体类型
     62         Type entityType;
     63         Type type
     64         {
     65             get
     66             {
     67                 if(entityType ==null)
     68                 entityType = typeof(T);
     69                 return entityType;
     70             }
     71         }
     72 
     73         //实体的所有属性
     74         PropertyInfo[] propertyInfos;
     75         PropertyInfo[] pros
     76         {
     77             get
     78             {
     79                 if (propertyInfos == null) propertyInfos = this.type.GetProperties();
     80                 return propertyInfos;
     81             }
     82         }
     83 
     84         //相对应的表名
     85         string _tableName=string.Empty ;
     86         string tableName
     87         {
     88             get
     89             {
     90                 if (_tableName == string.Empty)
     91                 {
     92                     string className = typeof(T).Name;
     93 
     94                     switch (className)
     95                     {
     96                         case "Users":
     97                         case "Role_Node_Permissions":
     98                             _tableName = "PE_" + className;
     99                         default:
    100                             _tableName = "HB_" + className;
    101                     }
    102                 }
    103             }
    104         }
    105         #endregion
    106         #endregion
    107 
    108 
    109         #region  成员方法
    110 
    111         /// <summary>
    112         /// 得到最大ID
    113         /// </summary>
    114         public int GetMaxId()
    115         {
    116             return DbHelperSQL.GetMaxID(pros[0].Name , tableName);
    117         }
    118 
    119         /// <summary>
    120         /// 得到最大值
    121         /// </summary>
    122 
    123         /// <summary>
    124         /// 是否存在该记录
    125         /// </summary>
    126         public bool Exists(int ID)
    127         {
    128             StringBuilder strSql = new StringBuilder();
    129             strSql.Append("select count(1) from ");
    130             strSql.Append(tableName);
    131             strSql.Append(" where ");
    132             strSql.Append(ToSetString(pros[0].Name));
    133             SqlParameter[] parameters = {
    134                     new SqlParameter("@"+pros[0].Name, SqlDbType.Int,4)};
    135             parameters[0].Value = ID;
    136 
    137             return DbHelperSQL.Exists(strSql.ToString(), parameters);
    138         }
    139 
    140 
    141         /// <summary>
    142         /// 增加一条数据
    143         /// </summary>
    144         public int Add(T model)
    145         {
    146             StringBuilder strSql = new StringBuilder();
    147 
    148             strSql .Append ("insert into ");
    149             strSql .Append (tableName );
    150             strSql.Append(" (");
    151 
    152             //生成XXXvalues(XXX)
    153             int i=1;
    154             foreach (PropertyInfo p in pros)
    155             {
    156                 strSql .Append (p.Name );
    157                 if (i != pros.Length)
    158                     strSql.Append(",");
    159                 i++;
    160             }
    161             strSql.Append(") values (");
    162             i = 1;
    163             foreach (PropertyInfo p in pros)
    164             {
    165                 strSql.Append("@");
    166                 strSql.Append(p.Name);
    167                 if (i != pros.Length)
    168                     strSql.Append(",");
    169                 i++;
    170             }
    171             strSql.Append(");select @@IDENTITY");
    172             
    173             //生成sqlparameters
    174             List<SqlParameter> sqlpars = new List<SqlParameter>();
    175             foreach (PropertyInfo p in pros)
    176             {
    177                 SqlParameter sp = new SqlParameter("@" + p.Name, p.GetValue(model, null));
    178                 sqlpars.Add(sp);
    179             }
    180             object obj = DbHelperSQL.GetSingle(strSql.ToString(), sqlpars .ToArray ());
    181             if (obj == null)
    182             {
    183                 return 1;
    184             }
    185             else
    186             {
    187                 return Convert.ToInt32(obj);
    188             }
    189         }
    190 
    191         /// <summary>
    192         /// 更新一条数据
    193         /// </summary>
    194         public void Update(T model)
    195         {
    196             StringBuilder strSql = new StringBuilder();
    197             strSql.Append("update ");
    198             strSql .Append (tableName );
    199             strSql .Append (" set ");
    200             int i=1;
    201             foreach (PropertyInfo p in pros)
    202             {
    203                 strSql.Append(ToSetString(p.Name));
    204                 if(i!=pros.Length )
    205                     strSql .Append (",");
    206                 i++;
    207             }
    208             strSql.Append(" where ");
    209             strSql.Append(ToSetString(pros[0].Name));
    210             //生成sqlparameters
    211             List<SqlParameter> sqlpars = new List<SqlParameter>();
    212             foreach (PropertyInfo p in pros)
    213             {
    214                 SqlParameter sp = new SqlParameter("@" + p.Name, p.GetValue(model, null));
    215                 sqlpars.Add(sp);
    216             }
    217 
    218             DbHelperSQL.ExecuteSql(strSql.ToString(), sqlpars .ToArray());
    219         }
    220 
    221         /// <summary>
    222         /// 删除一条数据
    223         /// </summary>
    224         public void Delete(int ID)
    225         {
    226 
    227             StringBuilder strSql = new StringBuilder();
    228             strSql.Append("delete from ");
    229             strSql.Append(tableName);
    230             strSql.Append(" where ");
    231             strSql.Append(ToSetString(pros[0].Name));
    232             SqlParameter[] parameters = {
    233                     new SqlParameter("@"+pros [0].Name, SqlDbType.Int,4)};
    234             parameters[0].Value = ID;
    235 
    236             DbHelperSQL.ExecuteSql(strSql.ToString(), parameters);
    237         }
    238 
    239 
    240         /// <summary>
    241         /// 得到一个对象实体
    242         /// </summary>
    243         public T GetModel(int ID)
    244         {
    245 
    246             StringBuilder strSql = new StringBuilder();
    247             strSql.Append("select  top 1 ");
    248             int i=1;
    249             foreach (PropertyInfo p in pros)
    250             {
    251                 strSql.Append(ToSetString(p.Name));
    252                 if(i!=pros.Length )
    253                     strSql .Append (",");
    254             }
    255             strSql .Append (tableName );
    256             strSql.Append(" where  ");
    257             strSql.Append(ToSetString(pros[0].Name));
    258             SqlParameter[] parameters = {
    259                     new SqlParameter("@"+pros[0].Name, SqlDbType.Int,4)};
    260             parameters[0].Value = ID;
    261             List<T> ms;
    262             using (SqlDataReader reader = DbHelperSQL.ExecuteReader(strSql.ToString (), parameters))
    263             {
    264                  ms= ToModel(reader);
    265                 reader.Close();
    266             }
    267             if (ms.Count > 0) return ms[0];
    268             else return default (T);
    269         }
    270 
    271         /// <summary>
    272         /// 获得数据列表
    273         /// </summary>
    274         public List<T> GetList(string strWhere)
    275         {
    276             StringBuilder strSql = new StringBuilder();
    277             strSql.Append("select * ");
    278             strSql.Append(" FROM ");
    279             strSql.Append(tableName);
    280             if (strWhere.Trim() != "")
    281             {
    282                 strSql.Append(" where " + strWhere);
    283             }
    284 
    285             List<T> ms;
    286             using (SqlDataReader reader = DbHelperSQL.ExecuteReader(strSql.ToString ()))
    287             {
    288                 ms = ToModel(reader);
    289                 reader.Close();
    290             }
    291             if (ms.Count > 0) return ms;
    292             else return null;
    293         }
    294 
    295         /// <summary>
    296         /// 获得前几行数据
    297         /// </summary>
    298         public List<T> GetList(int Top, string strWhere, string filedOrder)
    299         {
    300             StringBuilder strSql = new StringBuilder();
    301             strSql.Append("select ");
    302             if (Top > 0)
    303             {
    304                 strSql.Append(" top " + Top.ToString());
    305             }
    306             strSql.Append(" * ");
    307             strSql.Append(" FROM  ");
    308             strSql.Append(tableName);
    309             if (strWhere.Trim() != "")
    310             {
    311                 strSql.Append(" where " + strWhere);
    312             }
    313             strSql.Append(" order by " + filedOrder);
    314                         List<T> ms;
    315             using (SqlDataReader reader = DbHelperSQL.ExecuteReader(strSql.ToString ()))
    316             {
    317                 ms = ToModel(reader);
    318                 reader.Close();
    319             }
    320             if (ms.Count > 0) return ms;
    321             else return null;
    322         }
    323         
    324 
    325 
    326          ///<summary>
    327          ///分页获取数据列表
    328          ///</summary>
    329         public List<T> GetList(int PageSize,int PageIndex,string strWhere)
    330         {
    331             List<T> ms=GetList(strWhere);
    332             int startIndex=0, endIndex=0;
    333             Utils.GetPageArea(ref startIndex, ref endIndex, PageIndex, PageSize, ms.Count);
    334             List<T> result = new List<T>();
    335             for (int i = startIndex; i <= endIndex; i++)
    336             {
    337                 result.Add(ms[i]);
    338             }
    339             return result;
    340         }
    341 
    342         #endregion  成员方法
    343 
    344 
    345     }
    346 }

    一点想法+一点尝试
    还有些问题有待解决^_^

    作者:today4king

    转载:http://www.cnblogs.com/jinzhao/archive/2009/07/24/1530213.html

  • 相关阅读:
    前端工程师应该具备的三种思维
    7 个 Bootstrap 在线编辑器用于快速开发响应式网站
    js阻止浏览器的默认行为以及停止事件冒泡(用JQuery实现回车提交)
    JAVASCRIPT加密方法,JS加密解密综述(7种)
    JavaScript生成GUID的方法
    js判断是否为手机访问
    Jquery中parent()和parents()
    jQuery中ajax和post处理json的不同
    JQuery实现回车代替Tab键(按回车跳到下一栏)
    js中replace的用法
  • 原文地址:https://www.cnblogs.com/luyuwei/p/4503801.html
Copyright © 2020-2023  润新知