CodeSmith应用实例(一)

转载 2007年10月01日 10:58:00
一、一个简单的例子
 
       这个例子仅是一个简单的应用,在我翻译并学习完CodeSmith的英文帮助文档后,对CodeSmith有了一定的了解,开始着手编写一些CodeSmith应用模板,今天按照最早提到的例子自行编写了一个基于表的添加存储过程的生成模板。具体语法前面基础中已做过详细解释这里仅是一个小综合应用的例子,望对大家学习CodeSmith有很好的帮助。我的同事也写了几个CodeSmith的技巧的文章http://terrylee.cnblogs.com/大家有空去看看,写的很不错哦,都是针对于CodeSmith自定义属性编写的东东:)
 1<%@ CodeTemplate Language="C#" TargetLanguage="T-SQL" Description="Create a procedure which have insert function base on a table." %>
 2<%@ Assembly Name="SchemaExplorer" %>
 3<%@ Import Namespace="SchemaExplorer" %>
 4<%@ Property Name="SourceTable" Type="SchemaExplorer.TableSchema" Category="DataTable" Description="Table that the stored procedures should be based on." %>
 5<%@ Property Name="Author" Type="String" Category="Context" Description="The author for this procedure."%>
 6<%@ Property Name="Description" Type="String" Category="Context" Description="The description for this procedure."%>
 7<script runat="template">
 8public string GetSqlParameterStatement(ColumnSchema column)
 9{
10    string param = "@" + column.Name + " " + column.NativeType;
11    switch (column.DataType)
12    {
13        case DbType.Decimal:
14        {
15            param += "(" + column.Precision + ", " + column.Scale + ")";
16            break;
17        }
18        default:
19        {
20            if (column.Size > 0)
21            {
22                param += "(" + column.Size + ")";
23            }
24            break;
25        }
26    }
27    return param;
28}
29</script>
30CREATE PROCEDURE dbo.<%=SourceTable.Name %>Insert
31/*
32==================================================
33Author:<%= Author %>
34CreatedTime:<%= System.DateTime.Now.ToShortDateString() %>
35Description:<%= Description %>
36==================================================
37*/
38<% for (int i = 0; i < SourceTable.Columns.Count; i++) { %>
39<%= GetSqlParameterStatement(SourceTable.Columns[i]) %><% if (i < SourceTable.Columns.Count - 1) { %>,<% } %>    <% if (SourceTable.Columns[i].Description != "") { %>--<%= SourceTable.Columns[i].Description %><% } %>
40<% } %>
41AS
42Insert Into [<%= SourceTable.Name %>
43(
44<% for (int i = 0; i < SourceTable.Columns.Count; i++) { %>
45[<%= SourceTable.Columns[i].Name %>]<% if (i < SourceTable.Columns.Count - 1) { %>,<% } %>    <% if (SourceTable.Columns[i].Description != "") { %>--<%= SourceTable.Columns[i].Description %><% } %>
46<% } %>
47)
48Values
49(
50<% for (int i = 0; i < SourceTable.Columns.Count; i++) { %>
51@<%= SourceTable.Columns[i].Name %><% if (i < SourceTable.Columns.Count - 1) { %>,<% } %>
52<% } %>
53)

二、具有删除功能的模板

        今天又根据CodeSmith的几个基本组件写出了基于表生成删除功能的存储过程代码生成模板。
        昨天觉得添加的存储过程模板写的比较简单,今天准备详细介绍一下这个删除的模板。
        首先介绍我们使用到的一个教本函数GetSqlParameterStatement(ColumnSchema column),其函数代码如下:

 1public string GetSqlParameterStatement(ColumnSchema column)
 2{
 3    string param = "@" + column.Name + " " + column.NativeType;
 4    switch (column.DataType)
 5    {
 6        case DbType.Decimal:
 7        {
 8            param += "(" + column.Precision + "" + column.Scale + ")";
 9            break;
10        }

11        default:
12        {
13            if (column.Size > 0)
14            {
15                param += "(" + column.Size + ")";
16            }

17            break;
18        }

19    }

20    return param;
21}

        大家可以看到,这个函数需要传入一个ColumnSchema类型的参数,它代表一个数据表中的列,并且是一个列,然后根据ColumnSchema这个类具有的属性,对传入的列进行一些操作然后返回我们生成存储过程时需要的代码。
        首先介绍一下ColumnSchema的一些常用属性,如下表: 

属性Property

描述Description

AllowDBNull

是否允许空值NULL

Database

通过DatabaseSchema对象得到当前列所属的数据库

DataType

此数据对象的数据类型

Description

当前对象的描述

ExtendedProperties

用来存储SchemaObject的其他附加信息

IsForeignKeyMember

当前列是否为外键

IsPrimaryKeyMember

当前列是否为主键

IsUnique

当前列是否唯一

Name

列的名称

NativeType

列定义的数据类型

Precision

数据对象的精度

Scale

数据对象的范围(个人理解为需要保留小数的范围)

Size

数据对象的大小(例如:字符串长度为10

SystemType

数据对象的系统类型

Table

当前列所属的数据表

        下面为我们首先要生成存储过程,要自动生成的代码分成了红、绿、蓝三部分。
CREATE PROCEDURE dbo.CustomersDelete
/*
==================================================
Author:Bear-Study-Hard
CreatedTime:2005-12-28
Description:Delete a record from table Customers
==================================================
*/
@CustomerID nchar(5) --客户ID
AS
Delete From [Customers]
Where
[CustomerID] = @CustomerID

    我们的这个脚本函数就是要实现拼出红色的部分,GetSqlParameterStatement函数接收ColumnSchema类型的参数后,从其Name属性和NativeType属性拼出@CustomerID nchar部分,然后由于不同的数据类型尤其是数值类型和字符串类型的区别,会导致数据类型的大小会有所不同,这里仅对Decimal的数据类型进行了判断(Numericfloat等均需要这种处理),然后根据Precision属性得到精度并通过Scale属性得到了需要保留小数的范围。如果传出的为非Decimal类型字段则直接通过Size属性取出其大小即可。得到了(5)部分。最后的注释是为了生成的存储过程解读性好加上的,使用的是Description属性。
    剩下的绿色部分和蓝色部分生成时比较简单,请各位自行学习。模板代码为:

 1<%@ CodeTemplate Language="C#" TargetLanguage="T-SQL" Description="Create a procedure which have delete function base on a table.Must use PrimaryKey to delete a record." %>
 2<%@ Assembly Name="SchemaExplorer" %>
 3<%@ Import Namespace="SchemaExplorer" %>
 4<%@ Property Name="SourceTable" Type="SchemaExplorer.TableSchema" Category="DataTable" Description="Table that the stored procedures should be based on." %>
 5<%@ Property Name="Author" Type="String" Category="Context" Description="The author for this procedure." Optional="true"%>
 6<%@ Property Name="Description" Type="String" Category="Context" Description="The description for this procedure." Optional="true"%>
 7<script runat="template">
 8public string GetSqlParameterStatement(ColumnSchema column)
 9{
10    string param = "@" + column.Name + " " + column.NativeType;
11    switch (column.DataType)
12    {
13        case DbType.Decimal:
14        {
15            param += "(" + column.Precision + ", " + column.Scale + ")";
16            break;
17        }
18        default:
19        {
20            if (column.Size > 0)
21            {
22                param += "(" + column.Size + ")";
23            }
24            break;
25        }
26    }
27    return param;
28}
29</script>
30CREATE PROCEDURE dbo.<%=SourceTable.Name %>Delete
31/*
32==================================================
33Author:<%= Author %>
34CreatedTime:<%= System.DateTime.Now.ToShortDateString() %>
35Description:<%= Description %>
36==================================================
37*/
38<% for (int i = 0; i < SourceTable.PrimaryKey.MemberColumns.Count; i++) { %>
39<%= GetSqlParameterStatement(SourceTable.PrimaryKey.MemberColumns[i]) %><% if (i < SourceTable.PrimaryKey.MemberColumns.Count - 1) { %>,<% } %>    <% if (SourceTable.Columns[i].Description != "") { %>--<%= SourceTable.Columns[i].Description %><% } %>
40<% } %>
41AS
42Delete From [<%= SourceTable.Name %>
43Where
44<% for (int i = 0; i < SourceTable.PrimaryKey.MemberColumns.Count; i++) { %>
45<% if (i > 0) { %>AND <% } %>[<%= SourceTable.PrimaryKey.MemberColumns[i].Name %>] = @<%= SourceTable.PrimaryKey.MemberColumns[i].Name %>
46<% } %>

    如果有问题我会尽力帮助大家解决的,共同提高^_^
 

CodeSmith应用实例(一)

一、一个简单的例子        这个例子仅是一个简单的应用,在我翻译并学习完CodeSmith的英文帮助文档后,对CodeSmith有了一定的了解,开始着手编写一些CodeSmith应用模板,今天按...
  • liyejun
  • liyejun
  • 2007年07月20日 17:12
  • 395

CodeSmith应用实例

一、一个简单的例子        这个例子仅是一个简单的应用,在我翻译并学习完CodeSmith的英文帮助文档后,对CodeSmith有了一定的了解,开始着手编写一些CodeSmith应用模板,...
  • sjsm2007
  • sjsm2007
  • 2014年01月08日 16:33
  • 472

CodeSmith应用实例(二)

三、微软的一个例子       今天在微软的网站看到的一篇使用CodeSmith的例子,现在写出来大家一起研究研究。        首先,我还是要简要介绍一下其中用到的基础知识。        1.在...
  • liyejun
  • liyejun
  • 2007年07月20日 17:13
  • 338

使用CodeSmith生成数据实体类

首先到网上下载codesmith工具(必须是破解版) 然后在CodeSmithStudio新建一个Csharp的Template 最后拷贝代码: using System; using ...
  • qwe8254
  • qwe8254
  • 2016年07月01日 09:30
  • 264

CodeSmith批量代码生成并存放到指定目录

其实CodeSmith自带的例子是很好的学习材料,其中一个例子就有批量生成所有表(指定表)并存放到指定目录的,但例子还是归例子,要符合实际需要的使用,还是得改一下的。下面发布下本人修改后的批量生成多种...
  • kfarvid
  • kfarvid
  • 2011年09月08日 11:54
  • 2800

用CodeSmith生成自定义模板

  当生成应用程序时,无论是编写数据访问代码还是生成自定义实体自定义集合,你会发现经常需要重复完成某些特定的任务。最近用CodeSmith编写了界面层到数据库访问层的模板以及用于生成存储过程的模板,感...
  • mengyao
  • mengyao
  • 2007年03月20日 07:22
  • 2217

如何使用CodeSmith生成Model

    在项目中,我们在持久化的时候,通常会使用Model层来封装数据——以便于传输,甚至页面的数据绑定时,也通过了Model:通过反射和遍历页面控件的方式。而当我们表格多的时候,写Model是一件很...
  • Lisliefor
  • Lisliefor
  • 2008年01月29日 16:39
  • 4194

CodeSmith 学习(1)简介下载安装

CodeSmithV6.5破解版下载地址: CodeSmithV6.5破解版 最近公司要推快速开发工具,快速的搭建解决方案,并解决数据库表的CRUD。将程序员从繁重的体力劳动中解脱出来。在代码...
  • kenwu300692
  • kenwu300692
  • 2013年03月22日 14:52
  • 1186

代码生成器 CodeSmith 的使用(一)

代码生成器 CodeSmith 的使用
  • SpringFileld
  • SpringFileld
  • 2014年09月05日 09:34
  • 909

CodeSmith .NET三层架构模板

Model模板文件: /*------------------------------------------------ // File Name:Info.cs // File ...
  • gxiangzi
  • gxiangzi
  • 2011年10月12日 13:23
  • 4292
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:CodeSmith应用实例(一)
举报原因:
原因补充:

(最多只允许输入30个字)