C#发现之旅:基于反射和动态编译的快速ORM框架(下)
2010-09-30 21:08:22 来源:WEB开发网这里的KeyProperties,KeyParameterNames和myWhereSQL的值都在生成FillDeleteCommand时已经设置好了,这里直接拿来用。若KeyProperties没有内容,说明实体类型没有指明绑定了关键字段的属性,此时无法生成更新时的查询语句,于是输出抛出异常的C#代码文本。
我们首先遍历实体类型中所有的绑定了字段的属性对象,拼凑出“Update TableName Set 字段名1=@Value属性名1 , 字段名2=@Value属性名2”(若未启用命名参数则输出为“Update TableName Set 字段名1=? , 字段名2=?”)样式的SQL文本,然后加上myWhereSQL中的查询条件文本,从而得出了完整的SQL语句,然后将其输出到代码文本中。
我们有一次遍历实体类型所有绑定了字段的属性对象,对于每一个属性输出添加SQL参数对象的C#代码文本。此外还遍历KeyProperties来生成添加查询条件SQL参数的C#代码文本。
函数最后返回添加的SQL参数个数的返回语句。
生成完整的C#源代码文本
在实现了生成读取数据,插入数据,删除数据和更新数据的代码文本的程序代码后,我们就可以实现完整的生成C#代码文本的程序代码了,这些程序代码就是方法GenerateCode的全部内容,其代码为
private string GenerateCode( string nsName , string strFileName , System.Collections.ArrayList RecordTypes )
{
// 开始创建代码
IndentTextWriter myWriter = new IndentTextWriter();
myWriter.WriteLine("using System;");
myWriter.WriteLine("using System.Data;");
myWriter.WriteLine("namespace " + nsName);
myWriter.BeginGroup("{");
// 对每一个数据容器对象创建数据处理类的代码
foreach (Type RecordType in RecordTypes)
{
string TableName = RecordType.Name;
BindTableAttribute ta = (BindTableAttribute)Attribute.GetCustomAttribute(
RecordType, typeof(BindTableAttribute), false);
if (ta != null)
{
TableName = ta.Name;
}
if (TableName == null || TableName.Trim().Length == 0)
{
TableName = RecordType.Name;
}
TableName = TableName.Trim();
System.Reflection.PropertyInfo[] ps = this.GetBindProperties(RecordType);
myWriter.WriteLine("public class " + RecordType.Name + "ORMHelper : " + typeof(RecordORMHelper).FullName);
myWriter.BeginGroup("{");
myWriter.WriteLine("");
myWriter.WriteLine("///<summary>创建对象</summary>");
myWriter.WriteLine("public " + RecordType.Name + "ORMHelper(){}");
myWriter.WriteLine("");
生成重载TableName的代码
生成重载RecordFieldNames的代码
生成重载FillUpdateCommand的代码
生成重载FillDeleteCommand的代码
生成重载FillInsertCommand的代码
生成重载InnerReadRecord的代码
}//foreach
myWriter.EndGroup("}//namespace");
// 若需要保存临时生成的C#代码到指定的文件
if (strFileName != null && strFileName.Length > 0)
{
myWriter.WriteFile(strFileName, System.Text.Encoding.GetEncoding(936));
}
return myWriter.ToString();
}
更多精彩
赞助商链接