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. TripleDES加解密Java、C#、php通用代码

    TripleDES说明:     TripleDES(3Des)和Des都是对称加密算法,TripleDes是Des加密算法的增强版本,这里主要说的是TripleDes加密算法的应用.     工作中 ...

  2. REST及RESTful的实现

    什么是REST? REST (REpresentation State Transfer) 描述了一个架构样式的网络系统,比如 web 应用程序.它首次出现在 2000 年 Roy Fielding ...

  3. TCP协议疑难杂症全景解析

    说明: 1).本文以TCP的发展历程解析容易引起混淆,误会的方方面面2).本文不会贴大量的源码,大多数是以文字形式描述,我相信文字看起来是要比代码更轻松的3).针对对象:对TCP已经有了全面了解的人. ...

  4. 虚拟机配置光盘为yum源

    很多时候, 我们装系统用的光盘就足够充当我们的软件源了. 但是, 怎么才能配置好让光盘成为yum的软件源, 让yum命令找到这个地方, 从而进行软件的安装. 1. 在虚拟机中把光盘挂载上 挂载上之后, ...

  5. Math类中的BigDecimal

    如果我们编译运行下面这个程序会看到什么? public class Test {    public static void main(String args[]) {                 ...

  6. java.lang.IllegalStateException: Couldn't read row 1, col 0 from CursorWindow. Make sure the Cursor is initialized correctly before accessing data fr

    Android中操作Sqlite遇到的错误:java.lang.IllegalStateException: Couldn't read row 1, col 0 from CursorWindow. ...

  7. [原创.数据可视化系列之一]使用openlayers 3 显示聚合数据

    在地图上显示点数据是最常用的地图展示功能之一,但是如果很多点在地图上显示,或造成密密麻麻的一片,无法正常看清楚,这个时候,一般有两种解决方案,一种是根据数据重要程度进行标注,重要的显示大一些,不重要的 ...

  8. 各种Java序列化性能比较

    转载:http://www.jdon.com/concurrent/serialization.html 这里比较Java对象序列化 XML JSON  Kryo  POF等序列化性能比较. 很多人以 ...

  9. js常用正则

    var sTest="xxxkdsj234dogdog1234xx"var reTest1=/(dog){2}/var reTest2 = /(?:dog){2}/;console ...

  10. nw_socket_handle_socket_event解决

    http://www.bkjia.com/IOSjc/1158465.html 出现问题如下 to a parent directory scheduled for deletion nw_endpo ...