zoukankan      html  css  js  c++  java
  • 代码自动生成工具MyGeneration之一(程序员必备工具)

    代码自动生成工具MyGeneration之一(程序员必备工具)

    分类: C#2008-08-06 18:12 16064人阅读 评论(12) 收藏 举报

    工具数据库相关数据库stringbrowser存储

       前段时间用C#做网站,用到了大量数据库相关的东西。网站采用3层结构,即数据访问层(Data Access Layer),业务逻辑层(Business Logic Layer),页面表现层().做了一段时间,发现向数据访问层和业务逻辑层加入新的类,数据库的表结构改了,还要对应的修改数据访问层和业务逻辑层的代码,这个工作很是繁琐,无聊,而且容易出错。做了几次之后就想有什么办法可以让机器自动完成呢?

      联想到以前看过Java似乎有个Hibernate,可以很方便的实现对象关系映射(ORM),即自动的从数据库的表生成对应的对象,.Net也应该有类似的功能吧。于是找啊找,发现了很多.Net的ORM工具,不过都有缺点,就是代码得依赖于那些ORM工具,我希望能够让机器按我的要求生成我自己的代码,这样就更加灵活了。

      于是乎,发现了CodeSmith和MyGeneration,CodeSmith是 网上传的.NET 程序员十种必备工具之一,我们写代码时,经常需要重复完成某些特定的任务,例如编写数据访问代码或者生成自定义集合。我们可以用CodeSmith编写模板自动完成这些任务,从而不仅提高工作效率,而且能够自动完成那些最为乏味的任务。可惜,CodeSmith是需要注册的,试用版只能用15天。而MyGeneration基本上和CodeSmith的功能差不多哦,但是他是开源的。我选软件的原则是能开源免费的就用,实在没替代了才选那些需要注册的,有版权的软件。所以就选MyGeneration了。

      用过一段时间后感觉MyGeneration主要是为了自动生成数据库相关的代码的,可能C#用得比较多,其实我们可以用它生成任何代码,C++,JavaScript...而且还不仅仅局限于数据库,其他方面的代码也可以用MyGeneration自动生成。比如我们经常用数据访问层和业务逻辑层,用MyGeneration就可以自动生成这些代码,我们可以不用手动写代码了。比如数据访问层,我们需要调用一个存储过程,用MyGeneration我们只需要选择生成存储过程代码的模板,执行一下脚本,然后在界面上选择数据库上某个存储过程,然后就自动生成了数据库访问代码,整个过程只需要点几下鼠标,代码就自动生成了。这对于需要大量操作数据库的程序员来说,效率是多大的提升啊。

      废话少说,还是来点实在的吧。首先声明,我的MyGeneration版本是:1.3.0.3

      安装完MyGeneration后,第一次启动会要求进行一些数据库相关的配置。如图:

      ConnectionString: 就是指定连接哪个数据库了,填好这个就可以点确定了。

      下面来看一看其他的项都是什么。

      Language Mapping:就是指定数据库和对象基本类型的映射关系。让我们打开Languages.xml文件看一下吧:

    1. <Language From="SQL" To="C#">
    2. <Type From="bigint" To="long" />
    3. <Type From="binary" To="object" />
    4. <Type From="bit" To="bool" />
    5. <Type From="char" To="string" />
    6. <Type From="datetime" To="DateTime" />
    7. <Type From="decimal" To="decimal" />
    8. <Type From="float" To="double" />
    9. <Type From="image" To="byte[]" />
    10. <Type From="int" To="int" />
    11. <Type From="money" To="decimal" />
    12. <Type From="nchar" To="string" />
    13. <Type From="ntext" To="string" />
    14. <Type From="numeric" To="decimal" />
    15. <Type From="nvarchar" To="string" />
    16. <Type From="real" To="float" />
    17. <Type From="smalldatetime" To="DateTime" />
    18. <Type From="smallint" To="short" />
    19. <Type From="smallmoney" To="decimal" />
    20. <Type From="text" To="string" />
    21. <Type From="timestamp" To="byte[]" />
    22. <Type From="tinyint" To="byte" />
    23. <Type From="uniqueidentifier" To="Guid" />
    24. <Type From="varbinary" To="byte[]" />
    25. <Type From="varchar" To="string" />
    26. <Type From="xml" To="string" />
    27. <Type From="sql_variant" To="object" />
    28. </Language>

      这是里面的一段内容,很明显,是数据库SQL的字段转到C#是什么类型,里面没有C++的,假如我们要让它支持C++的话,需要在这里加入SQL到C++的类型转换。

      Database Target Mapping:先看里面的内容吧:

    1. <DbTarget From="ACCESS" To="DAO">
    2. <Type From="Text" To="DAO.dbText" />
    3. <Type From="Memo" To="DAO.dbMemo" />
    4. <Type From="DateTime" To="DAO.dbDate" />
    5. <Type From="Currency" To="DAO.dbCurrency" />
    6. <Type From="Yes/No" To="DAO.dbBoolean" />
    7. <Type From="OLE Object" To="DAO.dbLongBinary" />
    8. <Type From="Hyperlink" To="DAO.dbMemo" />
    9. <Type From="Double" To="DAO.dbDouble" />
    10. <Type From="Replication ID" To="DAO.dbGUID" />
    11. <Type From="Long" To="DAO.dbLong" />
    12. <Type From="Single" To="DAO.dbSingle" />
    13. <Type From="Decimal" To="DAO.dbDecimal" />
    14. <Type From="Byte" To="DAO.dbByte" />
    15. <Type From="Integer" To="DAO.dbInteger" />
    16. </DbTarget>

      呵呵,一目了然,就是Access数据库用DAO的方式访问,数据库的列的类型对应的DAO里是什么类型。

      UseMetaData目前没什么用。

      看看MyGeneration的界面吧:

       Template Browser 面板 列出了一些模板,这是自动生成代码需要用到的模板。安装的时候会自己带很多模板。

       MyMeta Browser则列出了当前连接的数据库上有些什么库,表,存储过程。

       工作区则是具体模板对应的代码。

       先让我们体验一下吧。

       展开Template Browser面板下"d00dads - C#", 双击 “d00dads - Invoke a Stored Procedure", 让工作区显示其内容,

    然后点击工具栏上的 "Execute" 按钮,如图红框所示:

      弹出对话框,如图:

      选择数据库,存储过程,存储过程类型,点确定(OK)。

      然后可以看到工作区 Output 里输出了代码了。例如:

    1. using System.Data;
    2. using System.Collections.Specialized;  
    3. using System.Data.SqlClient;       
    4. public virtual void dm_exec_cursors (int spid)
    5.         {
    6.             ListDictionary parameters = new ListDictionary();
    7.             parameters.Add( new SqlParameter("@spid", SqlDbType.Int, 0), spid);
    8.             LoadFromSqlNoExec("dm_exec_cursors", parameters);
    9.         }

      这就是MyGeneration自动获取了存储过程的输入参数,然后在代码里构造相应的参数,然后生成的代码。

      这只是MyGeneration自带的模板生成的,大家可以试一试其他的模板的效果。

      里面有自动根据表结构生成BLL的类......看下效果:

    1. /*
    2. '===============================================================================
    3. '  Generated From - CSharp_dOOdads_BusinessEntity.vbgen
    4. '
    5. '  ** IMPORTANT  **
    6. '  How to Generate your stored procedures:
    7. '
    8. '  SQL        = SQL_StoredProcs.vbgen
    9. '  ACCESS     = Access_StoredProcs.vbgen
    10. '  ORACLE     = Oracle_StoredProcs.vbgen
    11. '  FIREBIRD   = FirebirdStoredProcs.vbgen
    12. '  POSTGRESQL = PostgreSQL_StoredProcs.vbgen
    13. '
    14. '  The supporting base class OleDbEntity is in the Architecture directory in "dOOdads".
    15. '  This object is 'abstract' which means you need to inherit from it to be able
    16. '  to instantiate it.  This is very easilly done. You can override properties and
    17. '  methods in your derived class, this allows you to regenerate this class at any
    18. '  time and not worry about overwriting custom code.
    19. '
    20. '  NEVER EDIT THIS FILE.
    21. '
    22. '  public class YourObject :  _YourObject
    23. '  {
    24. '
    25. '  }
    26. '
    27. '===============================================================================
    28. */
    29. // Generated by MyGeneration Version # (1.3.0.3)
    30. using System;
    31. using System.Data;
    32. using System.Data.OleDb;
    33. using System.Collections;
    34. using System.Collections.Specialized;
    35. using MyGeneration.dOOdads;
    36. namespace Your.Namespace
    37. {
    38. public abstract class _Users : OleDbEntity
    39.     {
    40. public _Users()
    41.         {
    42. this.QuerySource = "Users";
    43. this.MappingName = "Users";
    44.         }  
    45. //=================================================================
    46. //  public Overrides void AddNew()
    47. //=================================================================
    48. //
    49. //=================================================================
    50. public override void AddNew()
    51.         {
    52. base.AddNew();
    53.         }
    54. public override string GetAutoKeyColumn()
    55.         {
    56. return "ID";
    57.         }
    58. public override void FlushData()
    59.         {
    60. this._whereClause = null;
    61. this._aggregateClause = null;
    62. base.FlushData();
    63.         }
    64. //=================================================================
    65. //      public Function LoadAll() As Boolean
    66. //=================================================================
    67. //  Loads all of the records in the database, and sets the currentRow to the first row
    68. //=================================================================
    69. public bool LoadAll()
    70.         {
    71.             ListDictionary parameters = null;
    72. return base.LoadFromSql("[" + this.SchemaStoredProcedure + "proc_UsersLoadAll]", parameters);
    73.         }
    74. //=================================================================
    75. // public Overridable Function LoadByPrimaryKey()  As Boolean
    76. //=================================================================
    77. //  Loads a single row of via the primary key
    78. //=================================================================
    79. public virtual bool LoadByPrimaryKey()
    80.         {
    81.             ListDictionary parameters = new ListDictionary();
    82. return base.LoadFromSql("[" + this.SchemaStoredProcedure + "proc_UsersLoadByPrimaryKey]", parameters);
    83.         }
    84.         #region Parameters
    85. protected class Parameters
    86.         {
    87. public static OleDbParameter ID
    88.             {
    89. get
    90.                 {
    91. return new OleDbParameter("@ID", OleDbType.Integer, 0);
    92.                 }
    93.             }
    94. public static OleDbParameter Alias
    95.             {
    96. get
    97.                 {
    98. return new OleDbParameter("@Alias", OleDbType.VarChar, 2147483647);
    99.                 }
    100.             }
    101.         }
    102.         #endregion     
    103.         #region ColumnNames
    104. public class ColumnNames
    105.         { 
    106. public const string ID = "ID";
    107. public const string Alias = "Alias";
    108. static public string ToPropertyName(string columnName)
    109.             {
    110. if(ht == null)
    111.                 {
    112.                     ht = new Hashtable();
    113.                     ht[ID] = _Users.PropertyNames.ID;
    114.                     ht[Alias] = _Users.PropertyNames.Alias;
    115.                 }
    116. return (string)ht[columnName];
    117.             }
    118. static private Hashtable ht = null;         
    119.         }
    120.         #endregion
    121.         #region PropertyNames
    122. public class PropertyNames
    123.         { 
    124. public const string ID = "ID";
    125. public const string Alias = "Alias";
    126. static public string ToColumnName(string propertyName)
    127.             {
    128. if(ht == null)
    129.                 {
    130.                     ht = new Hashtable();
    131.                     ht[ID] = _Users.ColumnNames.ID;
    132.                     ht[Alias] = _Users.ColumnNames.Alias;
    133.                 }
    134. return (string)ht[propertyName];
    135.             }
    136. static private Hashtable ht = null;         
    137.         }           
    138.         #endregion 
    139.         #region StringPropertyNames
    140. public class StringPropertyNames
    141.         { 
    142. public const string ID = "s_ID";
    143. public const string Alias = "s_Alias";
    144.         }
    145.         #endregion     
    146.         #region Properties
    147. public virtual Integer ID
    148.         {
    149. get
    150.             {
    151. return base.GetInteger(ColumnNames.ID);
    152.             }
    153. set
    154.             {
    155. base.SetInteger(ColumnNames.ID, value);
    156.             }
    157.         }
    158. public virtual String Alias
    159.         {
    160. get
    161.             {
    162. return base.GetString(ColumnNames.Alias);
    163.             }
    164. set
    165.             {
    166. base.SetString(ColumnNames.Alias, value);
    167.             }
    168.         }
    169.         #endregion
    170.         #region String Properties
    171. public virtual string s_ID
    172.         {
    173. get
    174.             {
    175. return this.IsColumnNull(ColumnNames.ID) ? string.Empty : base.GetIntegerAsString(ColumnNames.ID);
    176.             }
    177. set
    178.             {
    179. if(string.Empty == value)
    180. this.SetColumnNull(ColumnNames.ID);
    181. else
    182. this.ID = base.SetIntegerAsString(ColumnNames.ID, value);
    183.             }
    184.         }
    185. public virtual string s_Alias
    186.         {
    187. get
    188.             {
    189. return this.IsColumnNull(ColumnNames.Alias) ? string.Empty : base.GetStringAsString(ColumnNames.Alias);
    190.             }
    191. set
    192.             {
    193. if(string.Empty == value)
    194. this.SetColumnNull(ColumnNames.Alias);
    195. else
    196. this.Alias = base.SetStringAsString(ColumnNames.Alias, value);
    197.             }
    198.         }
    199.         #endregion      
    200. private AggregateClause _aggregateClause = null;   
    201.         #endregion
    202. protected override IDbCommand GetInsertCommand()
    203.         {
    204.             OleDbCommand cmd = new OleDbCommand();
    205.             cmd.CommandType = CommandType.StoredProcedure;
    206.             cmd.CommandText = "[" + this.SchemaStoredProcedure + "proc_UsersInsert]";
    207.             CreateParameters(cmd);
    208. return cmd;
    209.         }
    210. protected override IDbCommand GetUpdateCommand()
    211.         {
    212.             OleDbCommand cmd = new OleDbCommand();
    213.             cmd.CommandType = CommandType.StoredProcedure;
    214.             cmd.CommandText = "[" + this.SchemaStoredProcedure + "proc_UsersUpdate]";
    215.             CreateParameters(cmd);
    216. return cmd;
    217.         }
    218. protected override IDbCommand GetDeleteCommand()
    219.         {
    220.             OleDbCommand cmd = new OleDbCommand();
    221.             cmd.CommandType = CommandType.StoredProcedure;
    222.             cmd.CommandText = "[" + this.SchemaStoredProcedure + "proc_UsersDelete]";
    223.             OleDbParameter p;
    224. return cmd;
    225.         }
    226. private IDbCommand CreateParameters(OleDbCommand cmd)
    227.         {
    228.             OleDbParameter p;
    229.             p = cmd.Parameters.Add(Parameters.ID);
    230.             p.SourceColumn = ColumnNames.ID;
    231.             p.SourceVersion = DataRowVersion.Current;
    232.             p = cmd.Parameters.Add(Parameters.Alias);
    233.             p.SourceColumn = ColumnNames.Alias;
    234.             p.SourceVersion = DataRowVersion.Current;
    235. return cmd;
    236.         }
    237.     }
    238. }

       这就是自动获得表结构,然后从字段映射成类里面的成员,并且还有一些插入,更新,删除的代码。

       当然自带的模板生成的代码不一定符合我们的需要,但是我们可以根据需要自己写一些模板来生成符合自己需要的代码,这也是非常容易的事,欲知如何实现,请看下回文章。

    代码自动生成工具MyGeneration之二

  • 相关阅读:
    每日作业报告
    每日作业报告
    每日作业报告
    每日作业报告
    每日作业报告
    每日作业报告
    每日作业报告
    每日作业报告
    每日作业报告
    关系模式分解例题
  • 原文地址:https://www.cnblogs.com/sczw-maqing/p/3262218.html
Copyright © 2011-2022 走看看