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

本文涉及的产品
云数据库 RDS SQL Server,独享型 2核4GB
简介:

在上篇随笔《代码生成工具之界面快速生成》中介绍过了代码生成工具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
目录
相关文章
|
3天前
|
SQL 存储 关系型数据库
数据库开发之图形化工具以及表操作的详细解析
数据库开发之图形化工具以及表操作的详细解析
21 0
|
1月前
|
数据库
ABAP 泛型编程实战 - 分享一个数据库表内容的拷贝工具试读版
ABAP 泛型编程实战 - 分享一个数据库表内容的拷贝工具试读版
20 0
|
2月前
|
运维 安全 关系型数据库
参加数据库管理工具DAS训练营,赢取国潮保温杯和阿里云定制双肩包!
本训练营带您简单了解数据库自治与云安全服务,数据库自治服务提供云上RDS、PolarDB、NoSQL、ADB等数据库7*24小时异常检测、SQL自优化、安全合规审计、弹性伸缩、数据自治、锁分析等亮点功能。一站式自动化、数字化DAS集成平台,助力您畅享DBA运维智能化。
|
3月前
|
关系型数据库 MySQL 数据库
往数据库的字段varchar 或datetime里存时间值
往数据库的字段varchar 或datetime里存时间值
118 0
|
3月前
|
SQL Java 数据库连接
Mybatis和MybatisPlus:数据库操作工具的对比
Mybatis和MybatisPlus:数据库操作工具的对比
154 0
|
1月前
|
关系型数据库 MySQL 数据库
rds安装数据库客户端工具
安装阿里云RDS的数据库客户端涉及在本地安装对应类型(如MySQL、PostgreSQL)的客户端工具。对于MySQL,可选择MySQL Command-Line Client或图形化工具如Navicat,安装后输入RDS实例的连接参数进行连接。对于PostgreSQL,可以使用`psql`命令行工具或图形化客户端如PgAdmin。首先从阿里云控制台获取连接信息,然后按照官方文档安装客户端,最后配置客户端连接以确保遵循安全指引。
86 1
|
22天前
|
存储 关系型数据库 MySQL
MySQL数据库性能大揭秘:表设计优化的高效策略(优化数据类型、增加冗余字段、拆分表以及使用非空约束)
MySQL数据库性能大揭秘:表设计优化的高效策略(优化数据类型、增加冗余字段、拆分表以及使用非空约束)
|
3月前
|
SQL 关系型数据库 MySQL
常用的数据库链接工具都有哪些
常用的数据库链接工具都有哪些
174 2
|
7天前
|
SQL 关系型数据库 MySQL
mysql 数据库查询 查询字段用逗号隔开 关联另一个表并显示
mysql 数据库查询 查询字段用逗号隔开 关联另一个表并显示
17 2
|
29天前
|
SQL 关系型数据库 MySQL
Mysql数据库一个表字段中存了id,并以逗号分隔,id对应的详细信息在另一个表中
Mysql数据库一个表字段中存了id,并以逗号分隔,id对应的详细信息在另一个表中
10 0

热门文章

最新文章