反射+泛型+缓存 ASP.NET的数据层通用类
using System;
using System.Collections.Generic;
using System.Text;
using System.Reflection ;
using System.Data ;
using BaiChang.HealBlog.Model ;
using System.Data.SqlClient;
using BaiChang.SqlDBUtility; namespace BaiChang.Middle.Front
{
public class DataAccess<T>where T:new()
{
#region Main Part public static DataAccess<T> GetDataAccess()
{
string name = "DataAccess" + typeof(T).Name;
DataAccess<T> tObj = Utils.CurrentPage.Cache[name] as DataAccess<T>; object obj = new object();
if (tObj == null)
{
Utils.CurrentPage.Cache[name] = typeof(DataAccess < T>).Assembly.CreateInstance(typeof(DataAccess<T>).Name);
tObj = Utils.CurrentPage.Cache[name] as DataAccess<T>;
}
return tObj;
} public static string ToSetString(string name)
{
string formate = "{0}={1}";
return string.Format(formate, name, name);
} public static List<T> ToModel(SqlDataReader reader)
{
Dictionary<string, PropertyInfo> ps = new Dictionary<string, PropertyInfo>();
foreach (PropertyInfo p in typeof (T).GetProperties ())
{
ps.Add(p.Name, p);
} List<T> ms=new List<T> ();
while (reader.Read())
{
T m = new T();
object[] objs = null;
int count = reader.GetValues(objs);
int i = ;
foreach (object o in objs)
{
ps[reader.GetName(i)].SetValue(m, o, null);
i++;
}
ms.Add(m);
}
return ms;
}
#region Properties
//当前实体类型
Type entityType;
Type type
{
get
{
if(entityType ==null)
entityType = typeof(T);
return entityType;
}
} //实体的所有属性
PropertyInfo[] propertyInfos;
PropertyInfo[] pros
{
get
{
if (propertyInfos == null) propertyInfos = this.type.GetProperties();
return propertyInfos;
}
} //相对应的表名
string _tableName=string.Empty ;
string tableName
{
get
{
if (_tableName == string.Empty)
{
string className = typeof(T).Name; switch (className)
{
case "Users":
case "Role_Node_Permissions":
_tableName = "PE_" + className;
default:
_tableName = "HB_" + className;
}
}
}
}
#endregion
#endregion #region 成员方法 /// <summary>
/// 得到最大ID
/// </summary>
public int GetMaxId()
{
return DbHelperSQL.GetMaxID(pros[].Name , tableName);
} /// <summary>
/// 得到最大值
/// </summary> /// <summary>
/// 是否存在该记录
/// </summary>
public bool Exists(int ID)
{
StringBuilder strSql = new StringBuilder();
strSql.Append("select count(1) from ");
strSql.Append(tableName);
strSql.Append(" where ");
strSql.Append(ToSetString(pros[].Name));
SqlParameter[] parameters = {
new SqlParameter("@"+pros[].Name, SqlDbType.Int,)};
parameters[].Value = ID; return DbHelperSQL.Exists(strSql.ToString(), parameters);
} /// <summary>
/// 增加一条数据
/// </summary>
public int Add(T model)
{
StringBuilder strSql = new StringBuilder(); strSql .Append ("insert into ");
strSql .Append (tableName );
strSql.Append(" ("); //生成XXXvalues(XXX)
int i=;
foreach (PropertyInfo p in pros)
{
strSql .Append (p.Name );
if (i != pros.Length)
strSql.Append(",");
i++;
}
strSql.Append(") values (");
i = ;
foreach (PropertyInfo p in pros)
{
strSql.Append("@");
strSql.Append(p.Name);
if (i != pros.Length)
strSql.Append(",");
i++;
}
strSql.Append(");select @@IDENTITY"); //生成sqlparameters
List<SqlParameter> sqlpars = new List<SqlParameter>();
foreach (PropertyInfo p in pros)
{
SqlParameter sp = new SqlParameter("@" + p.Name, p.GetValue(model, null));
sqlpars.Add(sp);
}
object obj = DbHelperSQL.GetSingle(strSql.ToString(), sqlpars .ToArray ());
if (obj == null)
{
return ;
}
else
{
return Convert.ToInt32(obj);
}
} /// <summary>
/// 更新一条数据
/// </summary>
public void Update(T model)
{
StringBuilder strSql = new StringBuilder();
strSql.Append("update ");
strSql .Append (tableName );
strSql .Append (" set ");
int i=;
foreach (PropertyInfo p in pros)
{
strSql.Append(ToSetString(p.Name));
if(i!=pros.Length )
strSql .Append (",");
i++;
}
strSql.Append(" where ");
strSql.Append(ToSetString(pros[].Name));
//生成sqlparameters
List<SqlParameter> sqlpars = new List<SqlParameter>();
foreach (PropertyInfo p in pros)
{
SqlParameter sp = new SqlParameter("@" + p.Name, p.GetValue(model, null));
sqlpars.Add(sp);
} DbHelperSQL.ExecuteSql(strSql.ToString(), sqlpars .ToArray());
} /// <summary>
/// 删除一条数据
/// </summary>
public void Delete(int ID)
{ StringBuilder strSql = new StringBuilder();
strSql.Append("delete from ");
strSql.Append(tableName);
strSql.Append(" where ");
strSql.Append(ToSetString(pros[].Name));
SqlParameter[] parameters = {
new SqlParameter("@"+pros [].Name, SqlDbType.Int,)};
parameters[].Value = ID; DbHelperSQL.ExecuteSql(strSql.ToString(), parameters);
} /// <summary>
/// 得到一个对象实体
/// </summary>
public T GetModel(int ID)
{ StringBuilder strSql = new StringBuilder();
strSql.Append("select top 1 ");
int i=;
foreach (PropertyInfo p in pros)
{
strSql.Append(ToSetString(p.Name));
if(i!=pros.Length )
strSql .Append (",");
}
strSql .Append (tableName );
strSql.Append(" where ");
strSql.Append(ToSetString(pros[].Name));
SqlParameter[] parameters = {
new SqlParameter("@"+pros[].Name, SqlDbType.Int,)};
parameters[].Value = ID;
List<T> ms;
using (SqlDataReader reader = DbHelperSQL.ExecuteReader(strSql.ToString (), parameters))
{
ms= ToModel(reader);
reader.Close();
}
if (ms.Count > ) return ms[];
else return default (T);
} /// <summary>
/// 获得数据列表
/// </summary>
public List<T> GetList(string strWhere)
{
StringBuilder strSql = new StringBuilder();
strSql.Append("select * ");
strSql.Append(" FROM ");
strSql.Append(tableName);
if (strWhere.Trim() != "")
{
strSql.Append(" where " + strWhere);
} List<T> ms;
using (SqlDataReader reader = DbHelperSQL.ExecuteReader(strSql.ToString ()))
{
ms = ToModel(reader);
reader.Close();
}
if (ms.Count > ) return ms;
else return null;
} /// <summary>
/// 获得前几行数据
/// </summary>
public List<T> GetList(int Top, string strWhere, string filedOrder)
{
StringBuilder strSql = new StringBuilder();
strSql.Append("select ");
if (Top > )
{
strSql.Append(" top " + Top.ToString());
}
strSql.Append(" * ");
strSql.Append(" FROM ");
strSql.Append(tableName);
if (strWhere.Trim() != "")
{
strSql.Append(" where " + strWhere);
}
strSql.Append(" order by " + filedOrder);
List<T> ms;
using (SqlDataReader reader = DbHelperSQL.ExecuteReader(strSql.ToString ()))
{
ms = ToModel(reader);
reader.Close();
}
if (ms.Count > ) return ms;
else return null;
} ///<summary>
///分页获取数据列表
///</summary>
public List<T> GetList(int PageSize,int PageIndex,string strWhere)
{
List<T> ms=GetList(strWhere);
int startIndex=, endIndex=;
Utils.GetPageArea(ref startIndex, ref endIndex, PageIndex, PageSize, ms.Count);
List<T> result = new List<T>();
for (int i = startIndex; i <= endIndex; i++)
{
result.Add(ms[i]);
}
return result;
} #endregion 成员方法 }
}
一点想法+一点尝试
还有些问题有待解决^_^
作者:today4king
转载:http://www.cnblogs.com/jinzhao/archive/2009/07/24/1530213.html
反射+泛型+缓存 ASP.NET的数据层通用类的更多相关文章
- Hibernate 数据层基类实现
提取经常操作表如新增.修改.删除.查询.分页查询.统计等业务功能,形成基类,用泛型传参,有利于每个实体对象数据层继承. package com.base.dao; import java.io.Ser ...
- .NET基础篇——Entity Framework 数据转换层通用类
在实现基础的三层开发的时候,大家时常会在数据层对每个实体进行CRUD的操作,其中存在相当多的重复代码.为了减少重复代码的出现,通常都会定义一个共用类,实现相似的操作,下面为大家介绍一下Entity F ...
- C# 基于MySQL的数据层基类(MySQLHelper)
这里介绍下比较简单的方式,引用MySql.Data.dll然后添加一个MySqlHelper类来对MySql数据库进行访问和操作. 1.将MySql.Data.dll引用到你的项目中 下载地址:MyS ...
- 使用SqlSugar封装的数据层基类
首先简单封装了个DbContext public class DbContext { #region 属性字段 private static string _connectionString; /// ...
- BaseDAL最牛数据层基类2
using System; using System.Data.Entity; using System.Linq; using System.Threading.Tasks; using Syste ...
- BaseDAL数据层基类1
/// <summary> /// EF数据库操作基类 /// </summary> /// <typeparam name="T"></ ...
- ASP.NET JSON数据转实体类方式
实体类 public class FlieList { public string file_unid { get; set; } public string file_name { get; set ...
- ASP.NET HTTP模拟提交通用类 GET POST
用法: WebRequestSugar ws = new WebRequestSugar(); //可选参数 //ws.SetAccept //ws.SetContentType //ws.SetC ...
- MVC缓存02,使用数据层缓存,添加或修改时让缓存失效
在"MVC缓存01,使用控制器缓存或数据层缓存"中,在数据层中可以设置缓存的有效时间.但这个还不够"智能",常常希望在编辑或创建的时候使缓存失效,加载新的数据. ...
随机推荐
- swift中editingStyleForRowAtIndexPath的写法
效果图: 首先要实现这句tableView.setEditing(true, animated: true)才能弹出左侧的小圆圈 然而在oc中tableview删除的写法百度一下很常见但是swift中 ...
- 查看Linux内核版本命令
一.查看Linux内核版本命令(两种方法): .cat /proc/version .uname -a 二.查看Linux系统版本的命令(3种方法): .lsb_release -a即可列出所有版本信 ...
- Spring整合Hibernate。。。。
环境搭建,在eclipse中导入spring和hibernate框架的插件,和导入所有使用到的架包 首先,hibernate的创建: 建立两个封装类,其中封装了数据库中表的属性,这儿只写属性,gett ...
- Android官方数据绑定框架DataBinding
数据绑定框架给我们带来了更大的方便性,以前我们可能需要在Activity里写很多的findViewById,烦人的代码也增加了我们代码的耦合性,现在我们马上就可以抛弃那么多的findViewById. ...
- Android动画Drawable Animation
Drawable Animation是逐帧动画,那么使用它之前必须先定义好各个帧.我们可以通过代码定义,也可以使用xml文件定义,一般使用后者.如下: <?xml version="1 ...
- QT笔记之不规则窗口的实现
QT实现的不规则窗口,是根据图片的形状显示 1.去标题栏 2.设置窗口背景为透明色 3.最后给窗口设置背景色 注:背景图为镂空的 格式为.png 图片资源下载:http://pan.baidu.com ...
- 我的android学习经历36
最近把android的基础知识都学的差不多了,也写了许多demo,就想自己写一个app,可是写到后面的时候发现很混乱,所以还是得写一些文档,用xml语言写一下基础的类以及一些其他的东西.所以要想写一个 ...
- Nginx 简介
一.介绍 Nginx是一个高性能的HTTP和反向代理服务器,也是一个IMAP/POP3/SMTP代理服务器. Nginx是一款轻量级的Web服务器/反向代理服务器以及电子邮件代理服务器,并在一个BSD ...
- Java面向对象三大特点之继承
概念: 继承就是子类继承父类的特征和行为,使得子类对象(实例)具有父类的实例域和方法,或子类从父类继承方法,使得子类具有父类相同的行为. 生活中的继承: 兔子和羊属于食草动物类,狮子和豹属于食肉动物类 ...
- akka笔记
Actor UntypedActor actor的基类,继承并实现onReceive方法就可以得到一个Actor. Props 配置类,用Props.create可以创建一个按指定配置生成的Actor ...