C#发现之旅:基于反射和动态编译的快速ORM框架(下)
2010-09-30 21:08:22 来源:WEB开发网在这段代码中,首先是遍历实体类型中所有的绑定到字段的属性,根据其附加的BindFieldAttribute特性的Key值找到所有的关键字段属性对象,并创建了一个“关键字段名1=@Key属性名1 And 关键字段名2=@Key属性名2”(若未启用命名参数则为“关键字段名1=? And 关键字段名2=? ……”)格式的字符串,该字符串就是SQL语句的Where子语句了,若启用命名参数则生成的文本为。
若没有找到任何关键属性,则无法确定删除记录使用的查询条件,此时代码生成器就会输出抛出异常的代码。在这里代码生成器不会直接抛出异常而导致ORM框架过早的报警,未来可能有开发人员定义的实体类型只是为了查询或者新增数据库记录,那时不需要定义关键属性。若对这种实体类型过早的报警则减少了快速ORM框架的使用范围。
若实体类型定义了一个或者多个关键属性,则开始输出代码文本,首先输出检查参数的代码文本,然后遍历所有的关键属性对象,生成向数据库命令对象添加参数的代码。
这里还用到了一个WriteSetParamterValue的方法用于书写设置参数值的过程,其代码为
private void WriteSetParameterValue( System.Reflection.PropertyInfo p , IndentTextWriter myWriter )
{
if (p.PropertyType.Equals(typeof(DateTime)))
{
BindFieldAttribute fa = (BindFieldAttribute)Attribute.GetCustomAttribute(
p, typeof(BindFieldAttribute));
if (fa.WriteFormat == null || fa.WriteFormat.Length == 0)
{
myWriter.WriteLine("parameter.Value = myRecord." + p.Name + ".ToString(\"yyyy-MM-dd HH:mm:ss\");");
}
else
{
myWriter.WriteLine("parameter.Value = myRecord." + p.Name + ".ToString(\"" + fa.WriteFormat + "\");");
}
}
else if (p.PropertyType.Equals(typeof(string)))
{
myWriter.WriteLine("if( myRecord." + p.Name + " == null || myRecord." + p.Name + ".Length == 0 )");
myWriter.WriteLine(" parameter.Value = System.DBNull.Value ;");
myWriter.WriteLine("else");
myWriter.WriteLine(" parameter.Value = myRecord." + p.Name + " ;");
}
else
{
myWriter.WriteLine("parameter.Value = myRecord." + p.Name + " ;");
}
}
更多精彩
赞助商链接