CodeSmith基础(二)

    本文将介绍CodeSmith与数据库进行交互生成相应的存储过程,本例使用的数据库为SQL Server 2000。
        在与数据库进行交互时,我们使用到了一个CodeSmith自带的组件
SchemaExplorer,利用这个组件我们可以访问数据库的数据表、存储过程、视图等,并可以得到相应的数据类型、标识列、列的(字段)名称等信息。
        下面这个例子是教我们如何生成一个存储过程,虽然网上有很多一样的例子,但是我是从CodeSmith中的英文帮助中自己翻译出来的:)
        使用的是SQL Server 2000自带的Northwind数据库,生成一个关于Orders订单表的更新存储过程。

        第一步还是指明模板使用的语言和生成的目标语言。

< %@ CodeTemplate  Language ="C#"  TargetLanguage ="T-SQL"  Description ="Generates a update stored procedure."  % >

        第二步就是我们要加载使用访问数据库的组件 SchemaExplorer,并声明其使用的命名空间。
< %@ Assembly  Name ="SchemaExplorer"  % >
< %@ Import  Namespace ="SchemaExplorer"  % >

        因为是针对表去生成存储过程,则首先要定义一个存储表名称使用的变量,然后指明这个变量类型为数据库中的表,这样我们可以通过这个数据表类型的变量得到相应的表的信息。
< %@ Property  Name ="SourceTable"  Type ="SchemaExplorer.TableSchema"  Category ="Context"   Description ="Table that the stored procedures should be based on."  % >

        如果想访问视图的话,则将变量类型Type中的SchemaExplorer.TableSchema修改为SchemaExplorer.ViewSchema即可。
        得到表名的方法
CREATE PROCEDURE  dbo. Update <%=  SourceTable.Name  %>

        下面利用循环语句遍历表的各个列,拼出存储过程需要传递的参数。
<% for  ( int  i  = 0 ; i  <  SourceTable.Columns.Count; i ++ ) {  %>
<%=  GetSqlParameterStatement(SourceTable.Columns[i])  %><% if  (i  <  SourceTable.Columns.Count  - 1 ) {  %> , <%  }  %>
<%  }  %>

        调用的GetSqlParameterStatement方法是用来生成参数的字符串,例如生成“@CustomerID nchar(5)”,后边紧跟的if判断是用来生成参数之间相隔使用的逗号的。
        生成参数字符串的方法,参数为SchemaExplorer.ColumnSchema列类型
 1 < script runat = " template " >
 2 public string GetSqlParameterStatement(ColumnSchema column)
 3 {
 4       string param  = " @ " +  column.Name  + " " +  column.NativeType;
 5
 6 switch  (column.DataType)
 7       {
 8 case  DbType.Decimal:
 9             {
10                   param  += " ( " +  column.Precision  + " " +  column.Scale  + " ) " ;
11 break ;
12             }
13 default :
14             {
15 if  (column.Size  > 0 )
16                   {
17                         param  += " ( " +  column.Size  + " ) " ;
18                   }
19 break ;
20             }
21       }
22
23 return  param;
24 }
25 </ script >

        下面来生成需要更新的字段,更新时仅能更新非主键字段的值,在SchemaExplorer中支持这种区别,使用SourceTable.NonPrimaryKeyColumns即可得到非主键字段的集合。
1 UPDATE [ <%= SourceTable.Name %> ] SET
2 <% for  ( int  i  = 0 ; i  <  SourceTable.NonPrimaryKeyColumns. Count ; i ++ ) {  %>
3 [ <%= SourceTable.NonPrimaryKeyColumns[i ] .Name  %> =  @ <%=  SourceTable.NonPrimaryKeyColumns [ i ] .Name  %><% if  (i  <  SourceTable.NonPrimaryKeyColumns. Count - 1 ) {  %> , <%  }  %>
4 <%  }  %>

    然后再使用SourceTable.PrimaryKey.MemberColumns得到数据表中的主键集合,生成更新条件

1 WHERE
2 <% for  ( int  i  = 0 ; i  <  SourceTable.PrimaryKey.MemberColumns. Count ; i ++ ) {  %>
3 <% if  (i  > 0 ) {  %>AND <%  }  %>
4 [ <%= SourceTable.PrimaryKey.MemberColumns[i ] .Name  %> =  @ <%=  SourceTable.PrimaryKey.MemberColumns [ i ] .Name  %>
5 <%  }  %>

    以下为整体的代码结构
 1 < %@ CodeTemplate  Language ="C#"  TargetLanguage ="T-SQL"
 2       Description ="Generates a update stored procedure."  % >
 3
 4 < %@ Property  Name ="SourceTable"  Type ="SchemaExplorer.TableSchema"
 5       Category ="Context"
 6       Description ="Table that the stored procedures should be based on."  % >
 7
 8 < %@ Assembly  Name ="SchemaExplorer"  % >
 9
10 < %@ Import  Namespace ="SchemaExplorer"  % >
11
12 < script  runat ="template" >
13 public string GetSqlParameterStatement(ColumnSchema column)
14 {
15       string param = "@" + column.Name + " " + column.NativeType;
16
17       switch (column.DataType)
18       {
19             case DbType.Decimal:
20             {
21                   param += "(" + column.Precision + ", " + column.Scale + ")";
22                   break;
23             }
24             default:
25             {
26                   if (column.Size > 0)
27                   {
28                         param += "(" + column.Size + ")";
29                   }
30                   break;
31             }
32       }
33
34       return param;
35 }
36 </ script >
37
38 -----------------------------------------------------------------
39 -- Date Created:  < %= DateTime .Now.ToLongDateString() % >
40 -- Created By:   Generated by CodeSmith
41 -----------------------------------------------------------------
42
43 CREATE PROCEDURE dbo.Update < %= SourceTable .Name % >
44 < % for  (int i  = 0;  i < SourceTable.Columns.Count; i++) { % >
45 < %= GetSqlParameterStatement (SourceTable.Columns[i]) % >< % if  (i < SourceTable.Columns.Count - 1) { % > , < % } % >
46 < % } % >
47 AS
48
49 UPDATE [ < %= SourceTable .Name % > ] SET
50 < % for  (int i  = 0;  i < SourceTable.NonPrimaryKeyColumns.Count; i++) { % >
51       [ < %= SourceTable .NonPrimaryKeyColumns[i].Name % > ] = @ < %= SourceTable .NonPrimaryKeyColumns[i].Name % >< % if  (i < SourceTable.NonPrimaryKeyColumns.Count - 1) { % > , < % } % >
52 < % } % >
53 WHERE
54 < % for  (int i  = 0;  i < SourceTable.PrimaryKey.MemberColumns.Count; i++) { % >
55 < % if  (i  >  0) { %>AND  < % } % >
56       [ < %= SourceTable .PrimaryKey.MemberColumns[i].Name % > ] = @ < %= SourceTable .PrimaryKey.MemberColumns[i].Name % >
57 < % } % >
58http://www.cnblogs.com/Bear-Study-Hard/archive/2005/12/19/300142.html

你可能感兴趣的:(数据库,如何,数据表,英文,网上)