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

         /// <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. 【Unity3D技术文档翻译】第1.5篇 本地使用 AssetBundles

    上一章:[Unity3D技术文档翻译]第1.4篇 AssetBundle 依赖关系 本章原文所在章节:[Unity Manual]→[Working in Unity]→[Advanced Devel ...

  2. SpringMvc出现Jsp页面不能正常解析成html网页

    <!-- Spring mvc配置 --> <servlet> <servlet-name>springMvc</servlet-name> <s ...

  3. hibernate的事务管理和session对象的详解

    //开启事务 transaction=session.beginTransaction(); 上面为开启事务 transaction.commit();这个为提交事务 从session对象中获取事务后 ...

  4. PHP网站的安全要点

    1. 删除不必要的模块 PHP随带内置的PHP模块.它们对许多任务来说很有用,但是不是每个项目都需要它们.只要输入下面这个命令,就可以查看可用的PHP模块: # php - m 一旦你查看了列表,现在 ...

  5. (转载,但不知道谁原创)获取SPRING 代理对象的真实实例,可以反射私有方法,便于测试

    /** * 获取 目标对象 * @param proxy 代理对象 * @return * @throws Exception */ public static Object getTarget(Ob ...

  6. 为什么使用正则test( )第一次是 true,第二次是false?

    今天朋友问我一个问题,我现在需要多次匹配同一个内容,但是为什么我第一次匹配,直接是 true,而第二次匹配确实 false 呢? var s1 = "MRLP"; var s2 = ...

  7. php程序员的成长之路

    第一阶段:基础阶段(基础PHP程序员) 重点:把LNMP搞熟练(核心是安装配置基本操作) 目标:能够完成基本的LNMP系统安装,简单配置维护:能够做基本的简单系统的php开发:能够在PHP中型系统中支 ...

  8. mac 系统安装 eclipse 方法

    经过好几天的折腾,终于在各种不靠谱的经验.说明的忽悠中把自己心爱的 mac 安装上了 eclipse,看到别人的不靠谱,我决定自己写一篇经验,为了大家能够不走我这么多的弯路,也为了自己将来可以回来看看 ...

  9. python 常见错误和异常 函数 正则表达式及多线程编程

    生成随机密码#!/usr/bin/env python import stringfrom random import choice def gen_pass(num=9): all_chs = st ...

  10. 利用ffmpeg做视频解码的顺序

    这几天在实验室捣鼓着用ffmpeg做视频解码,终于把数据解出来了,虽然还没有做显示部分,不知道解码解得对不对,但料想是不会有什么问题了.回头看看这几天的工作,其间也遇到了不少问题,主要还是对ffmpe ...