分类: WINDOWS
2012-01-15 18:11:11
GoGo代码生成器
1. 关于gogo
gogo是一个免费的代码生成工具,它基于模板生成代码,脚本语言为C#。
2. 认识gogo
2.1. gogo工作原理
gogo的工作原理如下图所示,
3. 如何使用
3.1. 编写模板脚本
3.1.1. gogo模板组成:
gogo模板文件使用C#编写,由以下7部分组成:
1. 环境变量区域:设置模板执行使用的环境变量
2. 模板嵌套区域:包含其他模板文件
3. Using区域:添加名称空间引用
4. 变量赋值区域:为脚本作为表达式并计算结果赋值给变量
5. Script区域:自定义函数
6. 执行脚本区域:模板的脚本区域
7. 文本区域:该区域的文本不经过处理,原样输出
如下图所示:
3.1.2. gogo模板内置变量及方法
gogo模板可使用的内置变量继承于模板基类,参考如下图,该图描述了模板中可以使用的内置变量和方法:
在内置变量TableSchema中,访问个字段属性时请使用DBColumn类型,该类型继承于DataColumn,添加了DbType,IsPK,Memo属性,如下图所示:
3.1.3. 示例模板 –《存储过程.gen》
<%@ OutFile=sp.sql OutMode=Append %> /******对象: StoredProcedure [<%=TableSchema.TableName%>_Update] 脚本日期: <%=DateTime.Now.ToString()%> ******/ SET ANSI_NULLS ON GO SET QUOTED_IDENTIFIER ON GO IF NOT EXISTS (SELECT * FROM sys.objects WHERE object_id = OBJECT_ID(N'[<%=TableSchema.TableName%>_Update]') AND type in (N'P', N'PC')) BEGIN EXEC dbo.sp_executesql @statement = N'CREATE PROCEDURE [<%=TableSchema.TableName%>_Update] <%int index=0; foreach(DBColumn col in TableSchema.Columns){%> <%if(index>0)%>, @<%=col.ColumnName%> [<%=col.Dbtype%>] <%if(col.MaxLength!=-1){%>(<%=col.MaxLength%>)<%}%> <%index++;}%> WITH EXECUTE AS CALLER AS update [<%=TableSchema.TableName%>] set <%index=0; foreach(DBColumn col in TableSchema.Columns){ if(!col.IsPK){%> <%if(index>0)%>, [<%=col.ColumnName%>]=@<%=col.ColumnName%> <%index++;} }%> where <%index=0;foreach(DBColumn col in TableSchema.Columns){ if(col.IsPK){ %> <%if(index>0){%> and <%}%>[<%=col.ColumnName%>]=@<%=col.ColumnName%> <% index++; } }%> ' END GO
/****** 对象: StoredProcedure [<%=TableSchema.TableName%>_Add] 脚本日期: <%=DateTime.Now.ToString()%> ******/ SET ANSI_NULLS ON GO SET QUOTED_IDENTIFIER ON GO IF NOT EXISTS (SELECT * FROM sys.objects WHERE object_id = OBJECT_ID(N'[<%=TableSchema.TableName%>_Add]') AND type in (N'P', N'PC')) BEGIN EXEC dbo.sp_executesql @statement = N'CREATE PROCEDURE [<%=TableSchema.TableName%>_Add] <%index=0; foreach(DBColumn col in TableSchema.Columns){ if(!col.AutoIncrement){%> <%if(index>0)%>, @<%=col.ColumnName%> [<%=col.Dbtype%>] <%if(col.MaxLength!=-1){%>(<%=col.MaxLength%>)<%}%> <%index++;} }%> WITH EXECUTE AS CALLER AS Insert into [<%=TableSchema.TableName%>] ( <%index=0; foreach(DBColumn col in TableSchema.Columns){ if(!col.AutoIncrement){%> <%if(index>0)%>, [<%=col.ColumnName%>] <%index++;} }%> ) values ( <%index=0; foreach(DBColumn col in TableSchema.Columns){ if(!col.AutoIncrement){%> <%if(index>0)%>, @<%=col.ColumnName%> <%index++;} }%> ) ' END GO
/******对象: StoredProcedure [<%=TableSchema.TableName%>_Delete] 脚本日期: <%=DateTime.Now.ToString()%> ******/ SET ANSI_NULLS ON GO SET QUOTED_IDENTIFIER ON GO IF NOT EXISTS (SELECT * FROM sys.objects WHERE object_id = OBJECT_ID(N'[<%=TableSchema.TableName%>_Delete]') AND type in (N'P', N'PC')) BEGIN EXEC dbo.sp_executesql @statement = N'CREATE PROCEDURE [<%=TableSchema.TableName%>_Delete] <%index=0; foreach(DBColumn col in TableSchema.Columns){ if(col.IsPK) {%> <%if(index>0)%>, @<%=col.ColumnName%> [<%=col.Dbtype%>] <%if(col.MaxLength!=-1){%>(<%=col.MaxLength%>)<%}%> <%index++;} }%> WITH EXECUTE AS CALLER AS Delete from [<%=TableSchema.TableName%>] where <%index=0; foreach(DBColumn col in TableSchema.Columns){ if(col.IsPK) {%> <%if(index>0)%> and [<%=col.ColumnName%>]=@<%=col.ColumnName%> <%index++;}}%> ' END GO
/******对象: StoredProcedure [<%=TableSchema.TableName%>_GetBYPK] 脚本日期: <%=DateTime.Now.ToString()%> ******/ SET ANSI_NULLS ON GO SET QUOTED_IDENTIFIER ON GO IF NOT EXISTS (SELECT * FROM sys.objects WHERE object_id = OBJECT_ID(N'<%=TableSchema.TableName%>_GetBYPK') AND type in (N'P', N'PC')) BEGIN EXEC dbo.sp_executesql @statement = N'CREATE PROCEDURE <%=TableSchema.TableName%>_GetBYPK <%index=0; foreach(DBColumn col in TableSchema.Columns){ if(col.IsPK) {%> <%if(index>0)%>, @<%=col.ColumnName%> [<%=col.Dbtype%>] <%if(col.MaxLength!=-1){%>(<%=col.MaxLength%>)<%}%> <%index++;} }%> WITH EXECUTE AS CALLER AS select * from [<%=TableSchema.TableName%>] where <%index=0; foreach(DBColumn col in TableSchema.Columns){ if(col.IsPK) {%> <%if(index>0)%> and [<%=col.ColumnName%>]=@<%=col.ColumnName%> <%index++;}}%> ' END GO |
3.2. 新建gogo项目