CodeSmith应用(二)

博客介绍了基于表生成删除功能的存储过程代码生成模板。先提及使用的脚本函数GetSqlParameterStatement,该函数可拼出部分代码,还说明了不同数据类型处理方式,如对Decimal类型根据Precision和Scale属性处理,非Decimal类型通过Size属性处理,其余部分生成较简单。

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

 1None.gifpublic string GetSqlParameterStatement(ColumnSchema column)
 2ExpandedBlockStart.gifContractedBlock.gifdot.gif{
 3InBlock.gif    string param = "@" + column.Name + " " + column.NativeType;
 4InBlock.gif    switch (column.DataType)
 5ExpandedSubBlockStart.gifContractedSubBlock.gif    dot.gif{
 6InBlock.gif        case DbType.Decimal:
 7ExpandedSubBlockStart.gifContractedSubBlock.gif        dot.gif{
 8InBlock.gif            param += "(" + column.Precision + "" + column.Scale + ")";
 9InBlock.gif            break;
10ExpandedSubBlockEnd.gif        }

11InBlock.gif        default:
12ExpandedSubBlockStart.gifContractedSubBlock.gif        dot.gif{
13InBlock.gif            if (column.Size > 0)
14ExpandedSubBlockStart.gifContractedSubBlock.gif            dot.gif{
15InBlock.gif                param += "(" + column.Size + ")";
16ExpandedSubBlockEnd.gif            }

17InBlock.gif            break;
18ExpandedSubBlockEnd.gif        }

19ExpandedSubBlockEnd.gif    }

20InBlock.gif    return param;
21ExpandedBlockEnd.gif}

        大家可以看到,这个函数需要传入一个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<?xml:namespace prefix = st2 />sDelete
/*
==================================================
Author:Bear-Study-Hard
CreatedTime:<?xml:namespace prefix = st1 />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属性。
    剩下的绿色部分和蓝色部分生成时比较简单,请各位自行学习。模板代码为:

 1None.gif<%@ 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." %>
 2None.gif<%@ Assembly Name="SchemaExplorer" %>
 3None.gif<%@ Import Namespace="SchemaExplorer" %>
 4None.gif<%@ Property Name="SourceTable" Type="SchemaExplorer.TableSchema" Category="DataTable" Description="Table that the stored procedures should be based on." %>
 5None.gif<%@ Property Name="Author" Type="String" Category="Context" Description="The author for this procedure." Optional="true"%>
 6None.gif<%@ Property Name="Description" Type="String" Category="Context" Description="The description for this procedure." Optional="true"%>
 7None.gif<script runat="template">
 8None.gifpublic string GetSqlParameterStatement(ColumnSchema column)
 9None.gif{
10None.gif    string param = "@" + column.Name + " " + column.NativeType;
11None.gif    switch (column.DataType)
12None.gif    {
13None.gif        case DbType.Decimal:
14None.gif        {
15None.gif            param += "(" + column.Precision + ", " + column.Scale + ")";
16None.gif            break;
17None.gif        }
18None.gif        default:
19None.gif        {
20None.gif            if (column.Size > 0)
21None.gif            {
22None.gif                param += "(" + column.Size + ")";
23None.gif            }
24None.gif            break;
25None.gif        }
26None.gif    }
27None.gif    return param;
28None.gif}
29None.gif</script>
30None.gifCREATE PROCEDURE dbo.<%=SourceTable.Name %>Delete
31None.gif/*
32None.gif==================================================
33None.gifAuthor:<%= Author %>
34None.gifCreatedTime:<%= System.DateTime.Now.ToShortDateString() %>
35None.gifDescription:<%= Description %>
36None.gif==================================================
37None.gif*/
38None.gif<% for (int i = 0; i < SourceTable.PrimaryKey.MemberColumns.Count; i++) { %>
39None.gif<%= GetSqlParameterStatement(SourceTable.PrimaryKey.MemberColumns[i]) %><% if (i < SourceTable.PrimaryKey.MemberColumns.Count - 1) { %>,<% } %>    <% if (SourceTable.Columns[i].Description != "") { %>--<%= SourceTable.Columns[i].Description %><% } %>
40None.gif<% } %>
41None.gifAS
42None.gifDelete From [<%= SourceTable.Name %>
43None.gifWhere
44None.gif<% for (int i = 0; i < SourceTable.PrimaryKey.MemberColumns.Count; i++) { %>
45None.gif<% if (i > 0) { %>AND <% } %>[<%= SourceTable.PrimaryKey.MemberColumns[i].Name %>] = @<%= SourceTable.PrimaryKey.MemberColumns[i].Name %>
46None.gif<% } %>

    如果有问题我会尽力帮助大家解决的,共同提高^_^
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值