sql语句转为Model
在跟数据库打交道的时候,有一个常用的应用,就是把数据库中的表转为程序中的对象,也就是说表中的列转为对象的属性。对于字段比较少的,我们可以直接复制过去改,但是字段数比较多的时候,借助工具类实现比较方便而且不易出错,看下我的代码:
/// <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的更多相关文章
- SQLServer中SQL语句与可执行二进制语句
SQLServer可以执行正常SQL语句也可以执行被转换的二进制语句,一般会用此方法进行数据库注入操作,骗过基本的字符过滤 --将二进制格式转为普通SQL语句 ) = 0x53454C45435420 ...
- 在thinkphp里面执行原生的sql语句
在thinkphp里面执行原生的sql语句 怎样在thinkphp里面执行原生的sql语句? $Model = new Model();//或者 $Model = D(); 或者 $Model = M ...
- SqlServer数据库表生成C# Model实体类SQL语句——补充
在sql语句最前边加上 use[数据库名] 原链接:https://www.cnblogs.com/jhli/p/11552105.html --[SQL骚操作]SqlServer数据库表生成C ...
- 利用powerdesigner创建表模型后导出sql语句方法,以及报错 Generation aborted due to errors detected during the verification of the model.的解决办法
今天用powerdesigner建了表模型,下面先说一下导出sql语句的步骤. 1.选项 2. 然后就报错了,下面说解决办法,很简单. 你没看错,把模型检查的√去掉就行了~~ 导出表名不带双引号的设置 ...
- vs2017 输出 ling to sql 转为执行的sql语句
在项目视图中,找到->输出 窗口,在窗口中选择ASP.NET Core Web服务器,调试项目即可看到执行的sql语句
- Oracle 行转列pivot 、列转行unpivot 的Sql语句总结
这个比较简单,用||或concat函数可以实现 select concat(id,username) str from app_user select id||username str from ap ...
- thinkphp 和 laravel使用sql语句操作db和源码浅析
thinkphp 和 laravel是phper开发中用的比较多的两个框架,无所谓好坏,看个人习惯及喜爱! 前言对于一个PHP应用,可能最多的就是操作数据,以致于初学者有时只把php当做数据库增删查改 ...
- Hibernate使用原生SQL语句进行无关联多表查询
背景:有两个表:CpCg与CpGg需要进行多表查询 因为CpGg表设计到与另外的表也有联系,因此师兄没有关联此两个表,只是用字段进行逻辑关联,CpGg表的cp字段与CpCg表的id字段逻辑关联
- Oracle行转列、列转行的Sql语句总结
多行转字符串 这个比较简单,用||或concat函数可以实现 SQL Code 12 select concat(id,username) str from app_userselect i ...
随机推荐
- angular2 localStorage的使用
最近从ng1 转ng2 相信 使用ng1的同学都知道 ngStorage 这个插件吧, 存储 本地数据 下面介绍一下 ng2 使用 localStorage 参考 github https ...
- VMware Workstation All Key
官方下载:https://www.vmware.com/products/workstation-pro/workstation-pro-evaluation.html 懒人打包:链接:https:/ ...
- Java经典编程题50道之七
输入一行字符,分别统计出其中英文字母.空格.数字和其它字符的个数. public class Example07 { public static void main(String[] args) ...
- bzoj1150 [CTSC2007]数据备份Backup 双向链表+堆
[CTSC2007]数据备份Backup Time Limit: 10 Sec Memory Limit: 162 MBSubmit: 2727 Solved: 1099[Submit][Stat ...
- java-redis列表数据操作示例(二)
接上篇博文<java-redis字符类数据操作示例(一)>,redis连接管理类的代码请跳转查看. 一.列表类型缓存测试类 public class ListTest { /** * 主测 ...
- Egret学习笔记 (Egret打飞机-2.开始游戏)
打开 Egret Wing,新建一个Egret游戏项目,然后删掉默认生成的createGameScene方法里面的东西 然后新建一个BeginScene.ts的文件,作为我们的游戏的第一个场景 cla ...
- iBrand 产品工具包:Laravel Database Logger
iBrand 社交新零售电商产品从2016年9月启动至今,已经趋于稳定,而且已经初步得到市场的检验,特别能抗住电商中秒杀时高并发的交易场景. 接下来我们团队会逐步开源一些正在使用的工具和解决方案,并且 ...
- __proto__ 与 prototype
先来做个复习,ES5中有有几种数据类型呢? 5种基本数据类型 Undefined Null Boolean Number String 1种复杂数据类型 Object 除了基本数据类型,万物皆对象,记 ...
- Python模拟登录成功与失败处理方式(不涉及前端)
任务说明: (1) 用户输入用户名,如不存在此用户不能登录: (2) 用户在输入密码时,如果连续输入三次错误,则该用户被锁定一段时间; (3) 用户被锁定一段时间后,可再次进行尝试登录: 程序使用库: ...
- CBitmap的使用
MFC提供了位图处理的基础类CBitmap,可以完成位图(bmp图像)的创建.图像数据的获取等功能.虽然功能比较少,但是在对位图进行一些简单的处理时,CBitmap类还是可以胜任的.很多人可能会采用一 ...