学习自:https://blog.youkuaiyun.com/csdn1987/article/details/89677563
using System;
using System.CodeDom;
using System.CodeDom.Compiler;
using System.Collections.Generic;
using System.Data;
using System.IO;
using System.Linq;
using System.Reflection;
using System.Text;
using System.Threading.Tasks;
using System.Windows.Forms;
namespace PXPublic
{
/// <summary>
/// 动态生成类文件
/// </summary>
public class GeneratorClass
{
static string fieldName = "";
static string commentText = "";//生成字段、属性、方法时的注释文本
static string methodCode = "";//生成方法时方法内部的代码片段
/// <summary>
/// 动态生成表结构类文件
/// </summary>
/// <param name="tableInfo">要生成类文件的表信息</param>
public static void GeneratorTableClass(MyDataSet tableInfo)
{
for (int i = 0; i < tableInfo.Tables[0].Rows.Count; i++)
{
//准备一个代码编译器单元
CodeCompileUnit unit = new CodeCompileUnit();
//设置命名空间(这个是指要生成的类的空间)
CodeNamespace myNamespace = new CodeNamespace("TableManager");
//导入必要的命名空间引用
myNamespace.Imports.Add(new CodeNamespaceImport("System"));
myNamespace.Imports.Add(new CodeNamespaceImport("System.Collections.Generic"));
myNamespace.Imports.Add(new CodeNamespaceImport("System.Linq"));
myNamespace.Imports.Add(new CodeNamespaceImport("System.Text"));
myNamespace.Imports.Add(new CodeNamespaceImport("System.Threading.Tasks"));
myNamespace.Imports.Add(new CodeNamespaceImport("System.Data"));
//声明一个名为className的CodeTypeDeclaration
CodeTypeDeclaration myClass = new CodeTypeDeclaration(tableInfo.Tables[0].Rows[i]["tableName"].ToString());
myClass.IsClass = true; //指定该CodeTypeDeclaration为一个类
myClass.TypeAttributes = TypeAttributes.Public; //该类为公开的
//把这个类放在这个命名空间下
myNamespace.Types.Add(myClass);
//把该命名空间加入到编译器单元的命名空间集合中
unit.Namespaces.Add(myNamespace);
// 根据表名查询表的字段信息
string sql = " SELECT DISTINCT A.COLUMN_NAME" +
" ,B.COMMENTS " +
" ,A.DATA_TYPE " +
" ,A.DATA_LENGTH" +
" ,A.DATA_SCALE " +
" ,A.NULLABLE " +
" ,D.col# " +
" FROM USER_TAB_COLUMNS A,USER_COL_COMMENTS B,sys.col$ D" +
" WHERE A.TABLE_NAME = B.TABLE_NAME" +
" AND A.COLUMN_NAME = B.COLUMN_NAME" +
" AND D.NAME= A.COLUMN_NAME" +
" AND D.obj# IN (SELECT object_id FROM all_objects WHERE object_name = @TABLE_NAME )" +
" AND A.TABLE_NAME =@TABLE_NAME " +
" ORDER BY D.col# ";
DBManager.ParameterAdd("TABLE_NAME", tableInfo.Tables[0].Rows[i]["tableName"].ToString());
MyDataSet outDs = new MyDataSet();
int resultFlag = PXPublic.DBManager.ExcuteSelect(sql, outDs);
// 抽时间添加log4Net日志模块
//公用字段声明
CodeMemberField member = new CodeMemberField(typeof(System.String), "tableName");
member.Attributes = MemberAttributes.Private | MemberAttributes.Static; //设置访问类型
commentText = "\n/ <summary>\n" +
"/ 数据表名称\n" +
"/ </summary>";
member.Comments.Add(new CodeCommentStatement(commentText));
myClass.Members.Add(member); //把该字段添加到类中
member = new CodeMemberField(typeof(System.String), "tableCname");
member.Attributes = MemberAttributes.Private | MemberAttributes.Static; //设置访问类型
commentText = "\n/ <summary>\n" +
"/ 数据表描述\n" +
"/ </summary>";
member.Comments.Add(new CodeCommentStatement(commentText));
myClass.Members.Add(member); //把该字段添加到类中
//添加属性
CodeMemberProperty property = new CodeMemberProperty();
// 声明数据表结构字段
foreach (DataRow dr in outDs.Tables[0].Rows)
{
// 字段相关属性设置
fieldName = dr["COLUMN_NAME"].ToString().ToLower()+"_";
if (dr["DATA_TYPE"].ToString() == "VARCHAR2")
member = new CodeMemberField(typeof(System.String), fieldName);
else if (dr["DATA_TYPE"].ToString() == "NUMBER")
member = new CodeMemberField(typeof(System.Decimal), fieldName);
member.Attributes = MemberAttributes.Private | MemberAttributes.Static; //设置访问类型
commentText = "\n/ <summary>\n" +
"/ " + dr["COMMENTS"].ToString() +"\n"+
"/ </summary>";
member.Comments.Add(new CodeCommentStatement(commentText));
myClass.Members.Add(member); //把该字段添加到类中
// 属性相关信息设置
property = new CodeMemberProperty();
//设置访问类型
property.Attributes = MemberAttributes.Public | MemberAttributes.Sta

本文介绍了一种使用C#动态生成表结构类的方法,包括字段、属性及增删改查等常用方法的实现。通过反射和CodeDOM,能够快速生成与数据库表对应的类文件。
最低0.47元/天 解锁文章
904

被折叠的 条评论
为什么被折叠?



