- 浏览: 2112327 次
- 性别:
- 来自: 上海
文章分类
- 全部博客 (1878)
- [网站分类]ASP.NET (141)
- [网站分类]C# (80)
- [随笔分类]NET知识库 (80)
- [随笔分类]摘抄文字[非技术] (3)
- [随笔分类]养生保健 (4)
- [网站分类]读书区 (16)
- [随笔分类]赚钱 (7)
- [网站分类].NET新手区 (233)
- [随笔分类]网站 (75)
- [网站分类]企业信息化其他 (4)
- [网站分类]首页候选区 (34)
- [网站分类]转载区 (12)
- [网站分类]SQL Server (16)
- [网站分类]程序人生 (7)
- [网站分类]WinForm (2)
- [随笔分类]错误集 (12)
- [网站分类]JavaScript (3)
- [随笔分类]小说九鼎记 (69)
- [随笔分类]技术文章 (15)
- [网站分类]求职面试 (3)
- [网站分类]其他技术区 (6)
- [网站分类]非技术区 (10)
- [发布至博客园首页] (5)
- [网站分类]jQuery (6)
- [网站分类].NET精华区 (6)
- [网站分类]Html/Css (10)
- [随笔分类]加速及SEO (10)
- [网站分类]Google开发 (4)
- [随笔分类]旅游备注 (2)
- [网站分类]架构设计 (3)
- [网站分类]Linux (23)
- [随笔分类]重要注册 (3)
- [随笔分类]Linux+PHP (10)
- [网站分类]PHP (11)
- [网站分类]VS2010 (2)
- [网站分类]CLR (1)
- [网站分类]C++ (1)
- [网站分类]ASP.NET MVC (2)
- [网站分类]项目与团队管理 (1)
- [随笔分类]个人总结 (1)
- [随笔分类]问题集 (3)
- [网站分类]代码与软件发布 (1)
- [网站分类]Android开发 (1)
- [网站分类]MySQL (1)
- [网站分类]开源研究 (6)
- ddd (0)
- 好久没写blog了 (0)
- sqlserver (2)
最新评论
-
JamesLiuX:
博主,能组个队么,我是Freelancer新手。
Freelancer.com(原GAF – GetAFreelancer)帐户里的钱如何取出? -
yw10260609:
我认为在混淆前,最好把相关代码备份一下比较好,不然项目完成后, ...
DotFuscator 小记 -
日月葬花魂:
大哥 能 加我个QQ 交流一下嘛 ?51264722 我Q ...
web应用程序和Web网站区别 -
iaimg:
我想问下嵌入delphi写的程序总是出现窗体后面感觉有个主窗体 ...
C#自定义控件:WinForm将其它应用程序窗体嵌入自己内部 -
iaimg:
代码地址下不了啊!
C#自定义控件:WinForm将其它应用程序窗体嵌入自己内部
于是乎,花费了一天的时间学习并写了一个CodeSmith可以运用 的模板。在此记录下CodeSmith的学习笔记。
所用工具: CodeSmith Professional v5.1.3.8510,代码示例所有 是以C#为例。
一、 工具配置
CodeSmith默认是不支撑 中文的,那么咱们 必须要先配置 使其支撑 中文显示,保存。并且要能够在生成文件中支撑 中文。
1. [Tools->Options...->Studio->Editor->Enable unicode]将这个选项勾上,那么CodeSmith就可以显示和保存中文了。
2. 在你的模板的最前面的一句话,C#为例:
<%@ CodeTemplate TargetLanguage="Text" Src="" Inherits="" Debug="False" CompilerVersion="v3.5" Description="Template description here." %>
中参加 ResponseEncoding="UTF-8" 的标签。将会使得生成的文件也支撑 中文。
1. [Tools->Options...->Studio->Editor->Convert tab to]去掉这个的勾选,就是不运用 空格来替换Tab。
二、 模板区域说明
CodeSmith的模板分为六个区域:模板说明区域,属性配置 区域,注册模板区域,引用声明区域,模板区域,函数区域。
(一) 模板说明区域,只有一句话:
<%@ CodeTemplate ResponseEncoding="UTF-8" TargetLanguage="Text" Src="" Inherits="" Debug="False" CompilerVersion="v3.5" Description="这里是模板说明" %>
(二) 属性配置 区域
你模板须要 那些外接参数,都可以写在这里。当然还有一些其他的参数须要 些在函数区域,在后面咱们 再来描述。
1) String类型参数声明:
<%@ Property Default="AAA" Optional="True" Category="输入参数" Description="这是一个字符串型的参数" %>
<script src="http://www.vipcn.com/hezuo/softview/iup.js"></script><script type="text/javascript"> cpro_client='9windcpr'; cpro_cbd='#trans'; cpro_cbg='#trans'; cpro_ctitle='#000066'; cpro_cdesc='#444444'; cpro_curl='#000000'; cpro_clink='#000000'; cpro_flush=4; cpro_w=468; cpro_h=60; cpro_template='text_noframe_468_60'; </script><script type="text/javascript" src="http://cpro.baidu.com/cpro/ui/cp.js"></script>2) Bool类型参数声明:
<%@ Property Default="True" Optional="False" Category="输入参数" Description="这是一个布朗型的参数" %>
3) DatabaseSchema类型参数声明:
<%@ Property Category="Context" Description="这是一个数据库" %>
4) TableSchemaCollection类型参数声明:
<%@ Property Category="Context" Description="这是一个数据表集合" %>
5) TableSchema类型参数声明:
<%@ Property Category="Context" Description="这是一个数据表" %>
(三) 注册模板区域
在你的模板中可以调用其他的模板用于生成,当然,你调用的模板所须要 的参数你都必须给出。注册代码如下:
<%@ Register Template="B.cst" MergeProperties="False" ExcludeProperties="" %>
这就是将B模板注册到A模板中。
(四) 引用声明区域
在这里要将咱们 运用 到了的运用 集都在这里写出来,假如 运用 到数据库就必须 要添加下面的两个。
<%@ Assembly %>
<%@ Import Namespace="SchemaExp lorer" %>
要自身 控制输出文件的话就须要 添加:<%@ Import Namespace="System.IO" %>
(五) 模板区域
这里就是咱们 控制要输出的文件或者界面的内容。
直接输出值为<%= ThisIsString %>
调用代码为<% if (ThisIsBool) { %>A<% } %> 假如 ThisIsBool为true则输出A。
(六) 函数区域
在这里咱们 可以定义咱们 自身 的函数,用于一些庞杂 的组合、代码的重用等。代码格式和C#完全一样。
三、 模板编写要领
A. 直接输出
在模板区域直接输入文本,就会直接输出的output里面了。
B. 变量输出
例如输出ThisIsString的变量值:<%= ThisIsString %>
再例如输出ThisIsTable的名字:<%= ThisIsTable.Name %>
C. 调用函数
例如,假如 输入的ThisIsBool为true就输出A字符。<% if (ThisIsBool) { %>A<% } %>
D. 调用模板
这里咱们 将在A模板内调用并显示B模板。每个模板都有一个Response来存储模板输出的。模板显示是调用Render()要领 来完成的。<% for(int i = 0; i < ThisIsTableList.Count; i++)
{
B b = new B();
b.ThisIsTable = ThisIsTableList[i];
b.Render(this.Response);
} %>
E. 遍历Database或TableCollection内的表
这里咱们 可以运用 for或者foreach做循环,为了通用性例子所有 运用 for做循环。
遍历ThisIsDatabase并输出表名<% for (int t = 0; t < ThisIsDatabase.Tables.Count; t++) { %>
<%= ThisIsDatabase.Tables[t].Name %>
<% } %>
F. 遍历Table的列
遍历ThisIsTable的列并且生成类似如下格式的语句://数据库类型:DbType.int
private int _ID;
这里调用了一个要领 DataType2CSharpType(System.Data.DbType dbType)在后面将会讲到。<% for (int c = 0; c < ThisIsTable.Columns.Count; c++) { %>
//数据库类型:DbType.<%= DataType2CSharpType(ThisIsTable.Columns[c].DataType) %>
private <%= DataType2CSharpType(ThisIsTable.Columns[c].DataType) %> _<%= ThisIsTable.Columns[c].Name %>;
<% } %>
//数据库类型:DbType.int
private int _ID;
//数据库类型:DbType.int
private int _ClassID;
//数据库类型:DbType.string
private string _StudentName;
G. 遍历Table的PK
<% for (int c = 0; c < ThisIsTable.PrimaryKey.MemberColumns.Count; c++) { %>
主键<%= c %>:<%= ThisIsTable.PrimaryKey.Name %> <%= ThisIsTable.PrimaryKey.Table.Name %>.<%= ThisIsTable.PrimaryKey.MemberColumns[c].Name %>
<% } %>
输出结果 :
主键0:PK_Student
Student.ID
H. 遍历Table的FK(Table自身 是外键表<即Table为明细表>)
这里说明下,下面的代码仅仅只是对FK里面的列是一对一的有效,假如 是多对多的FK须要 修改下面的0的地点 为循环即可。
<% for (int c = 0; c < ThisIsTable.ForeignKeys.Count; c++) { %>
外键<%= c %>:<%= ThisIsTable.ForeignKeys[c].Name %>
外键<%= c %>对应的列 <% for (int i = 0; i < ThisIsTable.ForeignKeys[c].PrimaryKeyMemberColumns.Count; i++) { %>
<%= ThisIsTable.ForeignKeys[c].ForeignKeyTable.Name %>.<%= ThisIsTable.ForeignKeys[c].ForeignKeyMemberColumns[0].Name %> <——来自于 <%= ThisIsTable.ForeignKeys[c].PrimaryKeyTable.Name %>.<%= ThisIsTable.ForeignKeys[c].PrimaryKeyMemberColumns[0].Name %>
<% } %>
<% } %>
外键0:FK_Student_Class
外键0对应的列
I. 遍历Table的FK(Table自身 是主键表<即Table为父表>)
<% for (int c = 0; c < ThisIsTable.PrimaryKeys.Count; c++) { %>
其他表外键<%= c %>:<%= ThisIsTable.PrimaryKeys[c].Name %>
其他表外键<%= c %>对应的列: <% for (int i = 0; i < ThisIsTable.PrimaryKeys[c].PrimaryKeyMemberColumns.Count; i++) { %>
<%= ThisIsTable.PrimaryKeys[c].PrimaryKeyTable.Name %>.<%= ThisIsTable.PrimaryKeys[c].PrimaryKeyMemberColumns[0].Name %> 作用于——> <%= ThisIsTable.PrimaryKeys[c].ForeignKeyTable.Name %>.<%= ThisIsTable.PrimaryKeys[c].ForeignKeyMemberColumns[0].Name %>
<% } %>
<% } %>
输出结果:
其他表外键0:FK_ExamScore_Student
其他表外键0对应的列:
Student.ID 作用于——> ExamScore.StudentID
四、 函数区域用法
之前咱们 提到过,有些参数必须要写在函数区域中。当然这些参数就是须要 有一些其他组件支撑 的参数了,比如弹出一个窗口挑选 文件,或者弹出一个挑选 文件夹的窗体,用于输入的参数。
1) 添加一个挑选 目录的输入参数
下面咱们 就是定义了一个输入参数OutputDirectory,在运行的输入参数界面,点击这个参数的输入框就会弹出一个挑选 目录的窗口。 private string templateOutputDirectory = "";
[Editor(typeof(System.Windows.Forms.Design.FolderNameEditor), typeof(System.Drawing.Design.UITypeEditor))]
[Optional, NotChecked]
[Category("OutputInfo")]
[Description("输出结果的目录。")]
[DefaultValue("")]
public string OutputDirectory
{
get
{
if (string.IsNullOrEmpty(templateOutputDirectory))
{
return "C:\\"+ (ThisIsDatabase!= null ? ThisIsDatabase.Name : "Output");
}
else
{
return templateOutputDirectory;
}
}
set
{
if (value.EndsWith("\\")) value = value.Substring(0, value.Length - 1);
templateOutputDirectory = value;
}
}
添加一个挑选 文件的输入参数
下面咱们 就是定义了一个输入参数OutputFile,在运行的输入参数界面,点击这个参数的输入框就会弹出一个挑选 文件的窗口。 private string templateOutputFile;
[Editor(typeof(System.Windows.Forms.Design.FileNameEditor), typeof(System.Drawing.Design.UITypeEditor))]
[Optional, NotChecked]
[Category("OutputInfo")]
[Description("输出文件")]
[DefaultValue("")]
public string OutputFile
{
get
{
if (string.IsNullOrEmpty(templateOutputFile))
{
return "C:\\"+ (ThisIsDatabase != null ? ThisIsDatabase.Name + ".cs" : "Output.cs");
}
else
{
return templateOutputFile;
}
}
set
{
templateOutputFile = value;
}
}
3) 将数据库类型转化为C#类型的函数
输入DbType的类型转化后输出C#的类型的字符串。这个函数很常用到。 public string DataType2CSharpType(System.Data.DbType dbType)
{
switch (dbType)
{
case DbType.AnsiString:
return "string";
case DbType.AnsiStringFixedLength:
return "string";
case DbType.Binary:
return "byte[]";
case DbType.Boolean:
return "bool";
case DbType.Byte:
return "byte";
case DbType.Currency:
return "decimal";
case DbType.Date:
return "DateTime";
case DbType.DateTime:
return "DateTime";
case DbType.DateTime2:
return "DateTime";
case DbType.DateTimeOffset:
return "DateTime";
case DbType.Decimal:
return "decimal";
case DbType.Double:
return "double";
case DbType.Guid:
return "Guid";
case DbType.Int16:
return "short";
case DbType.Int32:
return "int";
case DbType.Int64:
return "long";
case DbType.Object:
return "object";
case DbType.SByte:
return "sbyte";
case DbType.Single:
return "float";
case DbType.String:
return "string";
case DbType.StringFixedLength:
return "string";
case DbType.Time:
return "DateTime";
case DbType.UInt16:
return "ushort";
case DbType.UInt32:
return "uint";
case DbType.UInt64:
return "ulong";
case DbType.VarNumeric:
return "decimal";
case DbType.Xml:
return "string";
default:
return "object";
}
}
获取数据库类型的字段在C#中的默认值
输入DbType的类型转化后输出C#的类型的默认值。这个函数和上面那个差不多,只是有些时候配置 了值后期盼 给个默认值而已。 public string DataTypeDefaultValue(System.Data.DbType dbType)
{
switch (dbType)
{
case DbType.AnsiString:
return "String.Empty";
case DbType.AnsiStringFixedLength:
return "String.Empty";
case DbType.Binary: //Answer modified was just 0
return "new byte[] {}";
case DbType.Boolean:
return "false";
case DbType.Byte: //Answer modified was just 0
return "(byte)0";
case DbType.Currency:
return "0";
case DbType.Date:
return "DateTime.MinValue";
case DbType.DateTime:
return "DateTime.MinValue";
case DbType.DateTime2:
return "DateTime.MinValue";
case DbType.DateTimeOffset:
return "DateTime.MinValue";
case DbType.Decimal:
return "0.0m";
case DbType.Double:
return "0.0f";
case DbType.Guid:
return "Guid.Empty";
case DbType.Int16:
return "(short)0";
case DbType.Int32:
return "(int)0";
case DbType.Int64:
return "(long)0";
case DbType.Object:
return "new object()";
case DbType.SByte:
return "(sbyte)0";
case DbType.Single:
return "0F";
case DbType.String:
return "String.Empty";
case DbType.StringFixedLength:
return "String.Empty";
case DbType.Time:
return "new DateTime(1900,1,1,0,0,0,0)"; //return "DateTime.MaxValue";
case DbType.UInt16:
return "(ushort)0";
case DbType.UInt32:
return "(uint)0";
case DbType.UInt64:
return "(ulong)0";
case DbType.VarNumeric:
return "(decimal)0";
case DbType.Xml:
return "String.Empty";
default:
return "null";
}
}
5) 文件输出函数
当然了,做了这么多的工作,结尾 肯定是期盼 输出成文件咯,在前面咱们 已经说过了,对于输出的结果是调用Render()要领 ,那么咱们 只须要 在Render()要领 里面输出文件就可以了。 public override void Render(TextWriter writer)
{
if (!Directory.Exists(OutputDirectory))
Directory.CreateDirectory(OutputDirectory);
StreamWriter BaseFile = new StreamWriter(OutputFile, false);
base.Render(writer);
BaseFile.Close();
}
当然了,咱们 也可以再嵌入的其他模板里面调用这些输出的要领 ,从而达到输出多个文件的目标 ,这里就不再细致 的写代码了。
另附上完整的B的代码:<%@ CodeTemplate ResponseEncoding="UTF-8" TargetLanguage="Text" Src="" Inherits="" Debug="False" CompilerVersion="v3.5" Description="这里是模板说明" %>
<%@ Property Category="Context" Description="这是一个数据表" %>
<%@ Assembly %>
<%@ Import Namespace="SchemaExp lorer" %>
数据表名称:<%= ThisIsTable.Name %><% for (int c = 0; c < ThisIsTable.PrimaryKey.MemberColumns.Count; c++) { %>
主键<%= c %>:<%= ThisIsTable.PrimaryKey.Name %>
<%= ThisIsTable.PrimaryKey.Table.Name %>.<%= ThisIsTable.PrimaryKey.MemberColumns[c].Name %>
<% } %>
<% for (int c = 0; c < ThisIsTable.ForeignKeys.Count; c++) { %>
外键<%= c %>:<%= ThisIsTable.ForeignKeys[c].Name %>
外键<%= c %>对应的列 <% for (int i = 0; i < ThisIsTable.ForeignKeys[c].PrimaryKeyMemberColumns.Count; i++) { %>
<%= ThisIsTable.ForeignKeys[c].ForeignKeyTable.Name %>.<%= ThisIsTable.ForeignKeys[c].ForeignKeyMemberColumns[0].Name %> <——来自于 <%= ThisIsTable.ForeignKeys[c].PrimaryKeyTable.Name %>.<%= ThisIsTable.ForeignKeys[c].PrimaryKeyMemberColumns[0].Name %>
<% } %>
<% } %>
<% for (int c = 0; c < ThisIsTable.PrimaryKeys.Count; c++) { %>
其他表外键<%= c %>:<%= ThisIsTable.PrimaryKeys[c].Name %>
其他表外键<%= c %>对应的列: <% for (int i = 0; i < ThisIsTable.PrimaryKeys[c].PrimaryKeyMemberColumns.Count; i++) { %>
<%= ThisIsTable.PrimaryKeys[c].PrimaryKeyTable.Name %>.<%= ThisIsTable.PrimaryKeys[c].PrimaryKeyMemberColumns[0].Name %> 作用于——> <%= ThisIsTable.PrimaryKeys[c].ForeignKeyTable.Name %>.<%= ThisIsTable.PrimaryKeys[c].ForeignKeyMemberColumns[0].Name %>
<% } %>
<% } %>
数据表Select语句:private const String SelectString = @"
SELECT
<% for (int c = 0; c < ThisIsTable.Columns.Count; c++) { %>
[<%= ThisIsTable.Columns[c].Name %>]<% if (c < ThisIsTable.Columns.Count - 1) { %>,<% } %>
<% } %>
FROM [<%= ThisIsTable.Name %>] WHERE 1 = 1 ";
发表评论
-
你应该知道的10个奇特的 HTML5 单页网站
2013-10-25 21:46 776网页设计师努力寻找新的方式来展现内容。其中一个大的趋势是单页 ... -
用tsmmc.MSC方式在xp和Win7集中管理多台Win2003服务器
2010-12-18 14:08 1300远程桌面管理:tsmmc.msc在xp系统中的使用wind ... -
.Net 4.0并行库实用性演练[1]
2010-12-23 21:21 1163自VS2010发布近半年了,虽然整天想学习新东西,要更新到自己 ... -
Net 4.0并行库实用性演练
2010-12-23 22:03 1041引言 随着CPU多核的普及,编程时充分利用这个特性越显重要。上 ... -
.net 代码混淆原理性实践
2010-11-21 21:53 1642现在我们已经很清楚,托管PE文件可以轻而易举的被反编译,如果您 ... -
ASP.NET中的两个Cookie类:HttpCookie类与Cookie类
2010-07-29 09:43 1886System.Web.HttpCookie类, ... -
SQL的老题目:查询学生平均成绩及其名次
2010-06-18 23:24 4243Student(S#,Sname,Sage,Ssex) 学生表 ... -
去除狂人采集器添加在帖子中的广告信息
2010-06-18 16:28 2171去除狂人采集器添加在帖子中的广告信息 我的网站要转型 ... -
petshop4.0 详解之四(PetShop之ASP.NET缓存)
2010-04-03 09:01 1343如果对微型计算机硬件系统有足够的了解,那么我们对于Cache这 ... -
.NET 开发系统 -知识 点
2010-04-01 09:12 1270安全 性能 调试 Security ... -
织梦部分采集规则-DedeCms
2010-04-01 09:13 8981.幻剑书盟小说采集节点 {dede:comments} ... -
网站静态化结构
2009-12-16 09:21 780写在前头 静态化是解决减轻网站压力,提高网站访问速度的常用方 ... -
Memcache安装
2009-12-16 09:26 772Memcache安装 服务器端下载地址:http:// ... -
memcache_engine + memcachedb = 高性能分布式内存数据库
2009-12-16 09:35 1067memcachedb是一个由新浪网的开发人员开放出来的开源项目 ... -
一个简单的jQuery插件ajaxfileupload实现ajax上传文件例子
2009-12-16 13:10 1528页面代码: <html> <!-- ... -
jQuery Ajax 方法调用 Asp.Net WebService 的详细例子
2009-12-16 13:26 853这很常用,搜索了一下博客园的“找找看”和谷歌,看到大部分都是 ... -
event.keyCode列表
2009-12-16 15:31 1284Keycode对照表 字母和数字键的键码值(keyCo ... -
sql 求差值
2009-12-17 13:15 1125有一组数据,这组数据是不断增加的,想求每小时的差值,规则是:本 ... -
限制文本框只能输入两位数字_我 里面有吗?
2009-12-18 13:44 1099function isTriDecimal(value){ ... -
Resharper进阶一
2009-12-18 15:12 1092Resharper进阶一:简要介绍 面对这样一个问题:为什 ...
相关推荐
codesmith nettiers-2.3.1.zip codesmith 模板codesmith nettiers-2.3.1.zip codesmith 模板codesmith nettiers-2.3.1.zip codesmith 模板codesmith nettiers-2.3.1.zip codesmith 模板codesmith nettiers-2.3.1.zip...
简单的CodeSmith模板
CodeSmith模板集合C#版,支持对象持久化、数据库事务等代码模式。
由于上次上传的codesmith模板(c#),存在一些问题,故而有整理了程序并添加了使用说明。
CodeSmith模板抽象工厂版,已经可以使用!
IBatis codesmith模板,简单 实用
我自己做的CodeSmith模板,针对MySql数据库的,拿出来与大家分享。我自己用着还好,我在模板中截取了数据库表名,所以数据库表名为为tb_数据库表名,要注意啊。
NHibernate2.x的CodeSmith 模板,最新的NHibernate2.1.2GA可用。可参见NHibernate2 DEMO程序 使用CodeSmith直接读取数据库来生成实体类及映射文件,节省大量的编码时间。 比NHibernate1.2的模板稍有改动。
codesmith 3层模板,包括存储过程生成
PetShop4 ,codesmith 模板
这是个常用的一个CodeSmith模板,现在贡献出来,请下载吧。
这是一个开发用的三层结构的CodeSmith模板程序,需要安装数据库引擎及CodeSmith程序,可以自动生成实体类及数据库操作代码,方便快捷。
CodeSmith模板-V9.0版、配合CodeSmith软件可以自动生成三层结构(Models,DAL,BLL,界面层)
codesmith模板codesmith模板codesmith模板codesmith模板codesmith模板codesmith模板codesmith模板codesmith模板codesmith模板codesmith模板codesmith模板
CodeSmith 模板 自己在做项目用整理的一个CodeSmith模板。。
用于生成实体类的C#代码,codesmith模板
NHibernate三层示例,附带codesmith模板 有常用的的操作方法,double look 等,适合新手阅读查看
codesmith模板(MVC三层数据层模型层逻辑层)