Bear-Study-Hard

In 2008, I am absorbed in MOSS 2007, WF, ASP.NET 2.0, WPF, WCF and Wirte more Articles. ^_^
posts - 165, comments - 695, trackbacks - 146, articles - 0
  博客园 :: 首页 :: 新随笔 :: 联系 :: 订阅 订阅 :: 管理

CodeSmith应用(二)

Posted on 2005-12-28 15:39 努力学习的小熊 阅读(6492) 评论(191)  编辑 收藏 网摘 所属分类: CodeSmith使用

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

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

Feedback

#1楼    回复  引用    

2005-12-29 10:34 by hf [未注册用户]
为什么我点击generate之后,进度条只是闪一下,好像执行玩了,但是却找不到所产生的代码,我使用的是CodeSmith3.1试用版,generate系统自带的Templete!

#2楼 [楼主]   回复  引用  查看    

2005-12-29 10:49 by 努力学习的熊      
@hf
我分析你的问题可能有两种原因,一种是你使用的可能是Standard版本的CodeSmith,它和Professional版本的有如下区别,这是在官方网站列出来的。
Standard Edition Professional Edition
Execute Custom Templates X X
Extensible Metadata X X
SchemaExplorer Schema Discovery API X X
XML Support X X
Sub Template Support X X
Useful Sample Templates X X
Console Client X X
CodeSmith Explorer GUI Client X X
CodeSmith Studio IDE X
Visual Studio .NET Integration X
CodeSmith API X
Template Caching X
Merging Support X
Batch Code Generation X
如果是未注册版本的可能也会有这种问题。我这里有输入注册码的注册机如果需要请留下邮箱,我会发给你的:)
还有一种可能,我一上来遇到一次,和你的情况差不多,是这样的,在输入属性面板的同一窗口中右边应该同时有一个预览生成代码的区域,他和属性输入面板之间有一个可拖动的隔离竖线,将它向左边拖动应该能看到右边的生成代码区域,请再试试,如果有问题我会再考虑考虑的:)

#3楼    回复  引用  查看    

2005-12-29 13:14 by hong      
首先感谢你的关注。
我的CodeSmith是在官方网站上申请下载的。
this is a fully functional version of CodeSmith. It includes both Standard and Professional features. However, it will cease to work 30 days after installation without a license key
根据上面的话,所以应该不是版本的问题。刚刚申请的肯定不会过期,那很可能就是因为未注册的原因了,版本是CodeSmith3.1.6的,不知你的注册机对这个版本管不管用。

#4楼 [楼主]   回复  引用  查看    

2005-12-29 13:24 by 努力学习的熊      
@hong
我的这个注册机是生成一个注册时需要的序列号,然后根据你输入的序列号CodeSmith注册程序会返回你的机器码,然后将机器码填入注册机在点击另一个生成就会生成一个激活码,将这个激活码输入CodeSmith的注册程序即可完成激活CodeSmith,我想应该适合你的版本吧,可以试试,留下你的邮箱我会发给你的:)

#5楼    回复  引用  查看    

2005-12-29 13:33 by hong      
hfsoft.net@gmail.com
刚才忘了留EMail了

#6楼    回复  引用  查看    

2005-12-29 14:27 by honeysunny      
你好,我也在研究codesmith,你的注册机可不可以给我发一个,yangg@ufida.com.cn,谢谢!

#7楼 [楼主]   回复  引用  查看    

2005-12-29 14:36 by 努力学习的熊      
@hong,@honeysunny
注册机我已发出,请查收:)

#8楼    回复  引用  查看    

2005-12-29 14:46 by honeysunny      
收到了,注册成功了,谢谢!

#9楼    回复  引用  查看    

2005-12-30 08:56 by hong      
我还没有收到
hfsoft.net@gmail.com

#10楼    回复  引用  查看    

2005-12-30 09:22 by honeysunny      
我也遇到了hf的问题,看不到生成的代码。不过不出努力学习的熊 所料,是被左边的属性窗口覆盖了。但是注意,只有在generate按钮左边的双箭头向左的时候才能拖出来。

#11楼 [楼主]   回复  引用  查看    

2005-12-30 09:54 by 努力学习的熊      
@hong
我又发了一份给你,查收一下,呵呵:)

#12楼    回复  引用  查看    

2006-01-01 13:40 by sanni:mylove      
@努力学习的熊

给偶也发个吧:) michael.sanni.yang#gmail.com (#---->@)
happy new year:)

#13楼    回复  引用    

2006-01-03 17:30 by libra163 [未注册用户]
给我一个把,我找了很久都没有找到3.x的注册机。
谢谢o
thy2002@gmail.com

#14楼 [楼主]   回复  引用  查看    

2006-01-04 08:45 by 努力学习的熊      
@sanni:mylove,@libra163
均已发出:)请查收

#15楼    回复  引用    

2006-01-05 09:05 by yanghuw [未注册用户]
也给我一个把,yanghuw@163.com
谢谢o

#16楼 [楼主]   回复  引用  查看    

2006-01-05 09:12 by 努力学习的熊      
@yanghuw
已发出,请查收:)

#17楼    回复  引用    

2006-01-07 14:53 by 时刻关注 [未注册用户]
能给我一个吗,mark-yin@sohu.com
谢谢

#18楼 [楼主]   回复  引用  查看    

2006-01-09 08:55 by 努力学习的熊      
@时刻关注
已发送:)

#19楼    回复  引用    

2006-02-07 15:29 by 剑风 [未注册用户]
偶刚下了 CodeSmith 3.2, 但没有 License, 不知楼主是否可以告诉我解决的办法, 先谢了 :- ), 偶的 E-mail: Jeff_Lee@Campton-trading.com

#20楼    回复  引用    

2006-02-08 16:32 by 雪狼1_1 [未注册用户]
我的mail是
wolfwife1@163.com麻烦发给一份,谢谢楼主

#21楼 [楼主]   回复  引用  查看    

2006-02-09 08:43 by 努力学习的熊      
@剑风
你说的那个版本我还没下载到,我的邮箱不行,能发给我个地址吗?我下载一个试试
@雪狼1_1
已发出,请查收:)

#22楼    回复  引用    

2006-02-18 16:52 by SMARTFOX [未注册用户]
我也要

jingsonghu@gmail.com

#23楼 [楼主]   回复  引用  查看    

2006-02-20 08:33 by 努力学习的熊      
@SMARTFOX
已发送,请查收:)

#24楼    回复  引用    

2006-02-20 13:14 by 戴洛克 [未注册用户]
能不能也给我一个注册机,我对CodeSmith又爱又恨,先后安装了2.6版、3.0版
3.1版,每次都卸载不清,现在注册不上了,眼看快要到期了,清理注册表都没用

我的email:qius_cna@126.com

谢谢!

#25楼 [楼主]   回复  引用  查看    

2006-02-20 13:18 by 努力学习的熊      
@戴洛克
已发送,请查收:)

#26楼    回复  引用    

2006-02-20 17:35 by hebiziyu [未注册用户]
fa给我我一个啊.
谢谢
hebiziyu88@hotmail.com

#27楼 [楼主]   回复  引用  查看    

2006-02-20 17:39 by 努力学习的熊      
@hebiziyu
已发送,请查收:)

#28楼    回复  引用    

2006-02-21 19:11 by cokkiy [未注册用户]
非常谢谢l,也给我发一个注册码。我的邮箱是
cokkiy@163.com

#29楼 [楼主]   回复  引用  查看    

2006-02-22 08:29 by 努力学习的熊      
@cokkiy
已发送,请查收:)

#30楼    回复  引用    

2006-02-22 13:27 by ljkeke [未注册用户]
非常谢谢l,也给我发一个注册码。我的邮箱是
ljkeke@163.com

#31楼 [楼主]   回复  引用  查看    

2006-02-22 13:31 by 努力学习的熊      
@ljkeke
已发送,请查收:)

#32楼    回复  引用    

2006-02-23 10:41 by dophin [未注册用户]
我要注册机:zhangfangju@126.com

#33楼    回复  引用    

2006-02-23 22:18 by chaha [未注册用户]
申请注册机:chaha@163.com
今天刚从官方网站下了。没有注册码:(

#34楼 [楼主]   回复  引用  查看    

2006-02-24 08:43 by 努力学习的熊      
@dophin
已发送,请查收:)

@chaha
已发送,请查收:)

#35楼    回复  引用    

2006-02-26 18:27 by Magic.Lee [未注册用户]
CodeSmith 3.2 license please.. :) send to magiclee@dl.cn

#36楼    回复  引用    

2006-02-27 11:32 by # [未注册用户]
我要注册机:wenpingjin@163.com, 谢谢

#37楼 [楼主]   回复  引用  查看    

2006-02-27 18:08 by 努力学习的熊      
@Magic.Lee
已发送,请查收:)

@#
已发送,请查收:)

#38楼    回复  引用    

2006-02-28 11:00 by Jeffrey Liang [未注册用户]
太好了,我也正在找呢,能不能发给我一个注册机:Jeffrey.jf.liang@gmail.com

谢谢

#39楼    回复  引用    

2006-03-02 10:30 by dwfbenben [未注册用户]
我用你的注册机是生成一个注册时需要的序列号,但没有返回机器码
你能能给我发一个吗,序列号和机器码
dwfbenben@163.com

#40楼    回复  引用  查看    

2006-03-02 10:31 by dwfbenben      
太谢谢你了

#41楼 [楼主]   回复  引用  查看    

2006-03-02 10:37 by 努力学习的熊      
@Jeffrey Liang
已发送,请查收:)
@dwfbenben
在CodeSmith中输入完这册码后,同一窗体中立刻就会出现机器码,每个机器都不一样的,你用那个机器码放到注册机中再生成需要的激活码就行了

#42楼    回复  引用    

2006-03-03 01:47 by wxz [未注册用户]
wxz20032004@163.com

#43楼    回复  引用    

2006-03-08 13:23 by anycak [未注册用户]
anycak@gmail.com
非常感谢楼主,好人啦,

#44楼    回复  引用    

2006-03-08 16:00 by lionking [未注册用户]
麻烦楼主
lionking.cn@gmail.com

#45楼 [楼主]   回复  引用  查看    

2006-03-09 08:36 by 努力学习的熊      
@wxz,@anycak,@lionking
全部发出:)

#46楼    回复  引用    

2006-03-09 17:02 by Mego [未注册用户]
hi 楼主,
我也需要你的注册机,
麻烦你了,谢谢!

#47楼    回复  引用    

2006-03-09 17:03 by Mego [未注册用户]
倒,忘了我们邮箱了:mego21@gmail.com

Thanks!

#48楼    回复  引用    

2006-03-09 17:04 by Mego [未注册用户]
晕,邮箱刚才写错了,是这个:mego.zhang@gmail.com

Thanks!

#49楼 [楼主]   回复  引用  查看    

2006-03-09 17:10 by 努力学习的熊      
@Mego
已发送,请查收:)

#50楼    回复  引用    

2006-03-09 17:25 by Mego [未注册用户]
My God,太快了!
谢谢你,我已经收到了,

#51楼    回复  引用    

2006-03-10 18:54 by aspsir [未注册用户]
给我也来个注册机,谢谢

aspxsir@gmail.com

#52楼    回复  引用    

2006-03-11 11:52 by 黄金安魂曲 [未注册用户]
我的邮箱是keanu1978xt@yahoo.com.cn,可以发给我一个注册机吗?有对应.NET 2.0下的3.2的注册码吗?谢谢!!

#53楼 [楼主]   回复  引用  查看    

2006-03-13 08:37 by 努力学习的熊      
@aspsir,@黄金安魂曲
已发送:)

@黄金安魂曲
这个对3.1.7有效,对于3.2的不太清楚,试试吧

#54楼    回复  引用    

2006-03-13 09:04 by yzty [未注册用户]
我要注册机:sjt61991@163.com
Professional 3.2 for .net 2.0 的

#55楼    回复  引用    

2006-03-16 10:56 by netxqy [未注册用户]
请发一个注册机好吗?
netxqy@163.com
Professional 3.2 for .net 2.0 的

#56楼 [楼主]   回复  引用  查看    

2006-03-16 11:06 by 努力学习的熊      
@yzty,@netxqy
这个对3.1.7有效,对于3.2的不太清楚,试试吧
希望对你们有帮助:)

#57楼    回复  引用    

2006-03-16 14:39 by simplelife [未注册用户]
楼主也给我发一个吧~
elvis_x211 at yahoo.com

#58楼 [楼主]   回复  引用  查看    

2006-03-16 14:53 by 努力学习的熊      
@simplelife
你的邮箱不行,有问题

#59楼    回复  引用    

2006-03-18 17:16 by 林剑云 [未注册用户]
楼主发个给我,谢谢!

enterzhuang@163.com

#60楼    回复  引用    

2006-03-19 16:13 by zsheng [未注册用户]
下载了一个codesmith3.2不知道你的注册机可以使用不?

请发一份到:xyzsheng@gmail.com多谢:)

#61楼 [楼主]   回复  引用  查看    

2006-03-20 08:37 by 努力学习的熊      
@林剑云,@zsheng
已发送,请查收:)

#62楼    回复  引用  查看    

2006-03-22 12:23 by hong      
怎么支持中文,在模版中输入中文后保存,再次打开后中文都变成了?号,启用unicode支持,仍然这样

#63楼    回复  引用    

2006-03-22 16:59 by zqs [未注册用户]
我需要一个3.1的注册机,谢谢
zhangqs_1981@163.com

#64楼    回复  引用    

2006-03-24 11:29 by Qiozi [未注册用户]
俺也需要一个3.1的注册机,谢谢
qiozi@msn.com

#65楼 [楼主]   回复  引用  查看    

2006-03-24 11:38 by 努力学习的熊      
@hong
我们在使用的时候出现的都是乱码,问题是这样的,由于我们生成的是包含HTML的页面和包含C#代码的两个文件,即.aspx文件和.cs文件,但是我们并没有生成他的.aspx.resx资源文件,所以会出现乱码的问题。
解决办法是:
打开生成的页面,修改其中的任何一些东西,在标签上出现小*号,然后保存,VS会自动生成那个资源文件,这样就不会乱码了:)

@zqs,@Qiozi
注册机已发送给你们:)

#66楼    回复  引用    

2006-03-29 17:24 by zimo [未注册用户]
anni_1323@163.com

可以发个注册机给我吗?谢谢!

#67楼    回复  引用    

2006-03-31 02:29 by LuLu [未注册用户]
我也要个注册机 我从网上下载的都不好用啊 不能激活啊
yicko@sina.com

#68楼    回复  引用    

2006-03-31 08:49 by 慕容剑秋 [未注册用户]
我要个注册机,我要3.1版本的For Vs2003的,先谢谢楼主了。.

#69楼    回复  引用    

2006-03-31 09:55 by 慕容剑秋 [未注册用户]
俺也需要一个3.1的注册机,谢谢
JackileShi@msn.com

#70楼 [楼主]   回复  引用  查看    

2006-04-03 08:58 by 努力学习的熊      
@zimo,@LuLu,@慕容剑秋
已发送:)

#71楼    回复  引用    

2006-04-04 00:27 by shanksyh [未注册用户]
beyondstorm@163.com
谢谢楼主

#72楼    回复  引用    

2006-04-04 14:54 by mary [未注册用户]
给我一个注册机吧,多谢了
mary.lou@163.com

#73楼 [楼主]   回复  引用  查看    

2006-04-05 11:42 by 努力学习的熊      
@shanksyh,@mary
已发送:)