使用C#编写自己的代码生成器,附代码讲解(一)
2021-06-09 23:12
标签:sch 连接数 实体 type 链接 实现 where str 结合 首先来阐述下代码生成器制作的几个大的步骤流程: (1)分析项目代码结构:此步比较关键,是制作开发过程中最基础的部分。通过分析项目代码的结构,得出每个类的共同点或者相似点,这些共同点和相似点即可抽象出来作为一个定式。如分析实体类Model结构、DAL数据层结构以及含有的公用类似方法、BLL业务逻辑层的结构以及公用类似方法、View数据展示层相同类似代码等。 举个例子:假设你项目代码中的实体类Model的结构都是如下这种,那你在生成实体类的.CS类文件就得按下面方式的方式生成一个私有字段,然后对应一个共有属性的方式。在DAL层和BLL层的代码类似,如DAL层必须含有一个根据主键Id的查询函数,则你在生成实体类对应DAL层的时候自动生成该查询函数。 { { } } (2)设计项目实体类图,并分析相应的数据流操作:根据步骤一的分析,设计出相应的项目实体类图,并且画出对应的数据流向图,帮助你的代码编写。 (3)数据库层面操作:连接数据库,并且能够自动展示出数据库中的所有表Table以及视图View等数据库对象,支持开发者在选择对应数据表的时候,程序自动查询出该表含有的所有字段信息等。同时建议考虑支持多表SQL语句操作。 (4)操作界面设计层面考虑:根据上述几个步骤的分析,结合我们最后要实现的效果,设计出界面操作图。如博主当初在设计Web版本的代码生成器的时候,当选择对应的数据表后,需要添加该表对应的页面的Title信息,表的字段分别对应数据展示列表的哪一列,该列是否需要设置格式化函数等(如设置数据表中的字段Name最终展示在HTML前端界面的列表列【姓名】列中)。 (5)代码的生成以及保存:根据第一步分析出来的结果,结合后面几部的操作,使用C#代码自动生成对应的代码格式,并将该代码格式的字符串保存到相应的文件中,如.CS为后缀的实体类文件、.cshtml为后缀的展示层View文件等。在生成代码保存文件的时候,建议生成对应的文件夹目录,这样方便在生成代码后直接将文件夹拷贝到对应的项目中即可,省去了自己新建文件的流程。 (6)Web版本代码生成器建议最后做一个代码文件打包压缩下载功能。 需要获取数据库的表对象、视图对象以及表中的字段,需要从数据库中的系统表中查询。 (1)获取选中数据库中的用户表,可以用以下几种方式都可以: Select name from sys.objects where type=‘U‘; Select name from sysobjects where type=‘U‘; Select table_name FROM InFormAtion_Schema.tables; 这里稍微做下解释:sys.tables是sqlserver2005版本中新增一个目录视图,它存储了当前数据库中的所有表信息。sys.objects和sysobjects都代表系统对象表。 其中type的类型有多种,分别代表不同的含义:U=用户表、S=系统表、V=视图、FN=标量函数、TF=表函数、P=存储过程、TR=触发器、D=默认值或者Default约束、PK=主键约束、F=外键约束、UQ=UNIQUE 唯一约束。 (2)获取选中数据库中的视图View,可以用以下几种方式都可以: SELECT * FROM sysobjects where type=‘V‘; SELECT * FROM sys.objects where type=‘V‘; (3)获取选中的数据表中的所有字段信息以及字段的类型 查找出对应的字段类型后在生成实体类的时候就可以自动生成属性的对应的C#类型,如nvarchar、varchar、ntext等类型对应C#中的String类型。 //查询表Product下面的所有字段信息 使用C#开发代码生成器的流程暂时先记录到这,后续的相关设计流程等将在下一篇的文章中记录。 备注:此原创文章最早发表于博主个人站,原文链接使用C#编写自己的代码生成器,附代码讲解(一)_IT技术小趣屋。 使用C#编写自己的代码生成器,附代码讲解(一) 标签:sch 连接数 实体 type 链接 实现 where str 结合 原文地址:https://blog.51cto.com/6455350/2371918
Public class Teacher Private string _Name;
Public string Name
get { return _Name}
set {_Name=value;}
鉴于代码生成器的整个流程比较繁琐复杂,针对这套的实现,将分文章章节来记录,此篇文章优先记录如何从数据库中获取所有的表对象、视图对象,以及选择相应的数据表后读取对应表的所有字段信息。
Select name from sys.tables;
SELECT * FROM INFORMATION_SCHEMA.VIEWS;
SELECT FROM INFORMATION_SCHEMA.COLUMNS WHERE TABLE_NAME = ‘Product‘
//查询视图V_Product下面的所有字段信息
SELECT FROM INFORMATION_SCHEMA.COLUMNS WHERE TABLE_NAME = ‘V_Product‘
下一篇:C#中Lambda表达式总结