C# .NetCore 通过 反射 ORM ,代码生成器

这篇文章,目前这个功能的已经被用作若干项目,写出来的目的,就是了让大家了解一下  代码生成器,和反射的作用,作为学习资料。

首先加载数据库,查询出数据库下对应的数据表 

 DataTable datatableList = bll.GetDataTable("SELECT Name FROM SysObjects Where XType='U' ORDER BY Name");
            foreach (System.Data.DataRow dr in datatableList.Rows)
            {
                this.lst_Tables.Items.Add(dr[0].ToString());
            }

创建数据库实体类文件

  1 public static void tableToCSharpClass(DataTable rsmd, String _namespace, String className, string filepath)
  2         {
  3             try
  4             {
  5                 System.Text.StringBuilder cs = new System.Text.StringBuilder(),
  6                  csFiled = new System.Text.StringBuilder(),
  7                  csProperty = new System.Text.StringBuilder();
  8                 string line = Environment.NewLine;
  9                 //加入命名空间
 10                 cs.Append("using System;").Append(line).Append(line);
 11                 cs.Append("/*").Append(line);
 12                 cs.Append(" *本代码部分为程序自动生成").Append(line);
 13                 cs.Append(" * 使用前请检查").Append(line);
 14                 cs.Append(" */").Append(line).Append(line);
 15                 cs.Append("namespace ").Append(_namespace).Append(" {");
 16                 cs.Append(line).Append(line);
 17                 //加入类名
 18                 cs.Append("/// <summary>").Append(line);
 19                 cs.Append("//实体类").Append(line);
 20                 cs.Append("/// </summary>").Append(line);
 21                 cs.Append(" public class ").Append(className).Append(" {");
 22                 cs.Append(line).Append(line);
 23 
 24                 int c = rsmd.Columns.Count;
 25                 System.Data.DataColumn[] pKeycolum = rsmd.PrimaryKey;
 26                 string type, name, pKey = string.Empty;
 27                 System.Object t;
 28                 for (int i = 0; i <= c - 1; i++)
 29                 {
 30                     name = rsmd.Columns[i].ColumnName.Replace(' ', '_');
 31                     System.Type dbType = rsmd.Columns[i].DataType;
 32                     string allowDBNull = "字段允许为空:" + rsmd.Columns[i].AllowDBNull.ToString();
 33                     string maxLong = "字段长度:" + rsmd.Columns[i].MaxLength.ToString();
 34                     foreach (System.Data.DataColumn colum in pKeycolum)
 35                     {
 36                         if (name == colum.ColumnName)
 37                         {
 38                             pKey = "主键";
 39                         }
 40                     }
 41                     t = dbType.ToString();
 42                     string summary = string.Empty;
 43                     summary = "///" + name + line
 44                        + "///" + allowDBNull + line
 45                        + "///" + maxLong + line;
 46                     type = MSSQLServerDataTypeCSharpTypeMap(dbType);
 47 
 48                     if (t != null)
 49                     {
 50                         type = t.ToString();
 51                     }
 52                     else
 53                     {
 54                         type = "___" + dbType;
 55                     }
 56                     //加入私有字段
 57                     csFiled.Append(line).Append(line);
 58                     csFiled.Append("/// <summary>").Append(line);
 59                     csFiled.Append("///私有字段").Append(line);
 60                     csFiled.Append(summary);
 61                     csFiled.Append("/// </summary>").Append(line);
 62                     if ((type != "System.String") && (type != "System.Byte") && (type != "System.Single") && (type != "System.Byte[]"))
 63                     {
 64                         csFiled.Append(" private ").Append(type + "?").Append(" _").Append(name).Append(";").Append(line);
 65                     }
 66                     else
 67                     {
 68                         csFiled.Append(" private ").Append(type).Append(" _").Append(name).Append(";").Append(line);
 69                     }
 70                     //加入共有方法
 71                     csProperty.Append(line).Append(line);
 72                     csProperty.Append("/// <summary>").Append(line);
 73                     csProperty.Append("///公有属性").Append(line);
 74                     csProperty.Append(summary);
 75                     csProperty.Append("/// </summary>").Append(line);
 76                     if ((type != "System.String") && (type != "System.Byte") && (type != "System.Single") && (type != "System.Byte[]"))
 77                     {
 78                         csProperty.Append(" public ").Append(type + "?").Append(" ").Append(name).Append(line);
 79                     }
 80                     else
 81                     {
 82                         csProperty.Append(" public ").Append(type).Append(" ").Append(name).Append(line);
 83                     }
 84                     csProperty.Append("{").Append(line);
 85                     csProperty.Append(" get {").Append(line);
 86                     csProperty.Append(" return ").Append(" _").Append(name).Append(";").Append(line);
 87                     csProperty.Append("}").Append(line);
 88                     csProperty.Append(" set {").Append(line);
 89                     csProperty.Append("  _").Append(name).Append(" = value ;").Append(line);
 90                     csProperty.Append("}").Append(line);
 91                     csProperty.Append("}").Append(line);
 92                 }
 93 
 94                 cs.Append(csFiled).Append(csProperty);
 95                 cs.Append(" }").Append(line);
 96                 cs.Append("}").Append(line);
 97                 System.IO.File.Delete(className + ".cs");
 98                 string path = filepath + @"\";
 99                 System.IO.StreamWriter sw = System.IO.File.CreateText(path + className + ".cs");
100                 sw.Write(cs.ToString());
101                 sw.Close();
102                 sw.Dispose();
103             }
104             catch (Exception ex)
105             {
106                 MessageBox.Show(ex.ToString());
107             }
108         }

SQL Server  字段类型映射

 1  public static string MSSQLServerDataTypeCSharpTypeMap(System.Type _type)
 2         {
 3 
 4             string _Result = string.Empty;
 5             switch (_type.ToString())
 6             {
 7                 case "tinyint":
 8                     _Result = "tinyint";
 9                     break;
10                 case "char":
11                     _Result = "string";
12                     break;
13                 case "varchar":
14                     _Result = "string";
15                     break;
16                 case "nvarchar":
17                     _Result = "string";
18                     break;
19                 case "text":
20                     _Result = "string";
21                     break;
22                 case "datetime":
23                     _Result = "DateTime";
24                     break;
25                 case "int":
26                     _Result = "int";
27                     break;
28                 //case "intidentity":
29                 //    _Result = "float";
30                 //    break;
31                 case "float":
32                     _Result = "float";
33                     break;
34                 case "bit":
35                     _Result = "string";
36                     break;
37                 case "numeric":
38                     _Result = "double";
39                     break;
40                 case "money":
41                     _Result = "double";
42                     break;
43                 case "image":
44                     _Result = "image";
45                     break;
46                
47             }
48             return _Result;
49         }

 

posted @ 2022-11-23 08:37  再见大圣--无毛猴子  阅读(283)  评论(0)    收藏  举报