WEB开发网
开发学院软件开发C语言 C#发现之旅:基于反射和动态编译的快速ORM框架(下... 阅读

C#发现之旅:基于反射和动态编译的快速ORM框架(下)

 2010-09-30 21:08:22 来源:WEB开发网   
核心提示: 这里的KeyProperties,KeyParameterNames和myWhereSQL的值都在生成FillDeleteCommand时已经设置好了,C#发现之旅:基于反射和动态编译的快速ORM框架(下)(7),这里直接拿来用,若KeyProperties没有内容,删除数据和更新数据的代码文本

这里的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();
}

上一页  2 3 4 5 6 7 8 9 10  下一页

Tags:发现 之旅 基于

编辑录入:爽爽 [复制链接] [打 印]
赞助商链接