CodeSmith应用(二)

 今天又根据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 < % } % >

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

本文出自 “努力学习的小熊” 博客,转载请与作者联系!

你可能感兴趣的:(职场,应用,休闲,codesmith)