代码生成器设计说明书
作者:何鹏
版本号:1.0
时间:2009-12-11
修改时间:
版权所有:
1 引言
编写目的
      说明编写这份总体设计说明书的目的,指出预期的读者。
本文档平台中代码生成器的开发、测试提供依据、指导。预期的读者主要包括相关开发人员,测试人员。
设计目标
从现有数据库中生成ADNet1.0标准框架中的数据访问层,包括实体对象,IDALDALBLL层代码,并根据数据库自动生成解决方案,每层的项目文件及各个表的代码文件。下图就是ADNet平台体系架构图。
ADNet平台体系架构图
背景
项目程序员在一个项目开发中需要花很多时间编写与数据库相关的数据访问层相关的代码,而这些代码结构相同,内容相似,与数据库联系紧密,代码量大。
为了让项目程序员从这些繁重的重复的代码编写工作解脱出来,专心于业务逻辑的代码编写,我们需要设计一个根据数据库中的表自动产生数据访问层相关的代码文件。
由于Model,IDAL,DAL,BLL层代码结构固定,变化不大,使自动生成代码成为可能。所以我们在这个基础上设计了代码生成器。
定义
      列出本文件用到的专门术语的定义和外文首字母组词的原词组。
参考资料
动软.Net代码生成器 (参考其程序结构功能)
ADNetDemo代码文件  (参考其代码几层的结构及规范)
2 框架设计
应用架构
我们从数据库抽取,代码生成两个结构来说明。
     
体系结构
       
总体架构
体系结构
3 代码生成器详细设计
3.1.1 概述
代码生成器主要实现数据字段的读取和代码文字的组装,然后就是利用控件TextEditorControl实现对SQL语句和C#代码的高亮显示;最后我们界面利用DotNetBar控件做成类似于VS2005的界面风格。
3.1.2 功能
列出主要功能:
访问三种不同数据库
产生数据库的树形列表
查看数据库属性(表,视图,存储过程,字段)
通过表名自动产生SQL基本语句(select,insert,update,delete)
执行sql语句并返回结果
获得视图,存储过程的sql定义
用户自定义代码生成(可选择层,可选择生成的DAL函数)
用户批量生成代码文件(解决方案文件,项目文件,各个层的代码文件)
3.1.3 解决方案
总体组件包结构
下面是代码生成器主要结构包图。
说明:
接口IDAL主要功能是获取不同数据库的各个名称,内容,以及获取表结构,字段结构,视图,存储过程定义,并提供接口执行SQL语句。
TextCodeUtility类,主要通过字段信息按照规范组装C#代码。
ADFactroyModelCodeEdit类,主要通过TextCodeUtility类生成各个层代码并写入TextCode控件或者生成cs文件。
DocEditFramework该包,主要生成SQL执行页面和数据库属性页面,用于动态创建。
DBUtility用于提供访问各个数据库通用接口。
类图
参与者和职责
策略
相关模式
为了实现对不同数据库访问,我们主要使用了工厂模式。
效果
4 关键应用场景代码片断
//获取字段明细
public System.Data.DataTable GetTableColDetails(string DBName, string TableName)
        {
            StringBuilder sqlDetails = new StringBuilder();
            sqlDetails.Append("select ORDINAL_POSITION as 序号,COLUMN_NAME as 列名,DATA_TYPE as 字段类型,");
            sqlDetails.Append("ifnull(CHARACTER_MAXIMUM_LENGTH,0)+ifnull(NUMERIC_PRECISION,0) as 长度,");
            sqlDetails.Append("case IS_NULLABLE when 'YES' then true else false end as 是否为空,");
            sqlDetails.Append("case COLUMN_KEY when 'PRI' then true else false end as 是否主键 ");
            sqlDetails.Append(string.Format(@"from information_schema.COLUMNS where TABLE_SCHEMA='{0}' and TABLE_NAME ='{1}';", DBName, TableName));
            return DB.ExecuteQuery(sqlDetails.ToString());
        }
//根据需要获取表,视图,存储过程列表
public System.Data.DataTable页面设计代码 GetDBTableDetails(string DBName, DBOBJType type)
        {
            StringBuilder sqlDetails = new StringBuilder();
            sqlDetails.Append(@" select TABLE_NAME AS 名称,case TABLE_TYPE when 'BASE TABLE' THEN '基础表' when 'VIEW' then '视图' ");
            sqlDetails.Append(@" when 'SYSTEM VIEW'  then '系统视图' else '' end as 类型 , 'dbo' as 所有者, CREATE_TIME as 创建时间 ");
            sqlDetails.Append(" from information_schema.TABLES ");
            switch (type)
            {
                case DBOBJType.A:           
                    sqlDetails.Append(string.Format(" where TABLE_SCHEMA ='{0}' union ",DBName));
                    sqlDetails.Append(" select name as 名称,'存储过程' as 类型,'dbo' as 所有者,created as 创建时间 ");
                    sqlDetails.Append(string.Format(" from mysql.proc where db='{0}' ", DBName));
                    break;
                case DBOBJType.U:
                    sqlDetails.Append(string.Format(" where TABLE_SCHEMA ='{0}' and TABLE_TYPE='BASE TABLE' ", DBName));
                    break;
                case DBOBJType.V:
                  sqlDetails.Append(string.Format(" where TABLE_SCHEMA ='{0}' and TABLE_TYPE='VIEW' ", DBName));
                  break;
                case DBOBJType.P:           
                    sqlDetails.Remove(0, sqlDetails.Length);
                    sqlDetails.Append(" select name as 名称,'存储过程' as 类型,'dbo' as 所有者,created as 创建时间 ");
                    sqlDetails.Append(string.Format("from mysql.proc where db='{0}'", DBName));
                    break;
            }
sqlDetails.Append(" order by 类型,名称;");
            return DB.ExecuteQuery(sqlDetails.ToString());       
        }
//获取sql语句
public string GetDDLScriptFromName(string DBName, string TableName, DDL ddl)
        {
            string sqlstring;
            switch (ddl)
            {
                case DDL.SELECT:
                    sqlstring = GetSelectTableScriptFromName(DBName, TableName);
                    break;
                case DDL.INSERT:
                    sqlstring = GetInsertScriptFromName(DBName, TableName);
                    break;
                case DDL.UPDATE:

版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。