CodeSmith(C#)简单示例及相关小知识
// 本文将介绍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列类型<script runat="template">public string GetSqlParameterStatement(ColumnSchema column){string param = "@" + column.Name + " " + column.NativeType;switch (column.DataType){case DbType.Decimal:{param += "(" + column.Precision + ", " + column.Scale + ")";break;}default:{if (column.Size > 0){param += "(" + column.Size + ")";}break;}}return param;}</script>// 下面来生成需要更新的字段,更新时仅能更新非主键字段的值,在SchemaExplorer中支持这种区别,使用SourceTable.NonPrimaryKeyColumns即可得到非主键字段的集合。UPDATE [<%= SourceTable.Name %>] SET<% for (int i = 0; i < SourceTable.NonPrimaryKeyColumns.Count; i++) { %>[<%= SourceTable.NonPrimaryKeyColumns[i].Name %>] = @<%= SourceTable.NonPrimaryKeyColumns[i].Name %><% if (i < SourceTable.NonPrimaryKeyColumns.Count - 1) { %>,<% } %><% } %>// 然后再使用SourceTable.PrimaryKey.MemberColumns得到数据表中的主键集合,生成更新条件WHERE<% for (int i = 0; i < SourceTable.PrimaryKey.MemberColumns.Count; i++) { %><% if (i > 0) { %>AND <% } %>[<%= SourceTable.PrimaryKey.MemberColumns[i].Name %>] = @<%= SourceTable.PrimaryKey.MemberColumns[i].Name %><% } %>// 以下为整体的代码结构<%@ CodeTemplate Language="C#" TargetLanguage="T-SQL"Description="Generates a update stored procedure." %><%@ Property Name="SourceTable" Type="SchemaExplorer.TableSchema"Category="Context"Description="Table that the stored procedures should be based on." %><%@ Assembly Name="SchemaExplorer" %><%@ Import Namespace="SchemaExplorer" %><script runat="template">public string GetSqlParameterStatement(ColumnSchema column){string param = "@" + column.Name + " " + column.NativeType;switch (column.DataType){case DbType.Decimal:{param += "(" + column.Precision + ", " + column.Scale + ")";break;}default:{if (column.Size > 0){param += "(" + column.Size + ")";}break;}}return param;}</script>------------------------------------------------------------------- Date Created: <%= DateTime.Now.ToLongDateString() %>-- Created By: Generated by CodeSmith-----------------------------------------------------------------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) { %>,<% } %><% } %>ASUPDATE [<%= SourceTable.Name %>] SET<% for (int i = 0; i < SourceTable.NonPrimaryKeyColumns.Count; i++) { %>[<%= SourceTable.NonPrimaryKeyColumns[i].Name %>] = @<%= SourceTable.NonPrimaryKeyColumns[i].Name %><% if (i < SourceTable.NonPrimaryKeyColumns.Count - 1) { %>,<% } %><% } %>WHERE<% for (int i = 0; i < SourceTable.PrimaryKey.MemberColumns.Count; i++) { %><% if (i > 0) { %>AND <% } %>[<%= SourceTable.PrimaryKey.MemberColumns[i].Name %>] = @<%= SourceTable.PrimaryKey.MemberColumns[i].Name %><% } %>
//循环所有列
<%foreach(ColumnSchema col inTable.Columns){ %>
public<%= col.DataType %><%=col.Name %>{ get;set; }
<% } %>
转载于:https://www.cnblogs.com/smartsmile/p/6234265.html
CodeSmith(C#)简单示例及相关小知识相关推荐
- zabbix5.0 High swap space usage ( less than 50% free)解决步骤。相关小知识:linux系统mem和swap的关系
zabbix5.0 系统报错High swap space usage ( less than 50% free) 一,执行free -m,看看目前内存是多少 total used ...
- 机构数据分析培训之关于Mysql定义及数据库相关小知识
机构数据分析培训之关于Mysql定义及数据库相关小知识 一.关于Mysql定义 MySQL是一种关联数据库管理系统,关联数据库将数据保存在不同的表中,而不是将所有数据放在一个大仓库内,这样就增加了速度 ...
- MySql数据库相关小知识
场景:再次复习MySql数据库相关知识,记录下 创建数据库时,推荐用下列建表语句(这样就可以存储 emjoi 表情符号了): CREATE DATABASE IF NOT EXISTS dbname ...
- 上下位机?透明传输?DTU相关小知识1分钟让你快速了解
欢迎来到东用知识小课堂. DTU可以说是我们在日常工作中比较常见的物联网通信设备了,不过大部分人对于这台设备的了解也仅仅停留在它是作为数据传输的一个概念,那么什么是DTU呢?下面我们就以东用科技OM3 ...
- Vue2简单使用及相关基础知识概念(适合小白入门,看完就能上手)
Vue2相关知识 一.概念 1.前端模式 2.MVVM模式 2.1 概念 2.2 优点 (1)低耦合 (2)可复用 (3)独立开发 (4)可测试 3.Vue 3.1 概念 3.2 优点 3.3 参考网 ...
- 进程和线程相关小知识
几个基本概念: pcb:process control block,进程控制块的 进程映像:由数据段,程序段和pcb三部分组成. 进程和线程的区别: a.调度:进程作为拥有资源的基本单位,线程作为调度 ...
- css样式图片、渐变、相关小知识
一,background-position:(图片定位) 三种写法: 1):按%比,左上角最小(0%,0%),右下角最大(100%,%100): 2):(x,y)左上角最小(0,0),右下角最大(ma ...
- 安卓开发小知识 - 3
内容来源:Android Development Tidbits // No. 3 这是第三次分享安卓开发中的一些小知识点.我们很高兴有这么多人知道了这个有趣的系列,并且对你们通过评论和邮件表达的支持 ...
- python 提高文件查询效率_Python 大量小文件存储提高效率的简单示例
这篇文章主要为大家详细介绍了Python 大量小文件存储提高效率的简单示例,具有一定的参考价值,可以用来参考一下. 对python这个高级语言感兴趣的小伙伴,下面一起跟随512笔记的小编两巴掌来看看吧 ...
- 简单快捷的人工智能相关小工具集合~
简单快捷的人工智能相关小工具集合- 目录 一,语料冲突检测工具 二,通过文本相似关系进行聚类 三,AI服务的线上埋点数据反馈 四,AI服务"堵塞守护"工具 五,AI服务压力测试工具 ...
最新文章
- 如下10种分类算法对比Classifier comparison
- 对前端来说token代表了什么_在线公开课 | 前端工程师如何突破瓶颈更好地变现自己...
- iOS---搜索功能
- 厉害的壁纸,亲测有效
- linux 设备节点 驱动,【Linux驱动】自动创建设备节点
- LeetCode 865. 具有所有最深结点的最小子树(递归)
- 客户成功已死,客户服务还活着
- 架构设计系列(一)——架构设计概述
- mysql搭建主从结点
- python接口自动化(十七)--Json 数据处理---一次爬坑记(详解)
- 搭建windows的solr6服务器
- Retrofit2设置返回类型是字符串(String)类型
- Android攻城狮——五布局
- 手把手教你玩华为eNSP模拟器
- 自定义 QTreeView
- python如何开根号求过程_python开根号实例讲解
- 阿里企业邮箱使用第三方客户端同步邮件的坑
- AutoIt3常见问题解答
- 设计自有芯片将成为新常态?
- 无法访问此页面,确保web地址正确?