• 讲解:小菜鸟自制的.NET实体类生成器


        首先说一下为什么要写这个.NET实体类生成器。

    在网上搜的代码生成器感觉不能满足自己的要求,因此我想写一个适合自己的。

        如果是自己写,像这个是不需要自己手写。。。。。。哈哈,我就是这么懒,所以就决定自己写咯。

        做成什么样,才是我想要的呢?

          1.能够自己选择数据库

          2.能够自己选择选中数据库的表

          3.能够自己输入类名和类说明

          4.能够自己选择是否有命名空间,若选择有命名空间,能够自己输入名字

          5.双击能够修改字段、字段类型、说明。

      但是怎么做呢?有几个问题。。。。。  

          1.怎么获取所有的数据库

          2.怎么获取某个数据库下的所有表(用户表)

          3.怎么获取数据库中表的所有字段、字段类型、说明

          4.选择什么控件呈现表的所有字段、字段类型、说明  

          5.怎么生成实体类

          6.对了,sqlserver的数据类型跟C#数据类型是不匹配的,它们的匹配规则是?

        baidu,google后,问题都解决了。

        1.怎么获取所有的数据库:

    来自互联网:

    select name as 'name' from master..sysdatabases order by name

        2.怎么获取某个数据库下的所有表(用户表)

    来自互联网:

    use   '数据库名'  Select   name   from   sysobjects   where   xtype= 'u '

        3.怎么获取数据库中表的所有字段、字段类型、说明

    来自互联网:

    View Code
     1 SELECT
    2 ColumnName=C.name,
    3 Type=T.name,
    4 ColumnDesc=ISNULL(PFD.[value],N'')
    5 FROM sys.columns C
    6 INNER JOIN sys.objects O
    7 ON C.[object_id]=O.[object_id]
    8 AND O.type='U'
    9 AND O.is_ms_shipped=0
    10 INNER JOIN sys.types T
    11 ON C.user_type_id=T.user_type_id
    12 LEFT JOIN sys.default_constraints D
    13 ON C.[object_id]=D.parent_object_id
    14 AND C.column_id=D.parent_column_id
    15 AND C.default_object_id=D.[object_id]
    16 LEFT JOIN sys.extended_properties PFD
    17 ON PFD.class=1
    18 AND C.[object_id]=PFD.major_id
    19 AND C.column_id=PFD.minor_id
    20 -- AND PFD.name='Caption' -- 字段说明对应的描述名称(一个字段可以添加多个不同name的描述)
    21 LEFT JOIN sys.extended_properties PTB
    22 ON PTB.class=1
    23 AND PTB.minor_id=0
    24 AND C.[object_id]=PTB.major_id
    25 -- AND PFD.name='Caption' -- 表说明对应的描述名称(一个表可以添加多个不同name的描述)
    26
    27 LEFT JOIN -- 索引及主键信息
    28 (
    29 SELECT
    30 IDXC.[object_id],
    31 IDXC.column_id,
    32 Sort=CASE INDEXKEY_PROPERTY(IDXC.[object_id],IDXC.index_id,IDXC.index_column_id,'IsDescending')
    33 WHEN 1 THEN 'DESC' WHEN 0 THEN 'ASC' ELSE '' END,
    34 PrimaryKey=CASE WHEN IDX.is_primary_key=1 THEN N''ELSE N'' END,
    35 IndexName=IDX.Name
    36 FROM sys.indexes IDX
    37 INNER JOIN sys.index_columns IDXC
    38 ON IDX.[object_id]=IDXC.[object_id]
    39 AND IDX.index_id=IDXC.index_id
    40 LEFT JOIN sys.key_constraints KC
    41 ON IDX.[object_id]=KC.[parent_object_id]
    42 AND IDX.index_id=KC.unique_index_id
    43 INNER JOIN -- 对于一个列包含多个索引的情况,只显示第1个索引信息
    44 (
    45 SELECT [object_id], Column_id, index_id=MIN(index_id)
    46 FROM sys.index_columns
    47 GROUP BY [object_id], Column_id
    48 ) IDXCUQ
    49 ON IDXC.[object_id]=IDXCUQ.[object_id]
    50 AND IDXC.Column_id=IDXCUQ.Column_id
    51 AND IDXC.index_id=IDXCUQ.index_id
    52 ) IDX
    53 ON C.[object_id]=IDX.[object_id]
    54 AND C.column_id=IDX.column_id
    55
    56 WHERE O.name=N'{表名}' -- 如果只查询指定表,加上此条件
    57 ORDER BY O.name,C.column_id

        4.选择什么控件呈现表的所有字段、字段类型、说明  

    DataGridView、ListView都可以,我用了DataGridView

        5.怎么生成实体类

    用写入流

        6.sqlserver的数据类型跟C#数据类型是不匹配的,它们的匹配规则是?

    查阅了互联网上sqlserver与C#数据类型对应图,方法自己写的:

    View Code
     1  /// <summary>
    2 /// C#数据类型匹配sqlserver数据类型
    3 /// </summary>
    4 /// <param name="str">sqlserver数据类型</param>
    5 /// <returns></returns>
    6 public string PiPei(string str) {
    7 switch (str)
    8 {
    9 case "bigint":
    10 return "Int64";
    11 case "binary":
    12 return "Byte[]";
    13 case "bit":
    14 return "bool";
    15 case "char":
    16 return "string";
    17 case "date":
    18 return "DateTime";
    19 case "datetime":
    20 return "DateTime";
    21 case "datetime2":
    22 return "DateTime2";
    23 case "datetimeoffset":
    24 return "DateTimeOffset";
    25 case "decimal":
    26 return "Decimal";
    27 case "varbinary(max)":
    28 return "Byte[]";
    29 case "float":
    30 return "Double";
    31 case "image":
    32 return "Byte[]";
    33 case "int":
    34 return "int";
    35 case "money":
    36 return "Decimal";
    37 case "nchar":
    38 return "string";
    39 case "ntext":
    40 return "string";
    41 case "numeric":
    42 return "Decimal";
    43 case "nvarchar":
    44 return "string";
    45 case "real":
    46 return "Single";
    47 case "rowversion":
    48 return "Byte[]";
    49 case "smalldatetime":
    50 return "DateTime";
    51 case "smallint":
    52 return "Int16";
    53 case "smallmoney":
    54 return "Decimal";
    55 case "sql_variant":
    56 return "Object*";
    57 case "text":
    58 return "string";
    59 case "time":
    60 return "TimeSpan";
    61 case "timestamp":
    62 return "Byte[]";
    63 case "tinyint":
    64 return "Byte";
    65 case "uniqueidentifier":
    66 return "Guid";
    67 case "varbinary":
    68 return "Byte[]";
    69 case "varchar":
    70 return "string";
    71 case "xml":
    72 return "Xml";
    73 default:
    74 return "string";
    75 }
    76 }

        界面:

    申明:该界面下半部分是模仿别人代码生成器布局的

        后台代码:

    View Code
      1 /// <summary>
    2 /// 创建相对应的.NET实体类
    3 /// </summary>
    4 /// <param name="className">类名</param>
    5 /// <param name="classRemarks">类说明</param>
    6 private void writeFile(string className, string classRemarks)
    7 {
    8 // 创建文件流
    9 FileStream fs = new FileStream(sfdFile.FileName, FileMode.Create, FileAccess.Write);
    10 // 创建写入流
    11 StreamWriter sw = new StreamWriter(fs, Encoding.Default);
    12
    13 // 写入内容
    14 sw.WriteLine("/* ");
    15 sw.WriteLine(" * 作者:Oven");
    16 sw.WriteLine(" * 创建时间:" + DateTime.Now.ToString());
    17 if (classRemarks.Length != 0)
    18 {
    19 sw.WriteLine(" * 类说明:" + classRemarks);
    20 }
    21 sw.WriteLine(" */ ");
    22 sw.WriteLine("using System;");
    23 sw.WriteLine("using System.Collections;");
    24 sw.WriteLine("using System.Collections.Generic;");
    25
    26 if (radYou.Checked && txtNameSpace.Text.Trim() != null && txtNameSpace.Text.Trim() != "")
    27 {
    28 sw.WriteLine("namespace " + txtNameSpace.Text.Trim());
    29 sw.WriteLine("{");
    30 }
    31
    32 if (classRemarks.Length != 0)
    33 {
    34 sw.WriteLine(" /// <summary>");
    35 sw.WriteLine(" /// " + classRemarks);
    36 sw.WriteLine(" /// </summary>");
    37 }
    38
    39 sw.WriteLine(" public class " + className);
    40 sw.WriteLine(" {");
    41
    42 foreach (DataGridViewRow row in dgvContent.Rows)
    43 {
    44 if (row.Cells[0].Value != null && row.Cells[1].Value != null)
    45 {
    46 string propName = row.Cells[0].Value.ToString(); // 获取属性名
    47
    48 string functionName = getFunName(propName);
    49
    50 string type = row.Cells[1].Value.ToString(); // 获取类型
    51
    52 sw.WriteLine(" private " + type + " " + propName + ";");
    53
    54 if (row.Cells[2].Value != null) // 判断备注是否为空.
    55 {
    56 sw.WriteLine(" /// <summary>");
    57 sw.WriteLine(" /// " + row.Cells[2].Value.ToString());
    58 sw.WriteLine(" /// </summary>");
    59 }
    60
    61 sw.WriteLine(" public " + type + " " + functionName);
    62 sw.WriteLine(" {");
    63 sw.WriteLine(" get { return " + propName + "; }");
    64 sw.WriteLine(" set { " + propName + " = value; }");
    65 sw.WriteLine(" }");
    66 sw.WriteLine("");
    67 }
    68 }
    69
    70 sw.WriteLine(" }");
    71
    72 if (radYou.Checked && txtNameSpace.Text.Trim() != null && txtNameSpace.Text.Trim() != "")
    73 {
    74 sw.WriteLine("}");
    75 }
    76
    77 // 关闭流
    78 sw.Close();
    79 fs.Close();
    80 }
    81
    82 /// <summary>
    83 /// 把字符串首字母转换为大写
    84 /// </summary>
    85 /// <param name="propName">要转换的字符串</param>
    86 /// <returns>反正首字母大写后的字符串</returns>
    87 private static string getFunName(string propName)
    88 {
    89 // 替换属性名前的一个或者多个_ ,
    90 propName = Regex.Replace(propName, "^_+", "");
    91
    92 // 把propName变成首字母为大写的字符串
    93 string functionName = propName.Substring(0, 1).ToUpper() + propName.Substring(1);
    94 return functionName;
    95 }
    96
    97 private void radWu_CheckedChanged(object sender, EventArgs e)
    98 {
    99 txtNameSpace.Visible = false; // 命名空间文本框不可见
    100 }
    101
    102 private void radYou_CheckedChanged(object sender, EventArgs e)
    103 {
    104 txtNameSpace.Visible = true; // 命名空间文本框可见
    105 }
    106
    107 SqlConnection con;
    108 private void btnConnect_Click(object sender, EventArgs e)
    109 {
    110 try
    111 {
    112 con = new SqlConnection(txtConnetionString.Text);
    113 con.Open();
    114 adapter = new SqlDataAdapter("select name as 'name' from master..sysdatabases order by name", con);
    115 DataTable db = new DataTable();
    116 adapter.Fill(db);
    117 this.cbChooseDatabase.DataSource = db;
    118 this.cbChooseDatabase.DisplayMember = "name";
    119 MessageBox.Show("测试连接成功");
    125 }
    126 catch (Exception ex)
    127 {
    128 MessageBox.Show(ex.Message);
    129 }
    130 }

    137 private void cbChooseTable_SelectedIndexChanged(object sender, EventArgs e)
    138 {
    139 string sql = string.Format(@"SELECT
    140 ColumnName=C.name,
    141 Type=T.name,
    142 ColumnDesc=ISNULL(PFD.[value],N'')
    143 FROM sys.columns C
    144 INNER JOIN sys.objects O
    145 ON C.[object_id]=O.[object_id]
    146 AND O.type='U'
    147 AND O.is_ms_shipped=0
    148 INNER JOIN sys.types T
    149 ON C.user_type_id=T.user_type_id
    150 LEFT JOIN sys.default_constraints D
    151 ON C.[object_id]=D.parent_object_id
    152 AND C.column_id=D.parent_column_id
    153 AND C.default_object_id=D.[object_id]
    154 LEFT JOIN sys.extended_properties PFD
    155 ON PFD.class=1
    156 AND C.[object_id]=PFD.major_id
    157 AND C.column_id=PFD.minor_id
    158 -- AND PFD.name='Caption' -- 字段说明对应的描述名称(一个字段可以添加多个不同name的描述)
    159 LEFT JOIN sys.extended_properties PTB
    160 ON PTB.class=1
    161 AND PTB.minor_id=0
    162 AND C.[object_id]=PTB.major_id
    163 -- AND PFD.name='Caption' -- 表说明对应的描述名称(一个表可以添加多个不同name的描述)
    164
    165 LEFT JOIN -- 索引及主键信息
    166 (
    167 SELECT
    168 IDXC.[object_id],
    169 IDXC.column_id,
    170 Sort=CASE INDEXKEY_PROPERTY(IDXC.[object_id],IDXC.index_id,IDXC.index_column_id,'IsDescending')
    171 WHEN 1 THEN 'DESC' WHEN 0 THEN 'ASC' ELSE '' END,
    172 PrimaryKey=CASE WHEN IDX.is_primary_key=1 THEN N'√'ELSE N'' END,
    173 IndexName=IDX.Name
    174 FROM sys.indexes IDX
    175 INNER JOIN sys.index_columns IDXC
    176 ON IDX.[object_id]=IDXC.[object_id]
    177 AND IDX.index_id=IDXC.index_id
    178 LEFT JOIN sys.key_constraints KC
    179 ON IDX.[object_id]=KC.[parent_object_id]
    180 AND IDX.index_id=KC.unique_index_id
    181 INNER JOIN -- 对于一个列包含多个索引的情况,只显示第1个索引信息
    182 (
    183 SELECT [object_id], Column_id, index_id=MIN(index_id)
    184 FROM sys.index_columns
    185 GROUP BY [object_id], Column_id
    186 ) IDXCUQ
    187 ON IDXC.[object_id]=IDXCUQ.[object_id]
    188 AND IDXC.Column_id=IDXCUQ.Column_id
    189 AND IDXC.index_id=IDXCUQ.index_id
    190 ) IDX
    191 ON C.[object_id]=IDX.[object_id]
    192 AND C.column_id=IDX.column_id
    193
    194 WHERE O.name=N'{0}' -- 如果只查询指定表,加上此条件
    195 ORDER BY O.name,C.column_id
    196
    197
    198
    199 ",this.cbChooseTable.Text);
    200 adapter = new SqlDataAdapter(sql,con);
    201 DataTable db = new DataTable();
    202 adapter.Fill(db);
    203 for (int i = 0; i < db.Rows.Count; i++)
    204 {
    205 db.Rows[i][1] = PiPei(db.Rows[i][1].ToString());
    206 }
    207 this.dgvContent.DataSource = db;
    208 }
    209
    210 SqlDataAdapter adapter;
    211 bool biaozhi = false;//标志
    212 private void cbChooseDatabase_SelectedIndexChanged(object sender, EventArgs e)
    213 {
    214 if(biaozhi){
    215 DataTable db = new DataTable();
    216 adapter.SelectCommand.CommandText = "use " + this.cbChooseDatabase.Text + " Select name from sysobjects where xtype= 'u '";
    217 adapter.Fill(db);
    218 this.cbChooseTable.DataSource = db;
    219 this.cbChooseTable.DisplayMember = "name";
    220 DataTable db2 = new DataTable();
    221 adapter.SelectCommand.CommandText = "use " + this.cbChooseDatabase.Text + " Select name from sysobjects where xtype= 'u '";
    222 adapter.Fill(db2);
    223 this.cbChooseTable.DataSource = db2;
    224 this.cbChooseTable.DisplayMember = "name";
    225 }
    226 biaozhi = true;
    227 }
    228
    229 private void Form1_FormClosing(object sender, FormClosingEventArgs e)
    230 {
    231 if(con!=null && con.State == ConnectionState.Open){
    232 con.Close();
    233 }
    234 }
    235
    236 /// <summary>
    237 /// C#数据类型匹配sqlserver数据类型
    238 /// </summary>
    239 /// <param name="str">sqlserver数据类型</param>
    240 /// <returns></returns>
    241 public string PiPei(string str) {
    242 switch (str)
    243 {
    244 case "bigint":
    245 return "Int64";
    246 case "binary":
    247 return "Byte[]";
    248 case "bit":
    249 return "bool";
    250 case "char":
    251 return "string";
    252 case "date":
    253 return "DateTime";
    254 case "datetime":
    255 return "DateTime";
    256 case "datetime2":
    257 return "DateTime2";
    258 case "datetimeoffset":
    259 return "DateTimeOffset";
    260 case "decimal":
    261 return "Decimal";
    262 case "varbinary(max)":
    263 return "Byte[]";
    264 case "float":
    265 return "Double";
    266 case "image":
    267 return "Byte[]";
    268 case "int":
    269 return "int";
    270 case "money":
    271 return "Decimal";
    272 case "nchar":
    273 return "string";
    274 case "ntext":
    275 return "string";
    276 case "numeric":
    277 return "Decimal";
    278 case "nvarchar":
    279 return "string";
    280 case "real":
    281 return "Single";
    282 case "rowversion":
    283 return "Byte[]";
    284 case "smalldatetime":
    285 return "DateTime";
    286 case "smallint":
    287 return "Int16";
    288 case "smallmoney":
    289 return "Decimal";
    290 case "sql_variant":
    291 return "Object*";
    292 case "text":
    293 return "string";
    294 case "time":
    295 return "TimeSpan";
    296 case "timestamp":
    297 return "Byte[]";
    298 case "tinyint":
    299 return "Byte";
    300 case "uniqueidentifier":
    301 return "Guid";
    302 case "varbinary":
    303 return "Byte[]";
    304 case "varchar":
    305 return "string";
    306 case "xml":
    307 return "Xml";
    308 default:
    309 return "string";
    310 }
    311 }

    工具下载:
    http://115.com/file/be6hf643#ClassGenerate.exe

    源码下载:

    http://115.com/file/c2ukijgv#dotnet实体类生成器.zip


     

  • 相关阅读:
    三级联动下拉菜单1
    IP地址查询接口及调用方法
    实现简单的网页拖拽效果
    [转载]PHP如何获取客户端真实IP
    mysql(二)连接查询
    php exec 执行php脚本
    PHP-将某一目录下文件压缩成zip格式
    从读书时代想我的程序之路
    Github上建立自己的网站
    小米手机购买程序,如果是我,我会怎么写
  • 原文地址:https://www.cnblogs.com/tofight/p/2413620.html
Copyright © 2020-2023  润新知