之前用java做过一次,这次因为到公司用的是C#所以再做一次
主要用到的知识有:①特性(类似Java的注解)②反射③泛型④C#的数据库操作
特性
先定义一个特性,需要继承Attribute
using System;
using System.Data;
namespace SimpleORM.Attributes
{
public class DataFieldAttribute: Attribute
{
public string _FieldName { get; private set; }
public SqlDbType _FieldType { get; private set; }
public int _Length { get; private set; }
public DataFieldAttribute(string fieldname, SqlDbType fieldtype,int len)
{
_FieldName = fieldname;
_FieldType = fieldtype;
_Length = len;
}
}
}
然后就是使用它
using System.Data;
namespace SimpleORM.Attributes
{
public class Bean
{
[DataField("ID",SqlDbType.Int,1)]
public short id { get; private set; }
[DataField("Name", SqlDbType.NVarChar,50)]
public string name { get; private set; }
[DataField("InDate", SqlDbType.DateTime,20)]
public string InDate { get; private set; }
[DataField("InUser", SqlDbType.NVarChar,15)]
public string InUser { get; private set; }
[DataField("LastEditDate", SqlDbType.DateTime, 20)]
public string LastEditDate { get; private set; }
[DataField("LastEditUser", SqlDbType.NVarChar,15)]
public string LastEditUser { get; private set; }
public Bean() { }
public Bean(short id, string name, string InDate, string InUser, string LastEditDate, string LastEditUser)
{
this.id = id;
this.name = name;
this.InDate = InDate;
this.InUser = InUser;
this.LastEditDate = LastEditDate;
this.LastEditUser = LastEditUser;
}
}
}
DateField是DataFieldAttribute的缩写,所以使用[DataFieldAttribute("ID",SqlDbType.Int,1)]也是可以的
反射
C#里的Type相当于java的Class,有两种方式可以获得Type对象:
①Type t=entity.getType();
②Type t=typeof(Entity);
利用反射操作属性
Bean entity=new Bean(.....);
PropertyInfo[] infos = entity.GetType().GetProperties();
foreach (PropertyInfo info in infos)
{
//访问字段
Console.WriteLine("字段名:{0},字段值{1}",info.Name,info.GetValue(entity));
//访问特性
Object[] dataFieldAttribute = info.GetCustomAttributes(typeof(DataFieldAttribute), false);
DataFieldAttribute attr = dataFieldAttribute[0] as DataFieldAttribute;//强制转换
Console.WriteLine("该字段的DataFieldAttribute特性:_FieldName--{0},_FieldType--{1},_Length--{2}",attr._FieldName,attr._FieldType, attr._Length);
//设置字段值,需要注意的是利用反射设置值要保证类型相同
info.SetValue(entity, Convert.ChangeType(这儿些你要转换的类型, info.PropertyType));
}
C#的数据库操作
用到的类有:
①SqlConnection 连接对象
②SqlCommand 组装sql语句,并且执行
③SqlParameter 预编译用
④SqlDataReader 返回的结果
string str="Server=...;UID=...;Password=...;Database=...";
SqlConnection conn=SqlConnection(str);
conn.Open();
SqlCommand cmd