c#利用反射+特性实现简单的实体映射数据库操作类(表与类的映射)
开始之前首先需要了解 特性Attribute; 说穿了特性也就是一些声明信息;我们在运行的时候可以用反射获取这些声明;
所想我们试想下;我们新建一个类用来存放数据库表中的信息; 那我们是不是需要在该类中有专门存放该表字段信息的类的字段呢?(这里说的是存放表中的全部字段信息)
在想想下,描述一个数据库字段需要哪些信息; 二类中字段可以满足哪些信息吗! 所以我们需要对该字段进行描述 ,比如说字段名称呀,字段数据类型呀,字段数据类型长度呀,还有有是否为主键呀?
我也是初学者 我这里只是说最基础的
建立特性类;
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Data;
namespace DataTransfer
{
[AttributeUsage(AttributeTargets.Property,AllowMultiple=false,Inherited=false)]
public class FieldAttribute:Attribute
{
private string _Fields;
/// <summary>
/// 字段名称
/// </summary>
public string Fields
{
get { return _Fields; }
}
private DbType _Dbtype;
/// <summary>
/// 字段类型
/// </summary>
public DbType Dbtype
{
get { return _Dbtype; }
}
private int _ValueLength;
/// <summary>
/// 字段值长度
/// </summary>
public int ValueLength
{
get { return _ValueLength; }
}
/// <summary>
/// 构造函数
/// </summary>
/// <param name="fields"> 字段名</param>
/// <param name="types"> 字段类型</param>
/// <param name="i"> 字段值长度</param>
public FieldAttribute(string fields,DbType types, int i)
{
_Fields=fields;
_Dbtype=types;
_ValueLength=i;
}
}
}
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
namespace DataTransfer
{
[AttributeUsage(AttributeTargets.Class,AllowMultiple=false,Inherited=false)]
public class TableAttribute:Attribute
{
private string _TableName;
/// <summary>
/// 映射的表名
/// </summary>
public string TableName
{
get { return _TableName; }
}
/// <summary>
/// 定位函数映射表名;
/// </summary>
/// <param name="table"></param>
public TableAttribute(string table)
{
_TableName = table;
}
}
}
这里是建立的2个特性类; 建立与表映射的类TableAttribute 外加与字段映射的类 FieldAttribute;
建立联系的类
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Data;
namespace DataTransfer
{
[Table("Consumers")]// 这里[Table("Consumers")] 或者 [TableAttribute("Consumers")] 是一样的效果
public class UserInf
{
private string _UserID;
/// <summary>
/// 登陆ID
/// </summary>
[Field("ConsumerID",DbType.String,12)]
public string U_UserID
{
get { return _UserID; }
set { _UserID = value; }
}
private string _Psw;
/// <summary>
/// 登陆密码
/// </summary>
[Field("ConsumerPwd",DbType.String,12)]
public string U_Psw
{
get { return _Psw; }
set { _Psw = value; }
}
private string _UserName;
/// <summary>
/// 用户别称
/// </summary>
[Field("ConsumerName",DbType.String,50)]
public string U_UserName
{
get { return _UserName; }
set { _UserName = value; }
}
private string _City;
/// <summary>
/// 所住城市
/// </summary>
[Field("UserCity",DbType.String,50)]
public string U_City
{
get { return _City; }
set { _City = value; }
}
private int _Popedom;
/// <summary>
/// 权限
/// </summary>
[Field("popedom", DbType.Int32, 0)]
public int U_Popedom
{
get { return _Popedom; }
set { _Popedom = value; }
}
private DateTime _AddDataTime;
/// <summary>
/// 注册时间
/// </summary>
[Field("addDataTime",DbType.Date,0)]
public DateTime U_AddDataTime
{
get { return _AddDataTime; }
set { _AddDataTime = value; }
}
private int _Sex;
/// <summary>
/// 性别
/// </summary>
[Field("Sex",DbType.Int32,0)]
public int U_Sex
{
get { return _Sex; }
set { _Sex = value; }
}
private int _BirthTime;
/// <summary>
/// 出身日期;
/// </summary>
[Field("BirthTime", DbType.String, 9)]
public int U_BirthTime
{
get { return _BirthTime; }
set { _BirthTime = value; }
}
}
}
在aspx页面中
UserInf userss = new UserInf();
userss.U_UserID = "aw12311";
userss.U_Psw = "123";
userss.U_UserName = "aw";
userss.U_City = "武汉";
userss.U_Popedom = 1;
userss.U_Sex = 1;
userss.U_BirthTime = 19900114;
userss.U_AddDataTime = DateTime.Now;
///这里先让你查看字段描述;
查看表的特性;
Type userAttu = userss.GetType();
TableAttribute tables = (TableAttribute)userAttu.GetCustomAttributes(false)[0];//这里我在TableAttribute个类中写的是不容许多个描述,所以只有一个实例;
Response.Write(tables.TableName);
//查看类中字段的描述
PropertyInfo[] info = userAttu.GetProperties();
foreach (PropertyInfo prs in info)
{
Response.Write("--------------------------------</br>");
object[] attu = prs.GetCustomAttributes(false);
object obj = prs.GetGetMethod().Invoke(userss,null);//取出当前描述字段的值
Response.Write(prs.Name +"|"+ obj +"</br>");//这里显示类中字段的名称 与值
foreach(Attribute abute in attu )
{
if (abute is FieldAttribute)
{
FieldAttribute column = abute as FieldAttribute;
Response.Write(column.Fields +"</br>");
Response.Write(column.Dbtype + "</br>");
Response.Write(column.ValueLength + "</br>");
}
}
}
接着在 c# 中 传递帮他了的类拼接处查询字符串;
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Data;
using System.Reflection;
namespace DataTransfer
{
public class DateIsTableAttribute<T>
{
public string insertDate(T types)
{
string cmdtxt = "insert into ";
string cmdparVar = null;
Type userAttu = types.GetType();
TableAttribute tables = (TableAttribute )userAttu.GetCustomAttributes(false)[0];
cmdtxt += tables.TableName + "(";
PropertyInfo[] info = userAttu.GetProperties();
foreach (PropertyInfo prs in info)
{
object[] attu = prs.GetCustomAttributes(false);
foreach (Attribute abute in attu)
{
if (abute is FieldAttribute)
{
FieldAttribute midle = abute as FieldAttribute;
cmdtxt += midle.Fields + ",";
object obj = prs.GetGetMethod().Invoke(types,null);
if (midle.Dbtype == DbType.Int32)
cmdparVar += obj + ",";
else
cmdparVar+="'"+obj +"',";
}
}
}
cmdparVar = cmdparVar.Substring(0, cmdparVar.Length - 1);
cmdtxt = cmdtxt.Substring(0, cmdtxt.Length - 1) + ")";
cmdtxt += "values(" + cmdparVar + ")";
return cmdtxt;
}
}
}
然后再aspx 中的页面调用该方法
DateIsTableAttribute<UserInf> t = new DateIsTableAttribute<UserInf>();
///此处的userss 是上面实例化并赋值的userss;
Response.Write(" </br>" + t.insertDate(userss));
//这样你就会看到拼接完成的 插入字符串;
这只是思路 当我们字段插入字符串后那对数据库的插入我们就应该是小意思了吧! 同理我们可以做出响应的修改删除;
当我们需要插入并一张表的时候,或者修改等 , 那我们只需要新建一个加特征的与我们需要映射的表就好了其他都不需要改了;当我们吧那些插入 修改 删除 都包装在一起 , 那我们就可以实现自动化了 ,我们唯一需要做的就是怎样去建立类与数据库的映射就好了!;
转载于:https://www.cnblogs.com/aw25220/archive/2011/04/23/2025896.html
c#利用反射+特性实现简单的实体映射数据库操作类(表与类的映射)相关推荐
- c#利用反射+特性实现简单的实体映射数据库操作类实现自动增删改查(一)
///对字段特性的映射类 using System; using System.Collections.Generic; using System.Linq; using System.Text; u ...
- 利用DB Link搞定Oracle两个数据库间的表同步
数据库之间的链接建立在DATABASE LINK上.要创建一个DB LINK,必须先 在每个数据库服务器上设置链接字符串. 1. 链接字符串即服务名,首先在本地配置一个服务名,地址指向远程的数据库地址 ...
- 利用反射动态修改 EasyPoi 导出Excel表格标题名称
EasyPoi 动态修改表格标题名称 需求 代码实现 1.实体类 @Data @Accessors(chain = true) public class AccountVO implements Se ...
- 数据库的三级模式和两级映射--简单介绍
形象解释数据库的三级模式和两级映射 数据库的三级模式和两级映射是美国国家标准协会(American National Standard Institute, ANSI)的数据库管理系统研究小组于197 ...
- CN.Text开发笔记—利用反射将数据读入实体类
在实际开发中,我们经常需要从数据库中读取数据并赋值给实体类的相应属性.在.Text的DataDTOProvider中存在大量这样的代码, 比如: public Role[] GetRoles(int ...
- golang利用反射写入excel的简单工具类
golang利用反射写入excel的简单工具类 工具类源码 使用方法 工具类源码 package excelimport ("errors""github.com/tea ...
- mvc4 利用filters特性来 实现自己的权限验证 之二
刚开始摸索C# MVC,也只是按图索骥,对C#的特性不是很懂,耐心看完相关文章,对特性的使用有了进一步理解. 1.特性类的命名规范:特性也是一个类,必须继承于System.Attribute类,命名规 ...
- 第六节:反射(几种写法、好处和弊端、利用反射实现IOC)
一. 加载dll,读取相关信息 1. 加载程序集的三种方式 调用Assembly类下的三个方法:Load.LoadFile.LoadFrom. 1 //1.1 Load方法:动态默认加载当前路径下的( ...
- 利用反射,批量启动WCF服务
对于WCF的宿主启动来说,有好多方法,单独启动也很简单,可以根据业务需要来自由选择(单独启动方法这里就不做解释) 对于业务服务比较多的时候,往往需要多个服务来承载系统,但是如果将服务启动单独写代码启动 ...
最新文章
- 用python绘制漂亮的图形-用python绘制图形的实例详解
- 京东发力金融AI,欲再招50位金融AI顶级科学家 转载 2017年12月04日 00:00:00 42 12月1日,京东金融AI实验室在美国硅谷正式投入运营。亦在同一天,京东金融宣布,美国伊利诺伊大
- oracle v$sql last_load_time,Oracle 等待事件V$视图
- java链表.set_Java中的数组、链表、List、ArrayList、LinkedList、Vector、Set
- 从SQL Server到多数据库,微软数据库迁移全攻略
- linux 系统迁移到固态硬盘,把Debian GNU/Linux迁移到SSD上
- ssl2345-繁忙的都市
- 随机样本一致性:一种用于图像分析和自动制图的模型拟合模型(4)--(计算透视中心的三维位置)
- 贝叶斯网络学习Python环境搭建(pgmpy)
- 用nohup重定向python输出到文件不成功的解决办法
- MySQL日志设置双1_mysql日志配置文件示例
- CSDN 七夕包分配,最后一天啦!
- Linux命令 lsof -i:端口号 ——有什么用途
- 竞选计算机协会网络部部长,计算机协会部长竞选演讲稿
- bada千字文应用程序简介
- 30线性空间04——子空间的直和、n个子空间的直和、直和分解、直和补
- html中%3ch3%3e有颜色吗,typo.html
- 使用jinja2自动生成交换机接口配置脚本
- 关于 网易云音乐 我喜欢的音乐 排序无法改为添加时间 排序无法还原 的问题
- 输入一行字符(输入以字符#结束),分别统计其中字母和数字字符的个数。
热门文章
- mysql清除旧版本_MYSQL使用INNODB时及时清理旧版本数据
- java使用蒙特卡罗方法计算半径为r圆的面积_不用微积分,如何计算圆面积
- 只在用户登陆时运行_linux 系统的7个运行级别
- 集成学习(一)——随机森林以及GBDT
- 2019斯坦福CS224n深度学习自然语言处理笔记(3)反向传播与计算图
- 双显卡单独分辨率_甜点光追显卡—带你实现GAMING梦!!!
- gpg: 找不到有效的 openpgp 数据。_萤火数据|找主播堪比相亲找对象,该如何避免心酸血泪史?...
- java token身份认证_java – 基于Spring Security Token的身份验证
- Java面试题-2021
- 展示360度全景影像的利器--PanoramaGL