CodeSmith应用实例(一)

一、一个简单的例子
 
       这个例子仅是一个简单的应用,在我翻译并学习完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" >
 8 public 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 >
30 CREATE PROCEDURE dbo. < %=SourceTable .Name % > Insert
31 /*
32 ==================================================
33 Author: < %= Author  % >
34 CreatedTime: < %= System .DateTime.Now.ToShortDateString() % >
35 Description: < %= 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 < % } % >
41 AS
42 Insert 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 )
48 Values
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),其函数代码如下:

 1 public   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.Customer sD elete
/*
==================================================
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" >
 8 public 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 >
30 CREATE PROCEDURE dbo. < %=SourceTable .Name % > Delete
31 /*
32 ==================================================
33 Author: < %= Author  % >
34 CreatedTime: < %= System .DateTime.Now.ToShortDateString() % >
35 Description: < %= 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 < % } % >
41 AS
42 Delete From [ < %= SourceTable .Name % >
43 Where
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 < % } % >

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

本文永久地址: http://www.livebaby.cn/blog/u/meil/archives/2007/984.html
 
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值