using System;
using System.Collections.Generic;
using System.Text;
using System.Reflection; namespace TableGenerator
{
class Program
{
static void Main(string[] args)
{
List<TableClass> tables = new List<TableClass>(); // Pass assembly name via argument
Assembly a = Assembly.LoadFile(args[]); Type[] types = a.GetTypes(); // Get Types in the assembly.
foreach (Type t in types)
{
TableClass tc = new TableClass(t);
tables.Add(tc);
} // Create SQL for each table
foreach (TableClass table in tables)
{
Console.WriteLine(table.CreateTableScript());
Console.WriteLine();
} // Total Hacked way to find FK relationships! Too lazy to fix right now
foreach (TableClass table in tables)
{
foreach (KeyValuePair<String, Type> field in table.Fields)
{
foreach (TableClass t2 in tables)
{
if (field.Value.Name == t2.ClassName)
{
// We have a FK Relationship!
Console.WriteLine("GO");
Console.WriteLine("ALTER TABLE " + table.ClassName + " WITH NOCHECK");
Console.WriteLine("ADD CONSTRAINT FK_" + field.Key + " FOREIGN KEY (" + field.Key + ") REFERENCES " + t2.ClassName + "(ID)");
Console.WriteLine("GO"); }
}
}
}
}
} public class TableClass
{
private List<KeyValuePair<String, Type>> _fieldInfo = new List<KeyValuePair<String, Type>>();
private string _className = String.Empty; private Dictionary<Type, String> dataMapper
{
get
{
// Add the rest of your CLR Types to SQL Types mapping here
Dictionary<Type, String> dataMapper = new Dictionary<Type, string>();
dataMapper.Add(typeof(int), "BIGINT");
dataMapper.Add(typeof(string), "NVARCHAR(500)");
dataMapper.Add(typeof(bool), "BIT");
dataMapper.Add(typeof(DateTime), "DATETIME");
dataMapper.Add(typeof(float), "FLOAT");
dataMapper.Add(typeof(decimal), "DECIMAL(18,0)");
dataMapper.Add(typeof(Guid), "UNIQUEIDENTIFIER"); return dataMapper;
}
} public List<KeyValuePair<String, Type>> Fields
{
get { return this._fieldInfo; }
set { this._fieldInfo = value; }
} public string ClassName
{
get { return this._className; }
set { this._className = value; }
} public TableClass(Type t)
{
this._className = t.Name; foreach (PropertyInfo p in t.GetProperties())
{
KeyValuePair<String, Type> field = new KeyValuePair<String, Type>(p.Name, p.PropertyType); this.Fields.Add(field);
}
} public string CreateTableScript()
{
System.Text.StringBuilder script = new StringBuilder(); script.AppendLine("CREATE TABLE " + this.ClassName);
script.AppendLine("(");
script.AppendLine("\t ID BIGINT,");
for (int i = ; i < this.Fields.Count; i++)
{
KeyValuePair<String, Type> field = this.Fields[i]; if (dataMapper.ContainsKey(field.Value))
{
script.Append("\t " + field.Key + " " + dataMapper[field.Value]);
}
else
{
// Complex Type?
script.Append("\t " + field.Key + " BIGINT");
} if (i != this.Fields.Count - )
{
script.Append(",");
} script.Append(Environment.NewLine);
} script.AppendLine(")"); return script.ToString();
}
}
}
public class FakeDataClass
{
public int AnInt
{
get;
set;
} public string AString
{
get;
set;
} public float AFloat
{
get;
set;
} public FKClass AFKReference
{
get;
set;
}
} public class FKClass
{
public int AFKInt
{
get;
set;
}
}

以下代码是生成my sql 的create datatable sql

private void btnCreateSQL_Click(object sender, EventArgs e)
{
//txtJson.Text
//txtSQL.Text
try
{
string sepMark = " ";
JObject jo = JObject.Parse(txtJson.Text);
string sql = @"CREATE TABLE NND(" + Environment.NewLine;
sql = sql + @"NND_id mediumint(8) unsigned NOT NULL AUTO_INCREMENT COMMENT 'NND_id',";
foreach (var j in jo)
{
if ("Integer".Equals(j.Value.Type.ToString()))
{
if (j.Key.Contains("is_") || j.Key.Contains("type"))
{
sql = sql + j.Key + sepMark + @"tinyint(4) NOT NULL COMMENT" + sepMark + "'" + j.Key + "'," + Environment.NewLine;
}
else
{
sql = sql + j.Key + sepMark + @"mediumint(8) unsigned NOT NULL DEFAULT '0' COMMENT" + sepMark + "'" + j.Value + "'," + Environment.NewLine;
}
}
else if ("String".Equals(j.Value.Type.ToString()))
{
decimal tempDecimal = ;
DateTime dt = new DateTime();
if (decimal.TryParse(j.Value.ToString(), out tempDecimal))
{
sql = sql + j.Key + sepMark + @"decimal(11,2) NOT NULL COMMENT" + sepMark + "'" + j.Key + "'," + Environment.NewLine;
continue;
}
if (DateTime.TryParse(j.Value.ToString(), out dt))
{
sql = sql + j.Key + sepMark + @"datetime NOT NULL COMMENT" + sepMark + "'" + j.Key + "'," + Environment.NewLine;
continue;
}
else
{
sql = sql + j.Key + sepMark + @"varchar(50) NOT NULL COMMENT" + sepMark + "'" + j.Key + "'," + Environment.NewLine;
continue;
}
}
}
sql = sql + @"PRIMARY KEY (NND_id)" + Environment.NewLine;
sql = sql + ")";
txtSQL.Text = sql;
}
catch (Exception ex)
{
txtSQL.Text = "出错啦!~~~~~~~~~~~~~~" + Environment.NewLine + ex.Message;
}
}

C#实体类生成Create Table SQL的更多相关文章

  1. EF:根据实体类生成表结构SQL

    根据实体类生成表结构SQL: PM> Enable-Migrations -ProjectName Domain -StartUpProjectName Handler -Force PM> ...

  2. 通过实体类生成建表SQL语句实现方法

    import java.io.File; import java.io.FileOutputStream; import java.lang.reflect.Field; import java.ut ...

  3. C# T4 模板 数据库实体类生成模板(带注释,娱乐用)

     说明:..,有些工具生成实体类没注释,不能和SqlServer的MS_Description属性一起使用,然后照着网上的资源,随便写了个生成模板,自娱自乐向,其实卵用都没有参考教程    1.htt ...

  4. SQL Server: create table sql script

    ---摇奖observeh数据库设计 Function getSpace lottery /* -- Author:geovindu 涂聚文 -- Date: 20180427 为了自写生成代码.根据 ...

  5. 【干货分享】C# 实体类生成工具

    前言: 项目实战中不论是业务编码还是通用编码,总会归纳出一些通用的工具类.放入项目中一劳永逸,让兄弟姐妹们避免编写重复代码.所以利用了工作之余的时间,将这些散落在多个项目中精致优雅的工具类,归纳起来形 ...

  6. C#实体类生成XML与XML Schema文档

    一.实体类生成XML private void CreateXML() { Type[] objType = DBEntityRegst(); foreach (var item in objType ...

  7. Jpa实体类生成图解

    Jpa实体类生成图解   创建连接     创建项目  

  8. [开源] FreeSql.AdminLTE.Tools 根据实体类生成后台管理代码

    前言 FreeSql 发布至今已经有9个月,功能渐渐完善,自身的生态也逐步形成,早在几个月前写过一篇文章<ORM 开发环境之利器:MVC 中间件 FreeSql.AdminLTE>,您可以 ...

  9. Java代码实体类生成SQL语句(Java实体类转数据库)

    有的时候把数据库删了,如果照着实体类重新创建数据库的话比较麻烦,可以使用这个工具,把代码复制到项目里面设置一下即可把Java代码中的实体类转换为SQL语句输出为一个文件,打开执行命令即可. 下载:ht ...

随机推荐

  1. 对Xcode菜单选项的详细探索(来自董铂然的微博http://www.cnblogs.com/dsxniubility/p/4983614.html)

    本文调研Xcode的版本是 7.1,基本是探索了菜单的每一个按钮.虽然从xcode4一直用到了xcode7,但是一般都只是用了一些基础的功能,说来也惭愧.在一次偶然的机遇突然发现了“显示调用层级”的选 ...

  2. NOTIFY - 生成一个通知

    SYNOPSIS NOTIFY name DESCRIPTION 描述 NOTIFY 命令向当前数据库中所有执行过 LISTEN name, 正在监听特定通知条件的前端应用发送一个通知事件. 传递给前 ...

  3. PAT Basic 1028 人口普查 (20 分)

    某城镇进行人口普查,得到了全体居民的生日.现请你写个程序,找出镇上最年长和最年轻的人. 这里确保每个输入的日期都是合法的,但不一定是合理的——假设已知镇上没有超过 200 岁的老人,而今天是 2014 ...

  4. 10年前文章_解决parted 编译出错问题

    找到 include/site/i386-linux 文件,修改定义ac_cv_sizeof_off_t 的长度,从原来的4改为8 ac_cv_sizeof_off_t=8 删除 build_dir/ ...

  5. python添加清屏功能

    创建文件ClearWindow添加内容 class ClearWindow: menudefs = [ ('options', [None, ('Clear Shell Window', '<& ...

  6. Laravel——缓存使用

    1.使用Redis类 use Illuminate\Support\Facades\Redis; 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 ...

  7. 一个简单mock-server 解决方案

    參考: 测试利器之Mock server 介紹 moco server - download Mockman - download 各种Mock工具比较 JMockit中文网 MockWebServe ...

  8. hashcode 和 equals

    https://www.cnblogs.com/Qian123/p/5703507.html#_label0 hashCode是jdk根据对象的地址或者字符串或者数字算出来的int类型的数值 详细了解 ...

  9. C# 实战笔记

    http://www.cnblogs.com/ymnets/p/3424514.html 学习点 关于IEnumerable和IQueryable两接口的区别 二者都是静态类 区另主要在: (1)所有 ...

  10. css----动画(图片无限放大缩小)

    先给大家推荐animate.css库,里面有一些效果很不错的过度样式,不想自己写的也可以直接安装这个库来使用,如果不想安装这个库也可以去https://daneden.github.io/animat ...