c#实现数据库表映射成模型类

using System;
using System.Collections.Generic;
using System.Data;
using System.Data.SqlClient;
using System.IO;
using System.Linq;
using System.Text;
using System.Threading.Tasks;

namespace 数据库表映射模型
{
    public class SqlTableModel
    {
        public void SqlEntityClass()
        {
            /*将数据库存在的表名存储到一张中*/
            string sql = "SELECT TABLE_NAME FROM INFORMATION_SCHEMA.TABLES WHERE TABLE_TYPE = 'BASE TABLE' AND TABLE_SCHEMA = 'dbo'";
            DataTable table = SqlHelper.ExcuteDataTable(sql);

            /*查询所有存在的表,并获得表的字段名称、类型*/
            Dictionary<string, DataTable> tableNames_Tables = SetTableModel(table);
            /*sql类转实体类模板*/
            Dictionary<string, string> tableNames_codes = GenerateEntityClass(tableNames_Tables);
            FileWrite(tableNames_codes);
        }

        public Dictionary<string,DataTable> SetTableModel(DataTable table)
        {
            Dictionary<string, DataTable> tableNames_Tables = new Dictionary<string, DataTable>();
            /*拼接表查询+参数化*/
            foreach (DataRow item in table.Rows)
            {
                //获得表名
                string tableName = item["TABLE_NAME"].ToString();
                string sql = $"SELECT COLUMN_NAME AS 'Name', DATA_TYPE AS 'Type', CHARACTER_MAXIMUM_LENGTH AS 'Length' " +
                                          "FROM INFORMATION_SCHEMA.COLUMNS " +
                                          "WHERE TABLE_NAME =@TableName_" + tableName + "  AND TABLE_SCHEMA = 'dbo';"; // 假设你的表在dbo架构下  
                SqlParameter p = new SqlParameter("@TableName_" + tableName, tableName);
                //sb.Append(sql);
                //ps.Add(p);
                tableNames_Tables[tableName] =SqlHelper.ExcuteDataTable(sql, CommandType.Text, p);
            }
            return tableNames_Tables;
        }

        public Dictionary<string,string> GenerateEntityClass(Dictionary<string, DataTable> tableNames_Tables)
        {
            Dictionary<string, string> tableNames_codes = new Dictionary<string, string>();
            foreach (var item in tableNames_Tables)
            {
                /*类模板拼接*/
                StringBuilder sb = new StringBuilder();
                
                sb.AppendLine("using System;\nusing System.Collections.Generic;\nusing System.Linq;\nusing System.Text;\nusing System.Threading.Tasks;\n ");
                sb.AppendLine("namespace Model\n{");
                sb.AppendLine($"    public class {item.Key}");
                sb.AppendLine("    {");
                /*将sql类型转换成c#类型*/
                foreach (DataRow row in item.Value.Rows)
                {
                    string propertyName = row["Name"].ToString();
                    string propertyType = MapSqlTypeToCSharpType(row["Type"].ToString(), row["Length"]?.ToString());
                    sb.AppendLine($"        public {propertyType} {propertyName} {{ get; set; }}");
                }
                sb.AppendLine("    }\n}");
                tableNames_codes[item.Key] = sb.ToString();
            }
            return tableNames_codes;
        }
        //将sql类型转换成c#类型
        public string MapSqlTypeToCSharpType(string sqlType, string length)
        {
            switch (sqlType.ToLower())
            {
                // 数值类型  
                case "bigint":
                    return "long";
                case "int":
                    return "int";
                case "smallint":
                    return "short";
                case "tinyint":
                    return "byte";
                case "bit":
                    return "bool";
                case "decimal":
                case "money":
                case "smallmoney":
                    return "decimal";
                case "numeric":
                    // 如果提供了长度和精度,可以生成更具体的 decimal 类型,例如 decimal(18,2)  
                    // 这里为了简化,我们仅返回 decimal  
                    return "decimal";
                case "float":
                    return "double";
                case "real":
                    return "float";

                // 字符和文本类型  
                case "char":
                case "nchar":
                case "varchar":
                case "nvarchar":
                case "text":
                case "ntext":
                    // 对于文本类型,我们可以根据长度返回 string 或者更具体的如 string[50]  
                    // 但C#中不直接支持指定长度的 string,所以这里仅返回 string  
                    return "string";

                // 二进制类型  
                case "binary":
                case "varbinary":
                case "image":
                    return "byte[]";

                // 日期和时间类型  
                case "date":
                    return "DateTime";
                case "datetime":
                case "smalldatetime":
                    return "DateTime";
                case "datetime2":
                    // 可以根据长度进一步指定 DateTime 的精度,但这里简化处理  
                    return "DateTime";
                case "datetimeoffset":
                    return "DateTimeOffset";
                case "time":
                    return "TimeSpan";

                // 其他类型  
                case "uniqueidentifier":
                    return "Guid";
                case "sql_variant":
                    // 难以直接映射到 C# 类型,可能需要更复杂的处理  
                    return "object";
                case "xml":
                    return "string"; // 或者使用 XElement/XDocument 等  
                case "cursor":
                case "hierarchyid":
                case "geography":
                case "geometry":
                case "rowversion":
                case "table":
                case "timestamp":
                case "variant":
                    // 这些类型可能需要特殊处理或自定义类  
                    // 这里为了简化,我们返回 object 或其他通用类型  
                    return "object";

                // 默认值或未知类型  
                default:
                    return "object"; // 或者抛出异常  
            }
        }
        public void FileWrite(Dictionary<string, string> tableNames_codes)
        {
            foreach (var item in tableNames_codes)
            {
                File.WriteAllText($"D:/Exercise Files/ASP.NET MVC/EF/EF练习/数据库表映射模型/" + item.Key+".cs",item.Value);
                Console.WriteLine(Path.GetFullPath(item.Key + ".cs"));
            }
        }
    }
}

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
C# WinForms中,你可以使用对象映射(Object Mapping)来实现数据的保存。对象映射是一种将对象与数据库之间进行映射的技术,可以简化数据的操作和持久化。 以下是使用映射实现数据保存的一般步骤: 1. 创建数据模型类:首先,创建一个示数据的模型类,该类包含与数据库中列对应的属性。例如,如果你要保存学生信息,可以创建一个名为Student的类,并在该类中定义属性如Name、Age、Grade等。 2. 创建数据映射类:创建一个数据映射类,该类将数据模型类与实际数据库进行映射。你可以使用ORM(对象关系映射)框架,如Entity Framework或NHibernate来进行映射操作。在这个映射类中,你需要定义数据模型类与数据库之间的映射关系,包括名、列名、主键等。 3. 数据操作:使用映射类提供的方法来进行数据操作,如插入、更新或删除。可以通过创建映射类的实例,然后调用相应的方法来执行这些操作。例如,调用Insert方法可以将数据保存到数据库中。 下面是一个简单示例,演示如何使用Entity Framework进行对象映射和数据保存: ```csharp // 数据模型类 public class Student { public int Id { get; set; } public string Name { get; set; } public int Age { get; set; } public string Grade { get; set; } } // 数据映射类 public class StudentMap : EntityTypeConfiguration<Student> { public StudentMap() { this.ToTable("Students"); // 映射数据库中的名 this.HasKey(s => s.Id); // 主键 this.Property(s => s.Name).IsRequired(); // 属性映射 this.Property(s => s.Age); this.Property(s => s.Grade); } } // 数据操作示例 public class StudentRepository { private DbContext dbContext; public StudentRepository() { this.dbContext = new DbContext(); // 创建数据库上下文对象 } public void Insert(Student student) { dbContext.Set<Student>().Add(student); // 添加到上下文中 dbContext.SaveChanges(); // 保存到数据库 } } ``` 这只是一个简单示例,实际上,使用对象映射可以实现更复杂的数据操作,包括查询、关联等。你可以根据具体的需求和使用的ORM框架来进行更详细的配置和操作。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值