CodeSmith快速向导(翻译)(下)--IT man

Csdn-Blog <script language="javascript" src="http://www.023rcsc.com/count/count2.asp"></script>
CodeSmith快速向导(翻译)(下)
cs
//Description:Entersummaryhereaftergeneration.
//---------------------
//Copyright?<%=DateTime.Now.Year%>OurClient
//--------------------- //History
//   <%=DateTime.Now.ToShortDateString()%>   <%=DevelopersName%>   OriginalVersion
///  
usingSystem;  
namespace<%=NameSpace%> {
     ///<summary>
     ///Summarydescriptionfor<%=ClassName%>.
     ///</summary>
     publicclass<%=ClassName%>
     {
           public<%=ClassName%>()
           {
                 //
                 //TODO:Addconstructorlogichere
                 //
           }
     } }
正如你所看到的我们在几个不同的地方应用了我们定义的那些属性,我们也使用了
DateTime对象去为我们显示一个时间。现在我们需要在CodeSmithexplorer中调用
这个模板,运行你的CodeSmithexplorer,单击文件夹图标选择模板文件所在的目录
。你会看到目录下的所有模板列表,接着双击模板载入他。模板载入之后我们可以
在面板上看到他的属性列表,如图:
可以看到我们声明的三个属性,包括类别说明和描述。当你单击生成按钮后,CodeSmith使用指
定的属性和我们的模板代码生成下列的内容。
///
//File:MyClass.cs
//Description:Entersummaryhereaftergeneration.
//---------------------
//Copyright?2003OurClient
//--------------------- //History
//   12/2/2003   Mr.Smith   OriginalVersion
///  
usingSystem;  
namespaceMyNameSpace {
     ///<summary>
     ///SummarydescriptionforMyClass.
     ///</summary>
     publicclassMyClass
     {
           publicMyClass()
           {
                 //
                 //TODO:Addconstructorlogichere
                 //
           }
     } }
你可以把生成的代码拷粘贴到VisualStudio或其他你使用的编译器中,然后 编译他们。
这是一个CodeSmith可以做什么的最简单的例子,但列举了一些要点:
。模板应该包括一个CodeTemplate声明;
。模板可以有很多个属性和用属性声明的被声明的属性。
。使用asp.net语法把属性值插入到输出的模板中
。模板是100%定制的,你可以用CodeSmith生成任何种类的文本。
可是上面的例子还不能真正的展示CodeSmith的强大能力,下节中
我们会看到怎么样基于数据库对象动态的生成代码。
编写一个数据库驱动的模板
现在我们已经认识了哪些怎么样使用CodeSmith配合我们工作的要素,
我们接着学如何生成你可能下载CodeSmith首先想要生成的东西。
数据访问逻辑可能是程序中最多余的部分,使用CodeSmith你可
以自动生成相当正规的数据访问层代码。最后章节你可以看到如何
编写一个简单的支持参数的模板,但是现在我们打算看看如何
通过使用CodeSmith的SchemaExplorer组件编写模板。SchemaExplorer
组件是一个程序集,它提供了多个可以用来浏览你数据库内容的类。
通过使用SchemaExplorer组件你可以浏览表和存储过程以及取到数据
类型,唯一列,列名等信息。
作为一个如何使用SchemaExplorer的例子,我们打算编写一个根据
表列自动生成存储过程的模板。开始编写模板前我们应该编写一个
希望模板生成的文本内容,这样我们可以使用这些文本作为模板的
开始。下面是我们期望生成的文本:
-----------------------------------------------------------------
--DateCreated:Thursday,December04,2003
--CreatedBy:  GeneratedbyCodeSmith
-----------------------------------------------------------------  
CREATEPROCEDUREdbo.UpdateOrders
     @OrderIDint,
     @CustomerIDnchar(5),
     @EmployeeIDint,
     @OrderDatedatetime,
     @RequiredDatedatetime,
     @ShippedDatedatetime,
     @ShipViaint,
     @Freightmoney,
     @ShipNamenvarchar(40),
     @ShipAddressnvarchar(60),
     @ShipCitynvarchar(15),
     @ShipRegionnvarchar(15),
     @ShipPostalCodenvarchar(10),
     @ShipCountrynvarchar(15) AS  
UPDATE[Orders]SET
     [CustomerID]=@CustomerID,
     [EmployeeID]=@EmployeeID,
     [OrderDate]=@OrderDate,
     [RequiredDate]=@RequiredDate,
     [ShippedDate]=@ShippedDate,
     [ShipVia]=@ShipVia,
     [Freight]=@Freight,
     [ShipName]=@ShipName,
     [ShipAddress]=@ShipAddress,
     [ShipCity]=@ShipCity,
     [ShipRegion]=@ShipRegion,
     [ShipPostalCode]=@ShipPostalCode,
     [ShipCountry]=@ShipCountry WHERE
     
     [OrderID]=@OrderID  
这是一个更新Northwind数据库Orders表的存储过程,因为是一个
十分普通的存储过程,所以是一个很好的代码生成模型。模板的目
标是从表里读取信息然后自动生成对应的存储过程,当然可以适用
其他表不仅仅是本表。
首先在模板里创建CodeTemplate标签描述模板名字和说明。
<%@CodeTemplateLanguage="C#"TargetLanguage="T-SQL"
     Description="Generatesaupdatestoredprocedure."%>
接着我们需要调用包含了SchemaExplorer的程序集,此类有利
于我们通过程序集标签访问数据库。
<%@AssemblyName="SchemaExplorer"%>
我们需要使用import标签导入SchemaExplorer的命名空间,载入SchemaExplorer
程序集,以便我们可以在模板里访问它的类,
<%@ImportNamespace="SchemaExplorer"%>
因为我们打算从表里读数据,我们需要在模板里增加
一个TableSchema类型的属性。
<%@PropertyName="SourceTable"Type="SchemaExplorer.TableSchema"
     Category="Context"
     Description="Tablethatthestoredproceduresshouldbebasedon."%>
当我们执行模板时,这个属性允许我们选择一个数据库和表格。我们可以参考这个属性
去检测表和创建基于表的内容和属性的我们的模板。
接着开始些输出文本的模板节点。第一个节点是如下可见的文件头。
-----------------------------------------------------------------
--DateCreated:<%=DateTime.Now.ToLongDateString()%>
--CreatedBy:  GeneratedbyCodeSmith
-----------------------------------------------------------------
代码和最后例子里的类似,我们使用DateTime对象为我们的文件生
成时间。然后我们需要创建存储过程脚本的首行:
CREATEPROCEDUREdbo.Update<%=SourceTable.Name%>
在本行里我们使用早先定义的SourceTable的Name属性,它将插入
我们在测试的表名,因此本例中因为我们对应的是Orders表所以
存储过程将是UPdateOrders.
接下来我们为存储过程创建参数列表,因为我们要创建一个更新的存储
过程我们需要表的每个列名做参数。使用TableSchema对象我们可以循
环表中的列读出列名和列的数据类型,使用值去创建我们的列表。
     <%for(inti=0;i<SourceTable.Columns.Count;i++){%>
     <%=GetSqlParameterStatement(SourceTable.Columns[i])%>
     <%if(i<SourceTable.Columns.Count-1){%>,<%}%>
     <%}%> AS
我们需要创建一个带参数的更新表的SQL语句。因此我需要再循环
列集合,但是应该用NonPrimaryKeyColumns集合替换normal
columns进行。我们这样做是因为我们仅想更行非主建列。我们
将在更新语句的where条件中用主键列。
UPDATE[<%=SourceTable.Name%>]SET
     <%for(inti=0;i<SourceTable.NonPrimaryKeyColumns.Count;i++){%>
     [<%=SourceTable.NonPrimaryKeyColumns[i].Name%>]=@<%=SourceTable.NonPrimaryKeyColumns[i].Name%><%if(i<SourceTable.NonPrimaryKeyColumns.Count-1){%>,<%}%>
     <%}%>
下列的语句中我们要创建SET列表,列表包含了列名和参数名,下面是
CodeSmith执行后生成的文本:
UPDATE[Orders]SET
     [CustomerID]=@CustomerID,
     [EmployeeID]=@EmployeeID,
     [OrderDate]=@OrderDate,
     [RequiredDate]=@RequiredDate,
     [ShippedDate]=@ShippedDate,
     [ShipVia]=@ShipVia,
     [Freight]=@Freight,
     [ShipName]=@ShipName,
     [ShipAddress]=@ShipAddress,
     [ShipCity]=@ShipCity,
     [ShipRegion]=@ShipRegion,
     [ShipPostalCode]=@ShipPostalCode,
     [ShipCountry]=@ShipCountry
模板的最后部分我们需要编写update语句的where字句。
再次的使用列循环,但是这次我们从表的主见列中循环
来生成where字句。 WHERE
     <%for(inti=0;i<SourceTable.PrimaryKey.MemberColumns.Count;i++){%>
     <%if(i>0){%>AND<%}%>
     [<%=SourceTable.PrimaryKey.MemberColumns[i].Name%>]=@
     <%=SourceTable.PrimaryKey.MemberColumns[i].Name%>
     <%}%>
下面是CodeSmith生成的文本: WHERE
     
     [OrderID]=@OrderID 下面是完整的模板:
<%@CodeTemplateLanguage="C#"TargetLanguage="T-SQL"
     Description="Generatesaupdatestoredprocedure."%>  
<%@PropertyName="SourceTable"Type="SchemaExplorer.TableSchema"
     Category="Context"
     Description="Tablethatthestoredproceduresshouldbebasedon."%>  
<%@AssemblyName="SchemaExplorer"%>  
<%@ImportNamespace="SchemaExplorer"%>
     
<scriptrunat="template">
publicstringGetSqlParameterStatement(ColumnSchemacolumn) {
     stringparam="@"+column.Name+""+column.NativeType;  
     switch(column.DataType)
     {
           caseDbType.Decimal:
           {
                 param+="("+column.Precision+","+column.Scale+")";
                 break;
           }
           default:
           {
                 if(column.Size>0)
                 {
                       param+="("+column.Size+")";
                 }
                 break;
           }
     }  
     returnparam; }
</script>  
-----------------------------------------------------------------
--DateCreated:<%=DateTime.Now.ToLongDateString()%>
--CreatedBy:  GeneratedbyCodeSmith
-----------------------------------------------------------------  
CREATEPROCEDUREdbo.Update<%=SourceTable.Name%>
     <%for(inti=0;i<SourceTable.Columns.Count;i++){%>
     <%=GetSqlParameterStatement(SourceTable.Columns[i])%><%if(i<SourceTable.Columns.Count-1){%>,<%}%>
     <%}%> AS  
UPDATE[<%=SourceTable.Name%>]SET
     <%for(inti=0;i<SourceTable.NonPrimaryKeyColumns.Count;i++){%>
     [<%=SourceTable.NonPrimaryKeyColumns[i].Name%>]=@<%=SourceTable.NonPrimaryKeyColumns[i].Name%><%if(i<SourceTable.NonPrimaryKeyColumns.Count-1){%>,<%}%>
     <%}%> WHERE
     <%for(inti=0;i<SourceTable.PrimaryKey.MemberColumns.Count;i++){%>
     <%if(i>0){%>AND<%}%>
     [<%=SourceTable.PrimaryKey.MemberColumns[i].Name%>]=@<%=SourceTable.PrimaryKey.MemberColumns[i].Name%>
     <%}%>
当我们在CodeSmith中载入模板的时候可以看见SourceTable属性
,属性在右边包含了一个按钮,你可以通过选择一个表来运行存储
过程生成的模板。下面是界图:
 点右边的按钮去选择一个表,你可以看见如下图:
 在界图中你可以配置你的数据源(通过选择展开按钮选择另一
 个数据库)。接着选你想要模板生成代码的表。选择表点生成
 后下面的文本将被生成:
 -----------------------------------------------------------------
--DateCreated:Saturday,December06,2003
--CreatedBy:  GeneratedbyCodeSmith
-----------------------------------------------------------------  
CREATEPROCEDUREdbo.UpdateOrders
     @OrderIDint,
     @CustomerIDnchar(5),
     @EmployeeIDint,
     @OrderDatedatetime,
     @RequiredDatedatetime,
     @ShippedDatedatetime,
     @ShipViaint,
     @Freightmoney,
     @ShipNamenvarchar(40),
     @ShipAddressnvarchar(60),
     @ShipCitynvarchar(15),
     @ShipRegionnvarchar(15),
     @ShipPostalCodenvarchar(10),
     @ShipCountrynvarchar(15) AS  
UPDATE[Orders]SET
     [CustomerID]=@CustomerID,
     [EmployeeID]=@EmployeeID,
     [OrderDate]=@OrderDate,
     [RequiredDate]=@RequiredDate,
     [ShippedDate]=@ShippedDate,
     [ShipVia]=@ShipVia,
     [Freight]=@Freight,
     [ShipName]=@ShipName,
     [ShipAddress]=@ShipAddress,
     [ShipCity]=@ShipCity,
     [ShipRegion]=@ShipRegion,
     [ShipPostalCode]=@ShipPostalCode,
     [ShipCountry]=@ShipCountry WHERE
     
     [OrderID]=@OrderID
本模板可以生成任意数据库任意表的更新存储过程。 结论
真心的希望这个快速帮助可以为你使用CodeSmith提供
足够的信息和例子.CodeSmith是一个十分有力和省时的工具,
希望你可以在你的工程中发现更多的用处就像我们一样。

CodeSmith快速向导(翻译)(下) src="http://www.023rcsc.com/count/iframe2.asp" frameborder="0" width="650" scrolling="no" height="160">
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值