在跟数据库打交道的时候,有一个常用的应用,就是把数据库中的表转为程序中的对象,也就是说表中的列转为对象的属性。对于字段比较少的,我们可以直接复制过去改,但是字段数比较多的时候,借助工具类实现比较方便而且不易出错,看下我的代码:

         /// <summary>
/// 从数据库sql语句中生成实体model
/// </summary>
/// <param name="sql"></param>
/// <returns></returns>
public static string GenerateModelFromSql(string sql)
{
StringBuilder modelBuild = new StringBuilder(); string tableNamePatten = @"CREATE\s+TABLE\s+(?:\[dbo\]\.)?\[(\w+)\]"; var m = Regex.Match(sql, tableNamePatten);
var gs = m.Groups;
var tableName = "";
if (gs.Count > )
{
tableName = gs[].Value;
modelBuild.AppendLine("///<summary>");
modelBuild.AppendLine(string.Format(" ///{0}", tableName));
modelBuild.AppendLine("///</summary>"); modelBuild.AppendLine(string.Format("public class {0}", tableName)); modelBuild.AppendLine("{");
} string fieldPatten = @"\s*\[(\w+)\]\s+\[(\w+)\]\s*(\((\d+)\))?";
string primarykeyPattern = @"primary\s+key";
var matches = Regex.Matches(sql, fieldPatten); string fieldName = "";
string fieldType = "";
string stringLength = ""; int i = ;
foreach (Match item in matches)
{
i++;
var groups = item.Groups; if (groups.Count > )
{
fieldName = groups[].Value;
fieldType = groups[].Value; if (groups.Count > )
{
stringLength = groups[].Value;
} var type = Tools.ConvertToCSharpType(fieldType); if (Regex.IsMatch(sql, primarykeyPattern) && i == )
{
modelBuild.AppendLine(" [PrimaryKey]");
}
else if (type == "string")
{
modelBuild.AppendLine(string.Format(" [StringLength({0})]", stringLength));
} string core = string.Format(" public {0} {1} [set; get;]", type, fieldName); core = core.Replace('[', '{');
core = core.Replace(']', '}');
modelBuild.AppendLine(core);
}
}
modelBuild.AppendLine("}");
return modelBuild.ToString();
}

使用最多的是正则匹配。再看第51行的类型转换:

         public static string ConvertToCSharpType(string fieldType)
{
string dataType = null;
var t = fieldType.ToLower();
if (t == "varchar" || t == "nvarchar")
{
dataType = "string";
}
else if (t == "bit")
{
dataType = "bool";
}
else if (t == "bigint")
{
dataType = "long";
}
else if (t == "datetime")
{
dataType = "DateTime";
}
else if (t == "byte" || t == "binary" || t == "varbinary" || t == "image")
{
dataType = "byte[]";
}
else if (t == "uniqueidentifier")
{
dataType = "Guid";
}
return dataType ?? t;
}

sql语句转为Model的更多相关文章

  1. SQLServer中SQL语句与可执行二进制语句

    SQLServer可以执行正常SQL语句也可以执行被转换的二进制语句,一般会用此方法进行数据库注入操作,骗过基本的字符过滤 --将二进制格式转为普通SQL语句 ) = 0x53454C45435420 ...

  2. 在thinkphp里面执行原生的sql语句

    在thinkphp里面执行原生的sql语句 怎样在thinkphp里面执行原生的sql语句? $Model = new Model();//或者 $Model = D(); 或者 $Model = M ...

  3. SqlServer数据库表生成C# Model实体类SQL语句——补充

    在sql语句最前边加上  use[数据库名] 原链接:https://www.cnblogs.com/jhli/p/11552105.html   --[SQL骚操作]SqlServer数据库表生成C ...

  4. 利用powerdesigner创建表模型后导出sql语句方法,以及报错 Generation aborted due to errors detected during the verification of the model.的解决办法

    今天用powerdesigner建了表模型,下面先说一下导出sql语句的步骤. 1.选项 2. 然后就报错了,下面说解决办法,很简单. 你没看错,把模型检查的√去掉就行了~~ 导出表名不带双引号的设置 ...

  5. vs2017 输出 ling to sql 转为执行的sql语句

    在项目视图中,找到->输出 窗口,在窗口中选择ASP.NET Core Web服务器,调试项目即可看到执行的sql语句

  6. Oracle 行转列pivot 、列转行unpivot 的Sql语句总结

    这个比较简单,用||或concat函数可以实现 select concat(id,username) str from app_user select id||username str from ap ...

  7. thinkphp 和 laravel使用sql语句操作db和源码浅析

    thinkphp 和 laravel是phper开发中用的比较多的两个框架,无所谓好坏,看个人习惯及喜爱! 前言对于一个PHP应用,可能最多的就是操作数据,以致于初学者有时只把php当做数据库增删查改 ...

  8. Hibernate使用原生SQL语句进行无关联多表查询

    背景:有两个表:CpCg与CpGg需要进行多表查询 因为CpGg表设计到与另外的表也有联系,因此师兄没有关联此两个表,只是用字段进行逻辑关联,CpGg表的cp字段与CpCg表的id字段逻辑关联

  9. Oracle行转列、列转行的Sql语句总结

    多行转字符串 这个比较简单,用||或concat函数可以实现  SQL Code  12    select concat(id,username) str from app_userselect i ...

随机推荐

  1. Python基础——数据类型与基本运算【主要为除法】

    Python版本:3.6.2  操作系统:Windows  作者:SmallWZQ 无论是Python 3.x版本还是2.x版本,Python均支持多种数据类型,能够直接处理的数据类型包括Int类型. ...

  2. java8 - IO

    一.学习大纲: 1. 字符编码格式 2. 文件操作(实现文件的增.删.改.查等操作) 3. 目录操作(实现目录的增.删.改.查等操作) 4. 数据传输(实现对文件内容的读.写等操作) 二.关联类: 1 ...

  3. 剑指offer第四天

    25.复杂链表的复制 输入一个复杂链表(每个节点中有节点值,以及两个指针,一个指向下一个节点,另一个特殊指针指向任意一个节点),返回结果为复制后复杂链表的head.(注意,输出结果中请不要返回参数中的 ...

  4. Appium安卓真机环境搭建

    说明 步骤可能比较简洁,因为手头上有安卓测试机,所以需要配置虚拟机的童鞋请去虫师博客园,因为我也是从那儿学的,哈哈.点我飞到虫师那儿 但是如果你要搭建真机测试环境的话,本教程将是最简单实用的. 1. ...

  5. easywechat--在thinkPHP5中的使用

    1. 安装 1.1 v-4.0 版本要求 PHP版本在7.0以上 1.2 在项目目录下运行以下命令 若未安装composer,则先安装composer -> http://docs.phpcom ...

  6. PHPstudy端口占用的问题

    phpStudy很多同学下好了 用localhost可能不能读取到WWW目录下的文件,这个是因为端口被占用,打开其他选项菜单 =>打开配置文件=>httpd-conf=>修改端口号如 ...

  7. 特殊权限SUIG、SGID、SBIT

    一.SetUID与SGID 只能用于二进制程序 执行者需要有该二进制程序的x权限 执行具有SUID权限的二进制程序,那么执行者将具有该二进制程序所有者的权限. 举例来说,/etc/passwd文件的权 ...

  8. Hama顶点编程

    Hama是基于HDFS上的BSP模型实现. Apache Hame是Google Pregel的开源实现 Pregel是Google提出的一个面向大规模图计算的通用编程模型.许多实际应用中都涉及到大型 ...

  9. JavaScript递归原理

    JavaScript递归是除了闭包以外,函数的又一特色呢.很多开发新手都很难理解递归的原理,我在此总结出自己对递归的理解. 所谓递归,可以这样理解,就是一个函数在自身的局部环境里通过自身函数名又调用, ...

  10. 针对特定XML的解析器XMLParser

    一.建立网页库和偏移文件 为文本搜索引擎建立网页库,首先要把所有的网页(这里是文章)格式化,并保存到指定的格式中.如以下格式:   |                                  ...