zoukankan      html  css  js  c++  java
  • CodeSimth Update存储过程

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

            第一步还是指明模板使用的语言和生成的目标语言。
    <%@ CodeTemplate Language="C#" TargetLanguage="T-SQL" Deion="Generates a update stored procedure." %>

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

            因为是针对表去生成存储过程,则首先要定义一个存储表名称使用的变量,然后指明这个变量类型为数据库中的表,这样我们可以通过这个数据表类型的变量得到相应的表的信息。
    <%@ Property Name="SourceTable" Type="SchemaExplorer.TableSchema" Category="Context"  Deion="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 < 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 </>

            下面来生成需要更新的字段,更新时仅能更新非主键字段的值,在SchemaExplorer中支持这种区别,使用SourceTable.NonPrimaryKeyColumns即可得到非主键字段的集合。
    1UPDATE [<%= 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       Deion="Generates a update stored procedure." %>
     3  
     4 <%@ Property Name="SourceTable" Type="SchemaExplorer.TableSchema"
     5       Category="Context"
     6       Deion="Table that the stored procedures should be based on." %>
     7  
     8 <%@ Assembly Name="SchemaExplorer" %>
     9  
    10 <%@ Import Namespace="SchemaExplorer" %>
    11       
    12 < 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 </>
    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       <% } %>
    58 
  • 相关阅读:
    HDU 1863 畅通工程(Kruskal)
    HDU 1879 继续畅通工程(Kruskra)
    HDU 1102 Constructing Roads(Kruskal)
    POJ 3150 Cellular Automaton(矩阵快速幂)
    POJ 3070 Fibonacci(矩阵快速幂)
    ZOJ 1648 Circuit Board(计算几何)
    ZOJ 3498 Javabeans
    ZOJ 3490 String Successor(模拟)
    Java实现 LeetCode 749 隔离病毒(DFS嵌套)
    Java实现 LeetCode 749 隔离病毒(DFS嵌套)
  • 原文地址:https://www.cnblogs.com/juan/p/1424353.html
Copyright © 2011-2022 走看看