用 StringTemplate重新制作代码生成工具

来源:互联网 发布:淘宝国产手机 编辑:程序博客网 时间:2024/06/09 19:53
放假没事干,重做了一下以前做的代码生成工具(在《基于CodeSmith的数据处理代码生成工具》中提到),正确来说,以前的是CodeSmith的模板,必须安装该软件才能使用,很不爽。(文/Stephen.Huang)

  这次用StringTemplate来生成模板,而自己则负责写以前CodeSmith负责做的东西,如获取数据库,表,列的Schema,并封装成一个一个类。

  制作这个代码生成工具时,考虑到的和遇到的一些问题总结一下:

  1.必需适应各种不同的数据库

  a)使用DbProviderFactory来创建各种对象,如DbParameter。想起以前一直都是hardcode SqlParameter。DbProviderFactory会根据数据库驱动的不同,创建不同的对象,如 providerName="System.Data.SqlClient"时,用 DbProviderFactory.CreateParameter,会创建SqlParameter类型的对象。

  b)把MS的SqlHelper改写(不知道是不是MS写的),全部改写成System.Data.Common下的数据库对象(DbProviderFactory Create出来的对象,用DbType而不用SqlDbType),并只保留一些常用的方法(事实上是全部改写很麻烦),如 PrepareParameter,ExecuteReader,ExecuteNonQuery,ExecuteDataSet(ExecuteDataSet 还是尽量避免使用的,留下来以防万一)。

  c)在获取Schema时遇到的问题-命名规范:Select * from 表名,表名中出现保留字时,不同的数据库可能不一样,比较难解决,不同的数据库解决方法可能不同。SqlServer中需要为表名加上"[]"(如果表名中包含了"["或"]"中任意一个,还需要特殊处理,自己一般不会这样来给表命名,忽略- -)。

  d)在获取Schema时遇到的问题2:当SQL2005里面遇到视图如[HumanResouce].[vEmployee],则 select * from vEmployee无效,必须要select * from [HumanResouce].[vEmployee],不知道其他数据库是什么情况- -看来要做成通用的,真的很难,还是以后根据实际情况再改吧:)

  e)使用DbDataReader.GetSchemaTable才会遇到上述c、d这两个需要写sql才能获取schema的问题。还有一种方法是使用DbConnection.GetSchema来获取字段的信息,但是此方法比较繁琐,本人尚未成功地获取Primary key和identity Column等的详细信息(T_T),有空再研究研究。

  f)从数据库中取出的原始信息,为适应各种数据库建立不同TableWrapper和CoumnWrapper(即使用原始信息对不同数据库进行封装),对不同的程语编言建立各种别名(如用CSharpAlias类能够把System.Int32转变成int),对不同的数据库创建不同的 sql模板(有待完成)。

  2.使用何种模板引擎

  这里选择了StringTemplate。为什么?因为学习简单,使用也简单,功能很强大。当使用 stringTemplate.SetAttribute("pkColumns", tableWrapper.PkColumns); 后,可以在模板里访问PkColumns里面的public Field和Property。包含判断和循环的语法。支持嵌套模板。

  还差一个可视化使用界面,懒,暂时先将就使用一下- -

  附上模板的代码:(下载地址)
  1. using System;
  2. using System.Configuration;
  3. using System.Data;
  4. using System.Data.Common;
  5. using System.Collections.Generic;

  6. namespace
  7. {
  8.     public class $table.EntityName$Dao
  9.     {
  10.         private static ConnectionStringSettings dbSettings = DataConnection.;
  11.         private static string connectionString = dbSettings.ConnectionString;
  12.         private static DbProviderFactory dbFactory = DbProviderFactories.GetFactory(dbSettings.ProviderName);
  13.         
  14.         public static List<$table.EntityName[        DISCUZ_CODE_1        ]gt; GetAll()
  15.         {
  16.             var list = new List<$table.EntityName[        DISCUZ_CODE_1        ]gt;();
  17.             DbDataReader dr = null;
  18.             try
  19.             {
  20.                 dr = SqlHelper.ExecuteReader(dbFactory, connectionString
  21.                     , CommandType.Text
  22.                     , "select $allColumns:{$it.QualifiedColumnName$};separator=","$ from $table.QualifiedTableName[        DISCUZ_CODE_2        ]quot;);
  23.                 while (dr != null && dr.Read())
  24.                 {
  25.                     var obj = new $table.EntityName$();
  26.                     $allColumns:{obj.$it.PropName$ = Field.Get$it.SystemTypeShortName$(dr, "$it.Name[        DISCUZ_CODE_2        ]quot;);};separator="\r\n"$
  27.                     list.Add(obj);
  28.                 }
  29.             }
  30.             finally
  31.             {
  32.                 if (dr != null)
  33.                 {
  34.                     dr.Close();
  35.                     dr.Dispose();
  36.                 }
  37.             }
  38.             return list;
  39.         }$if(table.IsTable)$
  40.         
  41.         public static $table.EntityName$ Get($pkColumns:{$it.SystemType$ $it.VarName$};separator=","$)
  42.         {
  43.             $table.EntityName$ obj = null;
  44.             DbDataReader dr = null;
  45.             try
  46.             {
  47.                 var paras = new DbParameter[]{
  48.                     $pkColumns:{SqlHelper.PrepareParameter(dbFactory, "$it.Name[        DISCUZ_CODE_2        ]quot;, $it.DBType$, $it.VarName$)};separator=",\r\n"$
  49.                 };

  50.                 dr = SqlHelper.ExecuteReader(dbFactory, connectionString
  51.                     , CommandType.Text
  52.                     , "select $allColumns:{$it.QualifiedColumnName$};separator=","$ from $table.QualifiedTableName$ where $pkColumns:{$it.QualifiedColumnName$=@$it.PropName$};separator="and "[        DISCUZ_CODE_2        ]quot;, paras);
  53.                 if (dr != null && dr.Read())
  54.                 {
  55.                     obj = new $table.EntityName$();
  56.                     $allColumns:{obj.$it.PropName$ = Field.Get$it.SystemTypeShortName$(dr, "$it.Name[        DISCUZ_CODE_2        ]quot;);};separator="\r\n"$
  57.                 }
  58.             }
  59.             finally
  60.             {
  61.                 if (dr != null)
  62.                 {
  63.                     dr.Close();
  64.                     dr.Dispose();
  65.                 }
  66.             }
  67.             return obj;
  68.         }
  69.         
  70.         public static bool Insert($table.EntityName$ obj)
  71.         {
  72.             bool flag = false;
  73.             try
  74.             {
  75.                 var paras = new DbParameter[]{
  76.                     $nonIdColumns:{SqlHelper.PrepareParameter(dbFactory, "$it.Name[        DISCUZ_CODE_2        ]quot;, $it.DBType$, obj.$it.PropName$)};separator=",\r\n"$
  77.                 };
  78.                 SqlHelper.ExecuteNonQuery(dbFactory, connectionString
  79.                     , CommandType.Text
  80.                     , "insert into $table.QualifiedTableName$($nonIdColumns:{$it.QualifiedColumnName$};separator=", "$) values($nonIdColumns:{@$it.PropName$};separator=", "$)", paras);
  81.                 flag = true;
  82.             }
  83.             catch (Exception)
  84.             {
  85.                 flag = false;
  86.             }
  87.             return flag;
  88.         }
  89.         
  90.         public static bool Update($table.EntityName$ obj)
  91.         {
  92.             bool flag = false;
  93.             try
  94.             {
  95.                 var paras = new DbParameter[]{
  96.                     $allColumns:{SqlHelper.PrepareParameter(dbFactory, "$it.Name[        DISCUZ_CODE_2        ]quot;, $it.DBType$, obj.$it.PropName$)};separator=",\r\n"$
  97.                 };
  98.                 SqlHelper.ExecuteNonQuery(dbFactory, connectionString
  99.                     , CommandType.Text
  100.                     , "update $table.QualifiedTableName$ set $updateColumns:{$it.QualifiedColumnName$=@$it.PropName$};separator=", "$ where $pkColumns:{$it.QualifiedColumnName$=@$it.PropName$};separator="and "[        DISCUZ_CODE_2        ]quot;, paras);
  101.                 flag = true;
  102.             }
  103.             catch (Exception)
  104.             {
  105.                 flag = false;
  106.             }
  107.             return flag;
  108.         }
  109.         
  110.         public static bool Delete($pkColumns:{$it.SystemType$ $it.VarName$};separator=","$)
  111.         {
  112.             bool flag = false;
  113.             try
  114.             {
  115.                 var paras = new DbParameter[]{
  116.                     $pkColumns:{SqlHelper.PrepareParameter(dbFactory, "$it.Name[        DISCUZ_CODE_2        ]quot;, $it.DBType$, $it.VarName$)};separator=",\r\n"$
  117.                 };
  118.                 SqlHelper.ExecuteNonQuery(dbFactory, connectionString
  119.                     , CommandType.Text
  120.                     , "delete from $table.QualifiedTableName$ where $pkColumns:{$it.QualifiedColumnName$=@$it.PropName$};separator="and "[        DISCUZ_CODE_2        ]quot;, paras);
  121.                 flag = true;
  122.             }
  123.             catch (Exception)
  124.             {
  125.                 flag = false;
  126.             }
  127.             return flag;
  128.         }$endif$
  129.     }
  130. }
复制代码
原创粉丝点击