今天又根据CodeSmith的几个基本组件写出了基于表生成删除功能的存储过程代码生成模板。
昨天觉得添加的存储过程模板写的比较简单,今天准备详细介绍一下这个删除的模板。
首先介绍我们使用到的一个教本函数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的数据类型进行了判断(Numeric和float等均需要这种处理),然后根据Precision属性得到精度并通过Scale属性得到了需要保留小数的范围。如果传出的为非Decimal类型字段则直接通过Size属性取出其大小即可。得到了(5)部分。最后的注释是为了生成的存储过程解读性好加上的,使用的是Description属性。
剩下的绿色部分和蓝色部分生成时比较简单,请各位自行学习。模板代码为:
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 < % } % >
如果有问题我会尽力帮助大家解决的,共同提高^_^