在上一篇的文章中,主要介绍了利用CodeDom来动态生成数据库表到实体的映射关系以及利用C#的动态类型来操作实体的属性。这篇主要是实现了实体类的数据库CRUD的操作。
在目前的ORM映射框架中,对于操作数据库的最后一个步骤就是动态生成操作数据库的SQL语句,而这无非也就是利用实体属性中的自定义映射机制来实现的,或者就是直接把实体类的属性名对应表的字段名,在本示例中,就是采用的后者。
第一、为了能够存储动态生成的SQL语句,新建了一个SQL语句的结构类,用来存放SQL语句以及参数:
/// <summary>
/// SQL结构类
/// </summary>
[Serializable]
class SqlStruct
{
public string SqlString { get; set; }
public ParamField[] ParamFields { get; set; }
}
/// <summary>
/// SQL参数
/// </summary>
[Serializable]
public class ParamField
{
public string ParamName { get; set; }
public string FieldName{ get; set; }
}
第二、实现构建SQL操作
根据用户的CRUD操作,动态的构建一个SQL操作语句,并别存入缓存中,以便下次执行相同的操作时直接从缓存中获取,提高性能,在这里新建了一个构建SQL的类:
class SqlGenerator
{
private SqlGenerator() { }
private static SqlGenerator singleton = new SqlGenerator();
public static SqlGenerator Instance()
{
return singleton;
}
/// <summary>
/// 构建CRUD操作SQL语句
/// </summary>
/// <param name="activeRecord"></param>
/// <param name="sqlOperationType"></param>
/// <returns></returns>
public SqlStruct GenerateSql(dynamic activeRecord, SqlOperationType sqlOperationType)
{
SqlStruct sqlStruct;
string key = null;
if (activeRecord is Type)
{
TableMapAttribute attr = Attribute.GetCustomAttribute(activeRecord, typeof(TableMapAttribute)) as TableMapAttribute;
key = GenerateKey(attr.TableName, sqlOperationType);
}
else
{
key = GenerateKey(activeRecord.TableName, sqlOperationType);
}
// 获取缓存
sqlStruct = CacheProxy.GetChchedString(key) as SqlStruct;
if (sqlStruct != null)
{
return sqlStruct;
}
switch (sqlOperationType)
{
case SqlOperationType.SimpleSelect:
sqlStruct = new SqlStruct() { SqlString = GenerateSimpleSelectSql(activeRecord)};
break;
case SqlOperationType.SelectByKey:
sqlStruct = GenerateFindByKeySql(activeRecord);
break;
case SqlOperationType.Insert:
sqlStruct = GenerateInsertSql(activeRecord);
break;
case SqlOperationType.Update:
sqlStruct = GenerateUpdateSql(activeRecord);
break;
case SqlOperationType.Delete:
sqlStruct = GenerateDeleteSql(activeRecord);
break;<