代码生成工具之数据库表及字段名称转义

本文涉及的产品
云数据库 RDS SQL Server,基础系列 2核4GB
RDS SQL Server Serverless,2-4RCU 50GB 3个月
推荐场景:
简介:

在上篇随笔《代码生成工具之界面快速生成》中介绍过了代码生成工具Database2Sharp是如何快速生成所需的Web界面以及各种Winform界面,其中包括生成即可运行的Web界面效果,Winform布局信息的生成。这些看似很简单的界面元素生成,其实是需要丰富的数据库元数据信息作为基础的,而且对不同的数据库处理要有所不同。本文介绍不同数据库之间元数据的处理差别,以及如何代码生成工具Database2Sharp如何兼容处理这些问题的。

1、常规的数据库表、字段名称的转义

例如,我们需要获取表的别名,对于SqlServer一般设计的时候是采用Pascal命名方式,所以表名称不需要转义,但对于Oracle表名称,基本上都是以大写来命名,而且表名称不是采用Pascal方式,而是两个词之间采用下划线“_"来分隔的,如DEPT_NAME这样的名称。

一般来说,我们为每种的数据库定义一套转义规则,来为表、字段名称增加一个别名字段,如Oracle的DEPT_NAME我们设法让它别名显示为DeptName就可以了,SQLServer的由于一般名称都是Pascal的,我们可以不用转义,数据库表、字段名称为DeptName,我们就保留它作为别名DeptName即可。

我的代码生成工具的元数据属性就是这样的模式,有一个NameElement对象,就包含Name和Alias两个属性,如下所示。

2、特别情况下的表、字段名称转义

但我们有时候反向工程的时候,可能数据库是从Oracle到SQLServer的,或者有时候考虑多数据库兼容的情况,那么可能SQLServer的表及字段的名称还是Oracle的命名规则的,如下SQLServer例子所示。

对于以上的数据库信息,如果没有转义数据库名称,那么就给生成代码造成很大的困扰,因为实体类属性名称,类名称都可能是Oracle风格的大写的标志,非常不利于阅读。

但代码生成工具已经增加了智能识别字段名称的逻辑,对于这种从Oracle过来的数据库命名规则,我们也能合理生成对应的代码,如上图的右边,它已经判断使用了Oracle的命名规则来处理别名了。

这样我们生成的代码,就是很友好的命名风格了。

3、自定义表、字段名称的别名

有时候,统一规则生成的别名不一定是我们所需要的,那么请使用代码生成工具的别名设置操作即可把某个表名、字段名设置为你想要的名称,如下操作所示。

1)表别名修改

2)字段别名修改

4、在代码工具的自定义模板中使用字段转义信息

代码生成工具Database2Sharp提供了很好的自定义模板操作交互功能,我们只需要在模板文件中书写NVelocity的模板代码就可以输出各种丰富多彩的代码的,如下面图就是自定义模板列表界面,其中左边列出一些基础的例子模板代码,大家可以参考学习,在树形目录中建立自己的模板文件和模板代码。

使用自定义模板代码的目的,就是要利用数据库的元数据信息来生成复杂而有规律的代码片段或者文件的。

我们注意到模板代码,其中利用到的数据库信息及遍历操作等。

        /// <summary>
        /// 初始化
        /// </summary>
        /// <param name="info">实体类信息</param>
        private void InitData(${ClassName}Info info)
        {
#foreach($ColumnInfo in ${TableInfo.ColumnList.Values})        
#if(${ColumnInfo.AutoIncrement} == false)    
#if(${ColumnInfo.NetType} == "System.String" )
            this.txt${ColumnInfo.Name.Alias.ToCapit()}.Text = info.${ColumnInfo.Name.Alias.ToCapit()};
#elseif(${ColumnInfo.NetType} == "System.DateTime")
            this.txt${ColumnInfo.Name.Alias.ToCapit()}.Text = info.${ColumnInfo.Name.Alias.ToCapit()}.ToShortDateString();
#else
            this.txt${ColumnInfo.Name.Alias.ToCapit()}.Text = info.${ColumnInfo.Name.Alias.ToCapit()}.ToString();
#end
#end ##endif
#end
        }        
                
        /// <summary>
        /// 获取数据
        /// </summary> 
        private ${ClassName}Info GetData()
        { 
            ${ClassName}Info info = new ${ClassName}Info();
#foreach($ColumnInfo in ${TableInfo.ColumnList.Values})        
#if(${ColumnInfo.AutoIncrement} == false)     
#if(${ColumnInfo.NetType} == "System.Decimal" )
            info.${ColumnInfo.Name.Alias.ToCapit()} = Helper.SafeConvertDecimal(this.txt${ColumnInfo.Name.Alias.ToCapit()}.Text);
#elseif(${ColumnInfo.NetType} == "System.DateTime")    
            info.${ColumnInfo.Name.Alias.ToCapit()} = Helper.SafeConvertDate(this.txt${ColumnInfo.Name.Alias.ToCapit()}.Text);        
#else
            info.${ColumnInfo.Name.Alias.ToCapit()} = this.txt${ColumnInfo.Name.Alias.ToCapit()}.Text;   
#end          
#end ##endif
#end
         }

其中的${ColumnInfo.Name.Alias.ToCapit()}为别名,而${ColumnInfo.Name.Name.ToCapit()}为数据库表字段真实名称。
以上模板,我们选择数据库表生成代码,就可以得到下面的标准赋值及获取内容的代码了。

        /// <summary>
        /// 初始化
        /// </summary>
        /// <param name="info">实体类信息</param>
        private void InitData(GroupInfo info)
        {
             this.txtEditor.Text = info.Editor.ToString();
             this.txtEdittime.Text = info.Edittime;
             this.txtName.Text = info.Name;
             this.txtOutGroup.Text = info.OutGroup;
             this.txtGroupOrder.Text = info.GroupOrder;
             this.txtDeptName.Text = info.DeptName;
             this.txtUpperDept.Text = info.UpperDept.ToString();
             this.txtGrade.Text = info.Grade.ToString();
             this.txtRemark.Text = info.Remark;
         }        
                
        /// <summary>
        /// 获取数据
        /// </summary> 
        private GroupInfo GetData()
        { 
             GroupInfo info = new GroupInfo();
             info.Editor = this.txtEditor.Text;   
             info.Edittime = this.txtEdittime.Text;   
             info.Name = this.txtName.Text;   
             info.OutGroup = this.txtOutGroup.Text;   
             info.GroupOrder = this.txtGroupOrder.Text;   
             info.DeptName = this.txtDeptName.Text;   
             info.UpperDept = this.txtUpperDept.Text;   
             info.Grade = this.txtGrade.Text;   
             info.Remark = this.txtRemark.Text;   
          }

以上就是代码生成工具Database2Sharp的数据库表及字段名称转义的智能处理以及应用,如果熟练使用NVelocity的基本语法,结合代码工具提供的数据库元数据信息,我们可以做的更多,做的更好。希望这个工具对你的开发有帮助。

本文转自博客园伍华聪的博客,原文链接:代码生成工具之数据库表及字段名称转义,如需转载请自行联系原博主。



相关实践学习
使用SQL语句管理索引
本次实验主要介绍如何在RDS-SQLServer数据库中,使用SQL语句管理索引。
SQL Server on Linux入门教程
SQL Server数据库一直只提供Windows下的版本。2016年微软宣布推出可运行在Linux系统下的SQL Server数据库,该版本目前还是早期预览版本。本课程主要介绍SQLServer On Linux的基本知识。 相关的阿里云产品:云数据库RDS&nbsp;SQL Server版 RDS SQL Server不仅拥有高可用架构和任意时间点的数据恢复功能,强力支撑各种企业应用,同时也包含了微软的License费用,减少额外支出。 了解产品详情:&nbsp;https://www.aliyun.com/product/rds/sqlserver
目录
相关文章
|
5天前
|
SQL 关系型数据库 数据库
国产数据实战之docker部署MyWebSQL数据库管理工具
【10月更文挑战第23天】国产数据实战之docker部署MyWebSQL数据库管理工具
32 3
国产数据实战之docker部署MyWebSQL数据库管理工具
|
4天前
|
XML 数据库 数据格式
数据库 校验名称唯一性,用于新增和修改功能
数据库 校验名称唯一性,用于新增和修改功能
17 1
|
11天前
|
缓存 数据库 数据安全/隐私保护
Discuz! X 数据库字典详解:DZ各数据表作用及字段含义
我们使用DISCUZ做网站时,有时需要对数据表进行操作,在操作数据表之前,需要对数据表进行了解。下面是DISCUZ 数据库各数据表作用及字段含义详解,方便新手更好的了解DISCUZ数据库。
39 4
|
25天前
|
数据可视化 API PHP
学生信息管理系统-可视化-科目管理CRUD代码生成器
学生信息管理系统-可视化-科目管理CRUD代码生成器
33 5
|
6天前
|
XML 数据库 数据格式
数据库 校验名称唯一性,用于新增和修改功能
数据库 校验名称唯一性,用于新增和修改功能
9 0
|
30天前
|
SQL 数据可视化 关系型数据库
【数据库工具】DBeaver:一款免费的通用数据库工具和 SQL 客户端
【数据库工具】DBeaver:一款免费的通用数据库工具和 SQL 客户端
56 1
|
17天前
|
Rust 关系型数据库 Linux
Rainfrog: 轻量级数据库管理工具
【10月更文挑战第3天】
|
2月前
|
XML 数据库 数据格式
数据库 校验名称唯一性,用于新增和修改功能
数据库 校验名称唯一性,用于新增和修改功能
51 1
|
2月前
|
SQL 关系型数据库 MySQL
MySQL数据库中给表添加字段并设置备注的脚本编写
通过上述步骤,你可以在MySQL数据库中给表成功添加新字段并为其设置备注。这样的操作对于保持数据库结构的清晰和最新非常重要,同时也帮助团队成员理解数据模型的变化和字段的具体含义。在实际操作中,记得调整脚本以适应具体的数据库和表名称,以及字段的详细规范。
53 8
|
3月前
|
人工智能 小程序 Java
【工具】轻松解锁SQLite数据库,一窥微信聊天记录小秘密
本文介绍了一款名为PyWxDump的开源工具,它可以获取微信账户信息、解密SQLite数据库以查看和备份聊天记录。此工具适用于已登录电脑版微信的用户,通过GitHub下载后简单几步即可操作。适合对数据恢复感兴趣的开发者,但请注意合法合规使用并尊重隐私。
394 2
【工具】轻松解锁SQLite数据库,一窥微信聊天记录小秘密

热门文章

最新文章