原理其实很简单,oracle有个表存储列的类型以及备注,我们关联一下读取出这些信息之后,按照.net的规则控制一下缩进,就能有自动生成类的效果了,之所以会做这个,是因为之前用过一个jsonToCsharp的在线网站转换,就想到可以做一个类似的东西。废话不多说,下面直接贴代码;
首先是读取需要的信息
string sql = @"select t1.column_name,data_type,nullable,comments from (
select table_name, column_name, data_type, data_default, nullable from user_tab_cols where Table_Name = '{0}'
)t1
RIGHT JOIN
(
select column_name, comments from user_col_comments where Table_Name = '{0}'
)t2
on t1.column_name = t2.column_name";
sql = string.Format(sql, tableName.ToUpper());
var reader = await this.ExcuteQuery(sql);
List<tableContent> list = new List<tableContent>();
while (await reader.ReadAsync())
{
var obj = new tableContent();
obj.ColumnName = reader.GetString(0);
obj.DataType = reader.GetString(1);
obj.IsNullable = reader.GetString(2);
obj.Comment = reader.GetString(3);
list.Add(obj);
}
sql = @"SELECT t.comments FROM user_tab_comments t WHERE t.table_name = '{0}'";
sql = string.Format(sql, tableName.ToUpper());
var result = await this.ExcuteQueryReturnOne(sql);
list.ForEach(p => p.TableComment = result);
return list;
然后就是按照语法规则以及缩进生成类字符串
StringBuilder sbClass = new StringBuilder(5000);
//添加类名
sbClass.Append("/// <summary>\n");
sbClass.Append(string.Format("/// {0}\n", listtableContent[0].TableComment));
sbClass.Append("/// </summary>\n");
sbClass.Append("public class " + tableName + "\n{\n");
//循环添加列
int count = 1;
foreach (tableContent obj in listtableContent)
{
string datatype = GetDataTypeFromOracleType(obj.DataType);
var propertyName = obj.ColumnName.ToLower();
sbClass.Append(string.Format("\tprivate {1} {0};\n", propertyName, datatype));
//添加注释
sbClass.Append("\t/// <summary>\n");
sbClass.Append(string.Format("\t/// {0}\n", obj.Comment));
sbClass.Append("\t/// </summary>\n");
//sbClass.Append(string.Format("public {2} {1} { get => {0}; set => {0} = value; }\n\n", obj.ColumnName, Function.GetFirstUpperCharacter(obj.ColumnName), datatype));
sbClass.Append(string.Format("\tpublic {0} {1}\n", datatype, GetFirstUpperCharacter(obj.ColumnName)));
sbClass.Append("\t{\n");
sbClass.Append("\t\tget { return " + propertyName + "; }\n\t\tset { " + propertyName + " = value; }\n");
sbClass.Append("\t}\n\n");
count++;
}
//添加结束表机
sbClass.Append("}");
return sbClass.ToString();
基本上除了几个fuction函数,其余的直接copy过去你自己的项目就能使用了,最后我在考虑一个问题,要是.net能动态的把生成的这些类添加到项目里面去就好了,不过这应该是动态语言才能做的,之前听到ios的同事说过,可以动态地增加以及删除类的属性,感觉有点炫酷