用NVelocity写的一个简单的实体生成器
1、TestClass.aspx页面内容如下:
<%@ Page Language="C#" AutoEventWireup="true" CodeFile="TestClass.aspx.cs" Inherits="TestClass" %>
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
<head runat="server">
<title>无标题页</title>
</head>
<body>
<form id="form1" runat="server">
<div>
输入表名:<asp:TextBox ID="TextBox1" runat="server" Width="180px"></asp:TextBox>
<br />
<asp:Button ID="Button1" runat="server" Text="代码生成生成" onclick="Button1_Click" />
</div>
</form>
</body>
</html>
2、cs代码如下:其中SQLHelper参照我写的SQLHelper类这篇文章,数据库连接字符串写在SQLHelper中,所以此时直接调用SQLHelper.ExecuteReader(“SQL语句”)就会返回SqlDataReader,数据库为SqlServer2000/2005/2008
using System;
using System.Collections;
using System.Configuration;
using System.Data;
using System.Web;
using System.Web.Security;
using System.Web.UI;
using System.Web.UI.HtmlControls;
using System.Web.UI.WebControls;
using System.Web.UI.WebControls.WebParts;
using System.Collections.Generic;
using System.Data.SqlClient;
using NVelocity.App;
using Commons.Collections;
using NVelocity;
using System.IO;
using NVelocity.Runtime;
using System.Text;
using AnalysisRuleFileDAL;
public partial class TestClass : System.Web.UI.Page
{
protected void Page_Load(object sender, EventArgs e)
{
}
#region 带SQLHelper的getCharptByChaptNo方法 根据ChapterNo获取Chapter信息
/// <summary>
/// 根据ChapterNo获取Chapter信息
/// </summary>
/// <param name="chptNo">ChapterNo</param>
/// <returns>Chapter</returns>
public IList<SQLColem> getTableColByName(string name)
{
IList<SQLColem> list = new List<SQLColem>();
string sqlStr = @"SELECT a.[name] as '字段名称', (case when COLUMNPROPERTY( a.id,a.name,'IsIdentity')=1 then '√'else '' end) as '标识'
,b.name '类型'
,a.length '占用字节数'
,(case when a.isnullable = 1 then '√'else '' end) '允许空'
,isnull(e.text,'') '默认值'
,cast(isnull(g.[value],'') as varchar(100)) AS '字段说明'
FROM syscolumns a
left join systypes b
on a.xtype = b.xusertype
left join syscomments e
on a.cdefault=e.id
left join sysproperties g
on a.id = g.id AND a.colid = g.smallid inner join sysobjects on sysobjects.id = a.id
where sysobjects.xtype='U' and sysobjects.name='" + name + "'";//sql 语句
SqlDataReader rs = null;//定义SqlDataReader
try
{
rs = SQLHelper.ExecuteReader(sqlStr);
//根据sql 语句获得SqlDataReader
//循环读取数据
while (rs.Read())
{
SQLColem colom = new SQLColem();// 实例化Chapter
StringBuilder str = new StringBuilder(Convert.ToString(rs[0]));
string first = str.ToString().Substring(0,1);
//首字母小写
str = str.Replace(first.Substring(0, 1), first.Substring(0, 1).ToLower(), 0, 2);
colom.Realname = str.ToString();// str.ToString();
//首字母大写
str = str.Replace(first.Substring(0, 1), first.Substring(0, 1).ToUpper(), 0, 2);
colom.Bigname = str.ToString();
string type = Convert.ToString(rs[2]);
switch (type)
{
case "char":
case "varchar":
case "nchar":
case "nvarchar":
type = "string";
break;
case "datetime":
case "smalldatetime":
type = "DateTime";
break;
case "decimal":
case "numeric":
case "money":
case "smallmoney":
type = "double";
break;
case "float":
type = "float";
break;
case "int":
case "smallint":
case "tinyint":
case "bit":
type = "int";
break;
default:
break;
}
colom.Type = type;
list.Add(colom);
}
}
catch (Exception)
{
rs.Dispose();
rs.Close();
}
finally
{
rs.Dispose();
rs.Close();
}
return list;
}
#endregion
/// <summary>
/// 生成事件
/// </summary>
/// <param name="sender"></param>
/// <param name="e"></param>
protected void Button1_Click(object sender, EventArgs e)
{
//获取表名,生成Class类模板
string tablename = this.TextBox1.Text.Trim();
tempToClass(tablename);
}
/// <summary>
/// 代码生成模板
/// </summary>
/// <param name="tablename"></param>
private void tempToClass(string tablename)
{
StringBuilder str = new StringBuilder(tablename);
String className = str.Replace(tablename.Substring(0, 1), tablename.Substring(0, 1).ToUpper(),0,1).ToString();
IList<SQLColem> listUsers = new List<SQLColem>();
listUsers = getTableColByName(tablename);
Response.Write(listUsers.Count);
IList<string> listAssembly = new List<string>();
// 添加程序集名称
listAssembly.Add("LibTest");
//创建NVelocity引擎的实例对象
VelocityEngine velocity = new VelocityEngine();
//初始化该实例对象
ExtendedProperties props = new ExtendedProperties();
props.AddProperty(RuntimeConstants.RESOURCE_LOADER, "file");
props.AddProperty(RuntimeConstants.FILE_RESOURCE_LOADER_PATH, Path.GetDirectoryName(Request.PhysicalPath) + "/Template/");
props.AddProperty(RuntimeConstants.INPUT_ENCODING, "gb2312");
props.AddProperty(RuntimeConstants.OUTPUT_ENCODING, "gb2312");
velocity.Init(props);
//从文件中读取模板
Template temp = velocity.GetTemplate("tempClass.htm");
VelocityContext vltContext = new VelocityContext();
vltContext.Put("ClassName", className);
vltContext.Put("ListUsers", listUsers);
//合并模板
StringWriter writer = new StringWriter();
//velocity.MergeTemplate(context, writer);
temp.Merge(vltContext, writer);
//Template vltTemplate = velocity.GetTemplate("LibTest.Resources.Default.htm");
//System.IO.StringWriter vltWriter = new System.IO.StringWriter();
//temp.Merge(vltContext, vltWriter);
//生成静态页
using (StreamWriter writer2 = new StreamWriter(Server.MapPath("") + "/" + className + ".cs", false, Encoding.UTF8, 200))
{
writer2.Write(writer);
writer2.Flush();
writer2.Close();
}
}
}
3、SQLColem.cs文件内容如下:
using System;
using System.Data;
using System.Configuration;
using System.Web;
using System.Web.Security;
using System.Web.UI;
using System.Web.UI.HtmlControls;
using System.Web.UI.WebControls;
using System.Web.UI.WebControls.WebParts;
/// <summary>
///SQLColem 的摘要说明
/// </summary>
public class SQLColem
{
public SQLColem()
{
//
//TODO: 在此处添加构造函数逻辑
//
}
private string realname;
private string bigname;
private string type;
public string Type
{
get { return type; }
set { type = value; }
}
public string Bigname
{
get { return bigname; }
set { bigname = value; }
}
public string Realname
{
get { return realname; }
set { realname = value; }
}
}
Worktile,新一代简单好用、体验极致的团队协同、项目管理工具,让你和你的团队随时随地一起工作。完全免费,现在就去了解一下吧。
https://worktile.com