考虑到软件使用在客户端,同时想简化代码的实现,就写了一个泛型的数据访问对象基类,并不是特别健全,按道理应该参数化的方式实现insert和update,暂未使用参数化,抽时间改进。

 /// <summary>
/// DAO基类 实体名必须要与数据表字段名一致
/// </summary>
/// <typeparam name="T"></typeparam>
public class BaseDao<T> where T : new()
{
protected DataModule dataModule = new DataModule(); /// <summary>
/// 表名
/// </summary>
public virtual string TableName { get; set; } /// <summary>
/// 主键ID
/// </summary>
public virtual string PrimaryKey { get; set; } /// <summary>
/// 实体属性
/// </summary>
private PropertyInfo[] properties = null; /// <summary>
/// 实体类型
/// </summary>
private readonly Type t = typeof(T); public BaseDao()
{
t = typeof(T);
properties = t.GetProperties();
} public BaseDao(string tableName, string primaryKey)
: this()
{
this.TableName = tableName;
this.PrimaryKey = primaryKey;
} public string GetMaxID()
{
string sql = "select max(cast(" + PrimaryKey + " as int)) as MaxId from " + TableName;
DataTable dt = dataModule.GetDataTable(sql);
if (dt.Rows[][] == DBNull.Value)
{
return "";
}
else
{
return (Convert.ToInt64(dt.Rows[][]) + ).ToString();
}
} /// <summary>
/// 清除实体字段
/// </summary>
/// <param name="entity"></param>
public void ClearT(ref T entity)
{
entity = default(T);
entity = new T();
} /// <summary>
/// 获取实体
/// </summary>
/// <param name="id"></param>
/// <returns></returns>
public T GetT(string id)
{
string sql = "select * from " + TableName + " where " + PrimaryKey + "='" + id + "'";
DataTable dt = dataModule.GetDataTable(sql);
T entity = new T();
return SetEntityValue(dt, entity);
} /// <summary>
/// 根据多个条件获取实体
/// </summary>
/// <param name="entity"></param>
/// <returns></returns>
public T GetT(T entity)
{
StringBuilder sql = new StringBuilder("select * from " + TableName + " where ");
string where = GetWhereConditionSQL(entity);
sql.Append(where);
DataTable dt = dataModule.GetDataTable(sql.ToString());
return SetEntityValue(dt, entity);
} /// <summary>
/// 保存
/// </summary>
/// <param name="e"></param>
/// <returns></returns>
public bool InsertT(T entity)
{
StringBuilder sql = new StringBuilder(""); if (string.IsNullOrEmpty(TableName))
{
TableName = t.FullName.TrimStart((t.Namespace + ".").ToArray());
}
t.GetProperty(PrimaryKey).SetValue(entity, GetMaxID(), null);
sql.Append(" Insert into " + TableName + " ( ");
StringBuilder insertFields = new StringBuilder("");
StringBuilder insertValues = new StringBuilder("");
foreach (PropertyInfo property in properties)
{
if (property.GetValue(entity, null) != null)
{
insertFields.Append("" + property.Name + ",");
if (property.PropertyType == typeof(string))
{
insertValues.Append("'" + property.GetValue(entity, null).ToString() + "',");
}
else if (property.PropertyType == typeof(DateTime?))
{
insertValues.Append("'" + Convert.ToDateTime(property.GetValue(entity, null)).ToString("yyyy-MM-dd HH:mm:ss") + "',");
}
else if (property.PropertyType == typeof(int?) || property.PropertyType == typeof(long?) || property.PropertyType == typeof(double?) || property.PropertyType == typeof(float?) || property.PropertyType == typeof(decimal?))
{
insertValues.Append("" + property.GetValue(entity, null).ToString() + ",");
}
else
{
insertValues.Append("'" + property.GetValue(entity, null).ToString() + "',");
}
} }
sql.Append(insertFields.ToString().TrimEnd(','));
sql.Append(" ) VALUES ( ");
sql.Append(insertValues.ToString().TrimEnd(','));
sql.Append(")"); return dataModule.ExcuteSql(sql.ToString());
} public bool UpdateT(T entity)
{
StringBuilder sql = new StringBuilder("");
//获取主键ID的值
string id = string.Empty;
if (t.GetProperty(PrimaryKey).GetValue(entity, null) != null)
{
id = t.GetProperty(PrimaryKey).GetValue(entity, null).ToString();
}
if (string.IsNullOrEmpty(TableName))
{
TableName = t.FullName.TrimStart((t.Namespace + ".").ToArray());
} sql.Append(" update " + TableName + " set ");
StringBuilder updateValues = new StringBuilder("");
foreach (PropertyInfo property in properties)
{
if (property.GetValue(entity, null) != null)
{
if (property.PropertyType == typeof(string))
{
updateValues.Append(property.Name + "='" + property.GetValue(entity, null) + "',");
}
else if (property.PropertyType == typeof(DateTime?))
{
updateValues.Append(property.Name + "='" + Convert.ToDateTime(property.GetValue(entity, null)).ToString("yyyy-MM-dd HH:mm:ss") + "',");
}
else if (property.PropertyType == typeof(int?) || property.PropertyType == typeof(long?) || property.PropertyType == typeof(double?) || property.PropertyType == typeof(float?) || property.PropertyType == typeof(decimal?))
{
updateValues.Append(property.Name + "=" + property.GetValue(entity, null) + ",");
}
else
{
updateValues.Append(property.Name + "='" + property.GetValue(entity, null) + "',");
} }
else
                {
                    updateValues.Append(property.Name + "=null,");
                } }
sql.Append(updateValues.ToString().TrimEnd(','));
sql.Append(" where " + PrimaryKey + "=" + id); return dataModule.ExcuteSql(sql.ToString());
} /// <summary>
/// 根据多个字段删除实体
/// </summary>
/// <param name="entity"></param>
/// <returns></returns>
public bool DeleteT(T entity)
{
StringBuilder sql = new StringBuilder("delete from " + TableName + " where ");
string where = GetWhereConditionSQL(entity);
sql.Append(where);
return dataModule.ExcuteSql(sql.ToString());
} /// <summary>
/// 根据主键删除实体
/// </summary>
/// <param name="id"></param>
/// <returns></returns>
public bool DeleteT(string id)
{
StringBuilder sql = new StringBuilder("delete from " + TableName + " where " + PrimaryKey + "='" + id + "'");
return dataModule.ExcuteSql(sql.ToString());
} /// <summary>
/// 获取where 条件sql
/// </summary>
/// <param name="entity"></param>
/// <returns></returns>
private string GetWhereConditionSQL(T entity)
{
StringBuilder whereCondition = new StringBuilder("");
foreach (PropertyInfo property in properties)
{
if (property.GetValue(entity, null) != null)
{
if (property.PropertyType == typeof(string))
{
whereCondition.Append(" " + property.Name + "='" + property.GetValue(entity, null) + "' and");
}
else if (property.PropertyType == typeof(DateTime?))
{
whereCondition.Append(" " + property.Name + "='" + Convert.ToDateTime(property.GetValue(entity, null)).ToString("yyyy-MM-dd HH:mm:ss") + "' and");
}
else if (property.PropertyType == typeof(int?) || property.PropertyType == typeof(long?) || property.PropertyType == typeof(double?) || property.PropertyType == typeof(float?) || property.PropertyType == typeof(decimal?))
{
whereCondition.Append(" " + property.Name + "=" + property.GetValue(entity, null) + " and");
}
else
{
whereCondition.Append(" " + property.Name + "='" + property.GetValue(entity, null) + "' and");
}
if (property.Name == PrimaryKey)
{
break;
}
} }
return whereCondition.ToString().TrimEnd("and".ToArray());
} /// <summary>
/// 设置实体属性值
/// </summary>
/// <param name="dt"></param>
/// <param name="entity"></param>
/// <returns></returns>
private T SetEntityValue(DataTable dt, T entity)
{
if (dt != null && dt.Rows.Count > )
{
foreach (PropertyInfo property in properties)
{
if (dt.Rows[][property.Name] != DBNull.Value)
{
if (property.PropertyType == typeof(string))
{
t.GetProperty(property.Name).SetValue(entity, dt.Rows[][property.Name], null);
}
else if (property.PropertyType == typeof(int?))
{
t.GetProperty(property.Name).SetValue(entity, Convert.ToInt32(dt.Rows[][property.Name]), null);
}
else if (property.PropertyType == typeof(DateTime?))
{
t.GetProperty(property.Name).SetValue(entity, Convert.ToDateTime(dt.Rows[][property.Name]), null);
}
else if (property.PropertyType == typeof(long?))
{
t.GetProperty(property.Name).SetValue(entity, Convert.ToInt64(dt.Rows[][property.Name]), null);
}
else if (property.PropertyType == typeof(double?))
{
t.GetProperty(property.Name).SetValue(entity, Convert.ToDouble(dt.Rows[][property.Name]), null);
}
else
{
t.GetProperty(property.Name).SetValue(entity, dt.Rows[][property.Name], null);
} }
}
return entity;
}
else
{
return default(T);
}
} }

如何使用,通过将表名和主键字段名传入进去,如果多个字段是主键的情况下,可以建一个主键列,然后将多个主键的列改为索引,因为任何一个表都可以创建出一个主键列,所以暂时不影响我使用

   public BaseDao<TrafficEvent> EventDao = new BaseDao<TrafficEvent>("Sj_Event", "EventId");

UI层可以同过这种方式直接调用,目前可以暂时满足我的开发

eventBiz.EventDao.InsertT(trafficEvent)
eventBiz.EventDao.UpdateT(trafficEvent)

winform中利用反射实现泛型数据访问对象基类(1)的更多相关文章

  1. winform中利用反射实现泛型数据访问对象基类(3)

    继续完善了几点代码 满足没有主键的情况下使用 并且完善实体字段反射设置value时的类型转换 /// <summary> /// DAO基类 实体名必须要与数据表字段名一致 /// < ...

  2. winform中利用反射实现泛型数据访问对象基类(2)

    在1的基础上做了一点改进 参数化处理 看上去更简洁 无主键情况下 update 方法需要改进 insert delete没有问题  /// <summary>     /// DAO基类 ...

  3. 利用反射和泛型把Model对象按行储存进数据库以及按行取出然后转换成Model 类实例 MVC网站通用配置项管理

    利用反射和泛型把Model对象按行储存进数据库以及按行取出然后转换成Model 类实例 MVC网站通用配置项管理   2018-3-10 15:18 | 发布:Admin | 分类:代码库 | 评论: ...

  4. JAVAWEB基础模块开发顺序与数据访问对象实现类步骤

    一.模块的开发的顺序 1. 定义数据表 2. 新建模型类 3. 新建"add.jsp" 4. 实现AddServlet中的doGet()方法 5. 定义Dao.Service接口 ...

  5. C#利用反射和泛型给不同对象赋值

    /// <summary> /// 适用于初始化新实体 /// </summary> static public T RotationMapping<T, S>(S ...

  6. EntityFramework经典数据访问层基类——增删改查

    namespace StudentSys.DAL { public class BaseService<T>:IDisposable where T:BaseEntity,new() { ...

  7. Java数据访问对象模式

    数据访问对象模式或DAO模式用于将低级数据访问API或操作与高级业务服务分离. 以下是数据访问对象模式的参与者. 数据访问对象接口 - 此接口定义要对模型对象执行的标准操作. 数据访问对象具体类 - ...

  8. [.net 面向对象程序设计进阶] (21) 反射(Reflection)(下)设计模式中利用反射解耦

    [.net 面向对象程序设计进阶] (21) 反射(Reflection)(下)设计模式中利用反射解耦 本节导读:上篇文章简单介绍了.NET面向对象中一个重要的技术反射的基本应用,它可以让我们动态的调 ...

  9. DataTable转任意类型对象List数组-----工具通用类(利用反射和泛型)

    public class ConvertHelper<T> where T : new() { /// <summary> /// 利用反射和泛型 /// </summa ...

随机推荐

  1. oracle触发器书写方法

    CREATE SEQUENCE 序列名[INCREMENT BY n] --每次加几[START WITH n] --序列从几开始[{MAXVALUE/ MINVALUE n|NOMAXVALUE}] ...

  2. Subversion how[Reprint]

    1.   Subversion简介 Subversion(简称SVN)是一款功能强大的开源版本控制工具,支持Linux和Windows平台. SVN可以有两个访问方式,一种是独立服务器直接访问,即利用 ...

  3. [转]30分钟学会反向Ajax

    原文链接:http://www.cnblogs.com/learnhow/p/5708364.html 场景1:当有新邮件的时候,网页自动弹出提示信息而无需用户手动的刷新收件箱. 场景2:当用户的手机 ...

  4. demo04calc

    package com.example.demo05simplecalc; import android.os.Bundle; import android.app.Activity; import ...

  5. mongo快速翻页方法(转载)

    翻阅数据是MongoDB最常见的操作之一.一个典型的场景是需要在你的用户界面中显示你的结果.如果你是批量处理的数据,同样重要的是要让你的分页策略正确,以便你的数据处理可以规模化. 接下来,让我们通过一 ...

  6. ThinkPHP讲解(八)——显示、修改、添加、删除

    一.显示数据 <h1>主页面</h1> <table width="100%" border="1" cellpadding=&q ...

  7. LR Socket 测试demo

    建议像我这样最开始未接触过的,还是先从简单录制开始.录制完之后,分析测试脚本,再学习,再自己根据需要编写测试脚本. 第一:录制. A.    B. 选择需要录制的exe的目录 ,填写完后点击ok. C ...

  8. C# PDFBox 解析PDF文件

    下载 PDFBox-0.7.3.zip PDFBox-0.7.3.dlllucene-demos-2.0.0.dlllucene-core-2.0.0.dllbcmail-jdk14-132.dllb ...

  9. Swift常量和变量

    常量和变量由一个特定名称来表示,如maxNumber 或者 message.常量所指向的是一个特定类型的值, 如数字10或者字符”hello”.变量的值可以根据需要不断修改,而常量的值是不能够被二次修 ...

  10. IO细述

    Java IO1:IO和File IO 大多数的应用程序都要与外部设备进行数据交换,最常见的外部设备包含磁盘和网络.IO就是指应用程序对这些设备的数据输入与输出,Java语言定义了许多类专门负责各种方 ...