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 
  • 相关阅读:
    js Worker 线程
    C#接口
    C# 委托
    陆金所面试题
    spark-groupByKey
    spark完整的数据倾斜解决方案
    Spark Streaming
    用SparkSQL构建用户画像
    Spring Cloud底层原理(转载 石杉的架构笔记)
    TCC分布式事务的实现原理(转载 石杉的架构笔记)
  • 原文地址:https://www.cnblogs.com/juan/p/1429476.html
Copyright © 2011-2022 走看看