C#查表自動生成相應的實體類文件

思路

  1. 查詢數據庫中某個表的字段名、字段類型、字段說明
  2. 拼接 該表對應的實體類 的字符串
  3. 將字符串寫入txt文件,即.cs文件

sql語句

通過sql語句查詢表中的字段名、字段類型、字段說明

--  FinanceDetail 是表名,可以替換成其他表
SELECT temp1.FieldName,
         temp1.FieldType,
         temp2.FieldDescription
FROM 
    (SELECT syscolumns.name AS FieldName,
         systypes.name AS FieldType
    FROM syscolumns
    INNER JOIN systypes
        ON systypes.xtype = syscolumns.xtype
    WHERE id = 
        (SELECT id
        FROM sysobjects
        WHERE name = 'FinanceDetail' ) ) temp1
    LEFT JOIN 
    (SELECT B.name AS column_name,
         C.value AS FieldDescription
    FROM sys.tables A
    INNER JOIN sys.columns B
        ON B.object_id = A.object_id
    LEFT JOIN sys.extended_properties C
        ON C.major_id = B.object_id
            AND C.minor_id = B.column_id
    WHERE A.name = 'FinanceDetail' ) temp2
    ON temp1.FieldName = temp2.column_name

查詢結果如下圖:
在這裏插入圖片描述

C#拼接字符並寫入cs文件

新建控制檯程序

控制檯程序

關鍵代碼

DAL層引入dapper或其他orm框架進行數據庫查詢操作

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using ShanNan.Entities;
using Dapper;
using System.Data.SqlClient;
using System.Data;
using ShanNan.Helper;

namespace ShanNan.DAL
{
        /// <summary>
        /// sql語句查詢表中的字段名、字段類型、字段說明
        /// </summary>
        /// <param name="tableName">數據庫表名</param>
        /// <returns>數據庫表字段名、類型、說明集合</returns>
 public   class TableFieldDAL
    {
        public List<TableField> GetTableFieldList(string tableName)
        {
            List<TableField> tabFieldList = new List<TableField>();
            using (IDbConnection connection = new SqlConnection(DBHelper.GetConnectString()))
            {
                string sqlstr = "SELECT temp1.FieldName, temp1.FieldType, temp2.FieldDescription FROM ( SELECT syscolumns.name AS FieldName, systypes.name AS FieldType FROM syscolumns INNER JOIN systypes ON systypes.xtype = syscolumns.xtype WHERE id = ( SELECT id FROM sysobjects WHERE name = @TableName ) ) temp1 LEFT JOIN ( SELECT B.name AS column_name, C.value AS FieldDescription FROM sys.tables A INNER JOIN sys.columns B ON B.object_id = A.object_id LEFT JOIN sys.extended_properties C ON C.major_id = B.object_id AND C.minor_id = B.column_id WHERE A.name =  @TableName ) temp2 ON temp1.FieldName = temp2.column_name";
  
                tabFieldList = connection.Query<TableField>(sqlstr, new { TableName = tableName }).ToList();
            }
            return tabFieldList;
        }
    }
}

在BLL層拼接字符串並寫入cs文件

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using ShanNan.Result;
using ShanNan.DAL;
using ShanNan.Entities;
using ShanNan.Helper;

namespace ShanNan.BLL
{
 public   class TableFieldBLL
    {
        /// <summary>
        /// 拼接字符串形成類文件
        /// </summary>
        /// <param name="tableName">數據庫中的表名</param>
        /// <returns>統一返回值類</returns>
        public ResultData  Code2Txt(string tableName)
        {
            ResultData Result = new ResultData();

            TableFieldDAL dal = new TableFieldDAL();
            List<TableField> list = dal.GetTableFieldList(tableName);           
            string className = "public class  " + tableName + "{\n";
            //存放數據庫某個表類的字符串
            StringBuilder classStr = new StringBuilder();
            classStr.Append(className);
            //拼接表的字段、類型、註釋   
            foreach (var tabField in list)
            {
                string field = tabField.FieldName;
                string privateFieldStr = "  private string  " + field.ToLower() + " ;\n"; //私有屬性,全小寫。 
                string summary = "/// <summary>\n" + "///" + tabField.FieldDescription + "\n/// <summary>\n";
                string publicFiledStr = "public " + StringHelper.DBType2CsType(tabField.FieldType) + "  "
                    + field + "{get{return " + field.ToLower() + ";}set{" + field.ToLower() + "=value;}}";
                classStr.Append(privateFieldStr + summary + publicFiledStr);              
            }
            classStr.Append("\n }");
            //設置自動生成的代碼放置路徑
            string path = System.AppDomain.CurrentDomain.SetupInformation.ApplicationBase + tableName+".cs";
            //寫入txt文件
          Result.Code   =  TxtHelper.Wrtie2Txt(path, classStr.ToString());
            if (Result.Code=="1")
            {
                Result.Message = "成功寫入";
            }
            else
            {
                Result.Message = "寫入失敗";
            }
            Result.Data = "";
            return Result;  
        }       

    }
}

這裏就涉及到將數據庫字段類型轉換成c#數據類型。借鑑了 SQL SERVER與C#的數據類型對應表中的代碼,並做修改。具體代碼如下:

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;

namespace ShanNan.Helper
{
public    class StringHelper
    {
        #region sqlserver數據類型與C#數據類型的轉換
        /// <summary>
        /// 數據庫中與c#中的數據類型對照
        /// </summary>
        /// <param name="DBtype">數據庫中的數據類型</param>
        /// <returns>C#數據類型</returns>   
        public static string DBType2CsType(string DBtype)
        {
            string CsType = "object";
            switch (DBtype.ToLower())
            {
                case "int":
                    CsType = "int";
                    break;
                case "text":
                    CsType = "string";
                    break;
                case "bigint":
                    CsType = "int";
                    break;
                case "binary":
                    CsType = "byte";
                    break;
                case "bit":
                    CsType = "boolean";
                    break;
                case "char":
                    CsType = "string";
                    break;
                case "datetime":
                    CsType = "DateTime";
                    break;
                case "decimal":
                    CsType = "decimal";
                    break;
                case "float":
                    CsType = "float";
                    break;
                case "image":
                    CsType = "byte";
                    break;
                case "money":
                    CsType = "decimal";
                    break;
                case "nchar":
                    CsType = "string";
                    break;
                case "ntext":
                    CsType = "string";
                    break;
                case "numeric":
                    CsType = "decimal";
                    break;
                case "nvarchar":
                    CsType = "string";
                    break;
                case "real":
                    CsType = "system.single";
                    break;
                case "smalldatetime":
                    CsType = "system.datetime";
                    break;
                case "smallint":
                    CsType = "int";
                    break;
                case "smallmoney":
                    CsType = "double";
                    break;
                case "timestamp":
                    CsType = "DateTime";
                    break;
                case "tinyint":
                    CsType = "int";
                    break;
                case "uniqueidentifier":
                    CsType = "guid";
                    break;
                case "varbinary":
                    CsType = "byte";
                    break;
                case "varchar":
                    CsType = "string";
                    break;
                case "variant":
                    CsType = "object";
                    break;
                default:
                    CsType = "string";
                    break;
            }
            return CsType;
        }
        #endregion
    }
}

最後效果

在這裏插入圖片描述

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章