C#查表自動生成相應的實體類文件
思路
- 查詢數據庫中某個表的字段名、字段類型、字段說明
- 拼接 該表對應的實體類 的字符串
- 將字符串寫入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
}
}