public class BuildSqlTool
{
public static string GetCreateTableSql(object t)
{
//CREATE TABLE "StructureView2"("Id" INTEGER PRIMARY KEY AUTOINCREMENT , "IdxNo" VARCHAR, "Name" VARCHAR, "Content" VARCHAR, "Price" FLOAT, "Order" INTEGER)
string sqlStr = "CREATE TABLE \"{0}\" ({1})";
Type type = t.GetType();
PropertyInfo[] pi = type.GetProperties();
string sqlFormat = "\"{0}\" {1}";
string sqlStr2 = "";
foreach (PropertyInfo p in pi)
{
string name=p.Name;
object[]abc=p.GetCustomAttributes(true);
if (name.ToLower()=="id")
{
sqlStr2 += string.Format(sqlFormat, "Id", "INTEGER PRIMARY KEY AUTOINCREMENT");
}
else
{
sqlStr2 +=","+string.Format(sqlFormat, name, SqlType(p));
}
}
return string.Format(sqlStr, GetTableName(type), sqlStr2);
} static string GetTableName(Type type)
{
var tableAttr = (TableAttribute)type.GetCustomAttributes(typeof(TableAttribute), true).FirstOrDefault();
return tableAttr != null ? tableAttr.Name : type.Name;
} static string SqlType(PropertyInfo p)
{
Type clrType = p.PropertyType;
if (clrType == typeof(Boolean) || clrType == typeof(Byte) || clrType == typeof(UInt16) || clrType == typeof(SByte) || clrType == typeof(Int16) || clrType == typeof(Int32))
{
return "integer";
}
else if (clrType == typeof(UInt32) || clrType == typeof(Int64))
{
return "bigint";
}
else if (clrType == typeof(Single) || clrType == typeof(Double) || clrType == typeof(Decimal))
{
return "float";
}
else if (clrType == typeof(String))
{
return "varchar";
//int len = MaxStringLength(p);
//return "varchar(" + len + ")";
}
else if (clrType == typeof(DateTime))
{
return "datetime";
}
else if (clrType.IsEnum)
{
return "integer";
}
else if (clrType == typeof(byte[]))
{
return "blob";
}
else if (clrType == typeof(Guid))
{
return "varchar(36)";
}
else
{
throw new NotSupportedException("Don't know about " + clrType);
}
} int MaxStringLength(PropertyInfo p)
{
var attrs = p.GetCustomAttributes(typeof(MaxLengthAttribute), true);
if (attrs.Length > 0)
{
return ((MaxLengthAttribute)attrs[0]).Value;
}
else
{
return 140;
}
}
}

主要目的是为了减少见表,同理,可自动生成orm的sql

使用范例

// 获取当前程序集
Assembly assembly = Assembly.GetExecutingAssembly();
// 创建类的实例,返回为 object 类型类的完全限定名(即包括命名空间)
object obj = assembly.CreateInstance("ConstructionBudget.Model.VModel1");
string sql = BuildSqlTool.GetCreateTableSql(obj);

sqlite3 根据实体自动生成建表语句的更多相关文章

  1. sqlserver 表中记录生成insert,可以加条件,可以生成建表语句

    sqlserver 表中记录生成insert,可以加条件,可以生成建表语句 create PROCEDURE [sp_getinsert] ( ) , --如果非默认架构,可以加上架构名 例如:sch ...

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

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

  3. postgreSQL生成建表语句

    参考博文:https://blog.csdn.net/xiaofengtoo/article/details/84395199 修复了其函数中的bug,支持生成包含:字段(支持数组类型字段).约束.索 ...

  4. 【SQL】ORACLE在sqlplus中使用spool方式生成建表语句

    在实际生产中有时我们需要将一张表的数据导入到另外一张表,如果有PLSQL,我们可以通过PLSQL工具将数据导出为sql脚本,然后再在另外一个数据库中执行这个脚本.但有时在实际生产中我们没有PLSQL这 ...

  5. Hibernate根据配置文件,生成建表语句

    import org.hibernate.cfg.Configuration; import org.hibernate.tool.hbm2ddl.SchemaExport; public class ...

  6. excel的宏与VBA实践——建表语句

    一.建表语句 不带分区版本:V1.0: Sub createTableDDL() '自动创建建表语句 '定义换行和TAB Ln = ) + ) TB = ) '定义脚本目录 Dim dir AS St ...

  7. Oracle 自动生成hive建表语句

    从 oracle 数据库导数到到 hive 大数据平台,需要按照大数据平台的数据规范,重新生成建表的 SQL 语句,方便其间,写了一个自动生成SQL的存储过程. ① 创建一张表,用来存储源表的结构,以 ...

  8. 脚本工具---自动解析mysql建表语句,生成sqlalchemy表对象声明

    常规建表语句: CREATE TABLE `test_table` ( `id` int(11) NOT NULL, `name` char(64) NOT NULL, `password` char ...

  9. MySql主键自动生成,表、实体、C#调用方法

    1.表:mysql建表语句 DROP TABLE IF EXISTS `keycode`; CREATE TABLE `keycode` ( `Id` ) NOT NULL AUTO_INCREMEN ...

随机推荐

  1. modelsim(3) - summary ,issue,tips

    1) the OEM of modelsim is 10 times slower than offical questa 2)how to the file full path in the mod ...

  2. mysql快速导入大量数据问题

    今天需要把将近存有一千万条记录的*.sql导入到mysql中.使用navicate导入,在导入100万条之后速度就明显变慢了, 导入五百万条数据的时候用了14个小时,且后面的数据导入的越来越慢. 后来 ...

  3. Python内置函数总结

    1.abs() 取绝对值 1 2 3 4 >>> a = abs(-7) >>> b= abs(7) >>>print(a,b) 7 7 2.al ...

  4. linux 学习1

    这里主要是听讲的一些东西的总结, thanks to lamp brother ____安装虚拟机 vmware 8.0.4, 因为高版本占用空间大,没必要 cent OS 6.3 linux 版本 ...

  5. Qt事件过滤器Event Filter

    事件过滤器针对一类或者多种不同类型的对象,定义了重写操作. 简单的说: 1.先对UI对象注册Event Filter 例如:    ui->drawBtn->installEventFil ...

  6. iOS开发 代码 或 <Home+Power>截屏

      1. 截屏的两种简单方法, 注意这两种截图方法,都必须在视图完全加载完成后才能截图,即在 viewDidAppear 方法之后截屏,否则无法得到想要的截屏效果 (1) 利用绘图方法 renderI ...

  7. oracle 创建database Link

    当两台不同的数据库服务器想要共享一部分数据的时候,可以通过创建database Link的方式实现. 创建全局database links ,则必须使用systm或sys用户,在database前加p ...

  8. kangle 默认支持ETag,如果是用kangle做源不会识别,但是做cdn或反向代理会自动识别

    kangle  默认支持ETag,如果是用kangle做源不会识别,但是做cdn或反向代理会自动识别

  9. InstallShield Limited Edition for Visual Studio 2013 图文教程

    http://www.wuleba.com/?p=23892   原文链接

  10. iOS架构基础

    1.概念:架构其实是一个设计上的东西,它可以小到类类之间的交互,可以大到不痛的模块之间,可以说不痛的业务部门之间的交互都可以从架构的层面去理解它. 2.解耦 方法一:代理 方法二:通知