作为数据库映射的处理程序这里先感谢博客园的callhot老师的指点,把原本的xml做的构架解析换成了属性的解析,节省了大量的xml文件的管理,并且使用起来也更加方便。
另外我这个人写博客很懒,写写博客只希望交流一下自己做项目里的一些经验,所以就上代码了。理论只是博客园非常多。
下面这个类用来标识一个表的特性,自己做了点扩展,把单表的做了外键关联,但是实际应用上好像很少可以用到。
using System;
using System.Collections.Generic;
using System.Text;
using System.Data;
namespace CWF.MappingHelper
{
/// <summary>
/// 表的特性类
/// 开发者:欧阳寒玟
/// 开发时间:2010-01-11
/// 修改时间:2010-11-01
/// </summary>
[AttributeUsage(AttributeTargets.All, AllowMultiple = false)]
public class TableAttribute : Attribute
{
private string dbTableName;
/// <summary>
/// 表名
/// </summary>
public string TableName
{
get
{
return this.dbTableName;
}
set
{
this.dbTableName = value;
}
}
private string directions;
/// <summary>
/// 表说明
/// </summary>
public string Disrections
{
get { return directions; }
set { directions = value; }
}
/// <summary>
/// 实例化
/// </summary>
/// <param name="tableName">表名</param>
public TableAttribute(string tableName)
{
this.dbTableName = tableName;
}
}
}
下面是表字段的标识
using System;
using System.Collections.Generic;
using System.Text;
using System.Data;
namespace CWF.MappingHelper
{
/// <summary>
/// 字段特性
/// </summary>
[AttributeUsage(AttributeTargets.All, AllowMultiple = false)]
public class ColumnAttribute : Attribute
{
private string dbColumnName;
/// <summary>
/// 数据列名
/// </summary>
public string DbColumnName
{
get
{
return this.dbColumnName;
}
set
{
this.dbColumnName = value;
}
}
private DbType dbType;
/// <summary>
/// 数据类型
/// </summary>
public DbType DbType
{
get
{
return this.dbType;
}
set
{
this.dbType = value;
}
}
private bool isPrimary;
/// <summary>
/// 是否是主键
/// </summary>
public bool IsPrimary
{
get
{
return this.isPrimary;
}
set
{
this.isPrimary = value;
}
}
private bool isIdentify;
/// <summary>
/// 是否递增
/// </summary>
public bool IsIdentify
{
get
{
return this.isIdentify;
}
set
{
this.isIdentify = value;
}
}
private object defaultValue;
/// <summary>
/// 默认值
/// </summary>
public object DefaultValue
{
get
{
return this.defaultValue;
}
set
{
this.defaultValue = value;
}
}
private int length;
/// <summary>
/// 数据长度
/// </summary>
public int DbLength
{
get
{
return this.length;
}
set
{
this.length = value;
}
}
private bool isForeign;
/// <summary>
/// 是否外键
/// </summary>
public bool IsForeign
{
get { return isForeign; }
set { isForeign = value; }
}
private Type foreignModel;
/// <summary>
/// 外键实体model
/// </summary>
public Type ForeignModel
{
get { return foreignModel; }
set { foreignModel = value; }
}
/// <summary>
/// 得到空的默认值
/// </summary>
/// <returns></returns>
private object GetDefaultValue()
{
return new object();
}
/// <summary>
/// 实例化类赋值列名
/// </summary>
/// <param name="dbName"></param>
public ColumnAttribute(string dbName)
{
this.dbColumnName = dbName;
this.isPrimary = false;
this.defaultValue = this.GetDefaultValue();
}
public ColumnAttribute(string dbName, Boolean IsForeign,Type model)
{
this.dbColumnName = dbName;
this.isPrimary = false;
this.defaultValue = this.GetDefaultValue();
this.isForeign = IsForeign;
this.ForeignModel = model;
}
public ColumnAttribute(string dbName,DbType type, Boolean IsForeign, Type model)
{
this.dbColumnName = dbName;
this.isPrimary = false;
this.defaultValue = this.GetDefaultValue();
this.isForeign = IsForeign;
this.ForeignModel = model;
this.DbType = type;
}
public ColumnAttribute(string dbName, DbType type,object value, Boolean IsForeign, Type model)
{
this.dbColumnName = dbName;
this.isPrimary = false;
this.defaultValue = value;
this.isForeign = IsForeign;
this.ForeignModel = model;
this.DbType = type;
}
public ColumnAttribute(string dbName, object value, Boolean IsForeign)
{
this.dbColumnName = dbName;
this.isPrimary = false;
this.defaultValue = value;
this.isForeign = IsForeign;
}
/// <summary>
/// 实例化类赋值列名,主键
/// </summary>
/// <param name="dbName"></param>
/// <param name="isPrimery"></param>
public ColumnAttribute(string dbName, bool isPrimery)
{
this.dbColumnName = dbName;
this.isPrimary = isPrimery;
this.defaultValue = this.GetDefaultValue();
}
/// <summary>
/// 实例化
/// </summary>
/// <param name="dbName"></param>
/// <param name="isPrimery"></param>
/// <param name="dValue"></param>
public ColumnAttribute(string dbName, bool isPrimery, object dValue)
{
this.dbColumnName = dbName;
this.isPrimary = isPrimery;
this.defaultValue = this.GetDefaultValue();
}
/// <summary>
/// 实例化类赋值列名,主键,数据类型
/// </summary>
/// <param name="dbName"></param>
/// <param name="isPrimery"></param>
/// <param name="type"></param>
public ColumnAttribute(string dbName, bool isPrimery, DbType type)
{
this.dbColumnName = dbName;
this.isPrimary = isPrimery;
this.dbType = type;
this.defaultValue = null;
}
/// <summary>
///
/// </summary>
/// <param name="dbName"></param>
/// <param name="isPrimery"></param>
/// <param name="identify"></param>
/// <param name="type"></param>
public ColumnAttribute(string dbName, bool isPrimery,bool identify, DbType type)
{
this.dbColumnName = dbName;
this.isPrimary = isPrimery;
this.dbType = type;
this.defaultValue = null;
this.IsIdentify = identify;
}
}
}
用这两个类给数据实体打上标记就看非常方便的进行操作了,而且可维护性还不错,不用去维护一大堆的xml文件。
下面是数据的操作类接口。
using System;
using System.Collections.Generic;
using System.Text;
using System.Collections.Specialized;
using System.Runtime.CompilerServices;
using System.Data;
namespace CWF.MappingHelper
{
/// <summary>
/// 数据查询接口
/// 开发者:欧阳寒玟
/// 开发时间:2010-10-09
/// </summary>
public interface IQuery
{
/// <summary>
/// 数据操作的类
/// </summary>
CWF.DataHelper.IDbHelper DBHelper { get; set; }
#region "Query"
/// <summary>
/// 根据一个模型和主键的值得到这个模型的实体
/// </summary>
/// <typeparam name="T"></typeparam>
/// <param name="model"></param>
/// <param name="value">主键的值</param>
/// <returns></returns>
T Query<T>(object value) where T : new();
/// <summary>
/// 根据查询条件返回model
/// </summary>
/// <typeparam name="T"></typeparam>
/// <param name="Dictionary">参数</param>
/// <returns></returns>
T Query<T>(string where) where T: new ();
/// <summary>
/// 根据参数返回model
/// </summary>
/// <typeparam name="T"></typeparam>
/// <param name="prameters"参数数组></param>
/// <returns></returns>
T Query<T>(IDbDataParameter[] parameters) where T : new();
/// <summary>
/// 根据查询条件返回DataTable
/// </summary>
/// <typeparam name="T"></typeparam>
/// <param name="model"></param>
/// <param name="where">查询条件</param>
/// <returns></returns>
System.Data.DataTable QueryTable<T>(string where) where T : new();
/// <summary>
/// 根据参数返回DataTable
/// </summary>
/// <typeparam name="T"></typeparam>
/// <param name="prameters">参数数组</param>
/// <returns></returns>
System.Data.DataTable QueryTable<T>(IDbDataParameter[] parameters) where T : new();
/// <summary>
/// 查询一个集合
/// 得到单值形式的数据
/// </summary>
/// <param name="model"></param>
/// <returns></returns>
List<T> QueryList<T>(string where) where T : new();
/// <summary>
/// 根据参数查询一个集合
/// </summary>
/// <typeparam name="T"></typeparam>
/// <param name="prameters">参数数组</param>
/// <returns></returns>
List<T> QueryList<T>(IDbDataParameter[] parameters) where T : new();
#endregion
#region "Convent"
/// <summary>
/// 把表转换成modle 返回 list<T>
/// </summary>
/// <typeparam name="T"></typeparam>
/// <param name="table"></param>
/// <returns></returns>
List<T> ConventToList<T>(System.Data.DataTable table) where T : new();
/// <summary>
/// 把实体模型转换成键值对
/// 得到已键值对形式的数据
/// </summary>
/// <param name="model"></param>
/// <returns></returns>
IDictionary<string, object> ConventToDic<T>(T model);
/// <summary>
/// 把字典转换为datatable
/// </summary>
/// <typeparam name="T"></typeparam>
/// <param name="model"></param>
/// <param name="dictionary"></param>
/// <returns></returns>
System.Data.DataTable ConventToTable(IDictionary<string, object> dictionary);
/// <summary>
/// 根据主键返回model,该方法不兼容access
/// 兼容access请使用GetModelByPrimaryKey<T>(IDbDataParameter prameter)
/// </summary>
/// <typeparam name="T">数据类型</typeparam>
/// <param name="Key"></param>
/// <returns></returns>
T GetModelByPrimaryKey<T>(object Key) where T:new();
/// <summary>
/// 根据主键返回model,该方法兼容access
/// </summary>
/// <typeparam name="T"></typeparam>
/// <param name="prameter">参数</param>
/// <returns></returns>
T GetModelByPrimaryKey<T>(IDbDataParameter[] prameter) where T : new();
/// <summary>
/// 把一行数据装进model
/// </summary>
/// <typeparam name="T"></typeparam>
/// <param name="row"></param>
/// <returns></returns>
T ConventToModel<T>(System.Data.DataRow row) where T : new();
#endregion
#region "ADD"
/// <summary>
/// 添加一条记录
/// </summary>
/// <typeparam name="T"></typeparam>
/// <param name="model"></param>
/// <returns></returns>
object Add(object model);
/// <summary>
/// 添加一条记录,采用参数模式
/// </summary>
/// <typeparam name="T"></typeparam>
/// <param name="parameters">Parameters</param>
/// <returns></returns>
object Add<T>(IDbDataParameter[] parameters) where T : new();
/// <summary>
/// 添加list个记录
/// </summary>
/// <typeparam name="T"></typeparam>
/// <param name="list"></param>
/// <returns></returns>
int AddList<T>(IList<T> list);
/// <summary>
/// 添加一行记录
/// </summary>
/// <typeparam name="T"></typeparam>
/// <param name="dr"></param>
/// <returns></returns>
int AddDBRow<T>(DataRow dr) where T : new();
/// <summary>
/// 把整个表添加
/// </summary>
/// <typeparam name="T"></typeparam>
/// <param name="dt"></param>
/// <returns></returns>
int AddDBTable<T>(DataTable dt) where T : new();
#endregion
#region "Update"
/// <summary>
/// 更新整个model
/// </summary>
/// <param name="model"></param>
/// <returns></returns>
int Update<T>(T model);
/// <summary>
/// 更新,除递增字段以外的所有model包含的字段.
/// </summary>
/// <typeparam name="T"></typeparam>
/// <param name="model"></param>
/// <param name="where">筛选条件</param>
/// <returns></returns>
int Update<T>(T model, string where);
/// <summary>
/// 更新部分实体类
/// </summary>
/// <param name="Prameters">参数</param>
/// <returns></returns>
int UpdateColumn<T>(IDbDataParameter[] Prameters) where T : new();
/// <summary>
/// 更新,自己填写where子句
/// </summary>
/// <typeparam name="T">model类型</typeparam>
/// <param name="Prameters">要跟新的参数</param>
/// <param name="where">筛选类型</param>
/// <returns></returns>
int UpdateColumn<T>(IDbDataParameter[] Prameters, string where) where T : new();
#endregion
#region "Dlete"
/// <summary>
/// 根据主键删除记录
/// </summary>
/// <param name="key">主键值</param>
/// <returns></returns>
int Dlete<T>(object key) where T:new();
/// <summary>
/// 根据筛选条件删除记录
/// </summary>
/// <typeparam name="T">model类</typeparam>
/// <param name="model">modle</param>
/// <param name="where">筛选条件</param>
/// <returns></returns>
int Dlete<T>(string where) where T:new();
#endregion
#region "Transaction"
/// <summary>
/// 开始事务
/// </summary>
void BeginTransaction(IDbTransaction tran);
/// <summary>
/// 开始一个默认事务
/// </summary>
void BeginTransaction();
/// <summary>
/// 是否提交事务
/// </summary>
/// <returns></returns>
bool Commit();
/// <summary>
/// 是否回滚
/// </summary>
/// <returns></returns>
bool RollBack();
/// <summary>
/// 是否进行事务
/// </summary>
bool IsTransaction{get;}
#endregion
}
}
自己在做项目的时候也是只图方便,有些东西不是很完善,比如实体类并没有继承统一的接口或者类,所以不好规范,但是唯一一点就是new() 是必须都有的,而且class也是基本保证。
下面就是一个基本使用方法
/// <summary>
/// 表Degree的模型
/// </summary>
[CWF.MappingHelper.Table("Degree")]
class Degree
{
private int _id;
private string _name;
private int _creatorid;
private string _creatorname;
private DateTime _createdate;
[CWF.MappingHelper.Column("ID", true,true, DbType.Int32)]
public int ID
{
get { return _id; }
set { _id = value; }
}
[CWF.MappingHelper.Column("Name", false,false, DbType.String)]
public string Name
{
set { _name = value; }
get { return _name; }
}
[CWF.MappingHelper.Column("CreatorId", false, false, DbType.Int32)]
public int CreatorId
{
set { _creatorid = value; }
get { return _creatorid; }
}
[CWF.MappingHelper.Column("CreatorName", false, false, DbType.String)]
public string CreatorName
{
set { _creatorname = value; }
get { return _creatorname; }
}
[CWF.MappingHelper.Column("CreateDate", false, false, DbType.DateTime)]
public DateTime CreateDate
{
set { _createdate = value; }
get { return _createdate; }
}
}
给表和字段打上标记就非常方便的使用了,这里非常感谢callhot老师。
具体的使用方法实例:
IQuery query = new QueryHelper();
向Degree表添加一条记录
query.Add(d);
//更新Degree表id为0的数据
IDbDataParameter[] parameters = new SqlParameter[] {
new SqlParameter("@CreateDate",System.DateTime.Now),
new SqlParameter("@CreatorId",1),
new SqlParameter("@CreatorName","ok"),
new SqlParameter("@Name","寒玟")
};
Degree de = query.Query<Degree>(parameters);
IDictionary<string, object> idic = query.ConventToDic<Degree>(d);
IList<Degree> list = new List<Degree>();
query.IsTransaction();
query.BeginTransaction();
list.Add(d);
list.Add(d);
list.Add(d);
list.Add(d);
list.Add(d);
list.Add(d);
list.Add(d);
list.Add(d);
query.AddList<Degree>(list);
int num = query.Dlete<Degree>("id>4");
MessageBox.Show(ServerSession<string>.log.name);
query.Update<Degree>(d);
//查询id=0的Degree模型
Degree de = query.Query<Degree>("id=0");
//修改查询用的连接字符串
query.DBHelper.ConnectionString = "";
//查询满足条件的一系列list的model集合
IList<Degree> list= query.QueryList<Degree>("id<>0");
//查询满足条件的datatable集合
DataTable dt= query.QueryTable<Degree>("id<>0");
//把一行数据转换成一个模型
Degree deg = query.ConventToModel<Degree>(dt.Rows[0]);
//把模型Degree转换成键值对的字典模式
IDictionary<string, object> IDC = query.ConventToDic<Degree>(d);
foreach (KeyValuePair<string, object> keys in IDC)
{
textBox1.Text +=keys.Key+":"+ keys.Value.ToString() + "-";
comboBox1.Items.Add(keys.Value);
}
OK结束。欢迎板砖和鸡蛋。