在开发过程中,经常有一些重复性的工作要做,而且工作量挺大的
比如,在创建数据表和创建Model实体列时,通常要耗费一定的时间,其实我们可以通过脚本读取数据库表来生成实体类
在SqlServer中有一些系统自带的视图,能帮助我们查询到所要的信息
select * from sys.extended_properties --查询表和列注释,列的排列顺序
select * from sys.columns --查询数据库表所有列的详细信息 字段类型,表的字段,名称等
select * from sysobjects where xtype = 'U' --查询所有用户创建的表信息
select * from systypes --查询SQL SERVER 数据库所有的类型
select * from syscolumns --查询所有字段名称 长度等
我们可以通过多视图查询,获取字段的信息
select syscolumns.name as fieldName,
systypes.name as fieldType,
ext.value as fieldDesc,
sysobjects.name as tableName,
(select isnull(value,'') from sys.extended_properties ex_p where ex_p.minor_id=0 and ex_p.major_id=sysobjects.id) as tableDesc
from syscolumns
inner join sysobjects on syscolumns.id = sysobjects.id
inner join systypes on syscolumns.xtype = systypes.xtype
inner join sys.extended_properties as ext on ext.major_id=sysobjects.id
and ext.minor_id=syscolumns.colorder
where (systypes.name <> 'sysname')
order by ext.major_id
这是查询到所有用户表的结果
我们可以在表属性为表添加说明
同时为列添加说明
在SqlServer的数据类型与C#中是不同的,所以需要进行转换
///
/// 数据库数据类型转C#
///
private string SqlDataTypeToCSharp(string
{
string CSharpDataType = string.Empty;
switch (sqlDataType)
{
case "bit":
CSharpDataType = "bool";
break;
case "tinyint":
CSharpDataType = "byte";
break;
case "smallint":
CSharpDataType = "short";
break;
case "int":
CSharpDataType = "int";
break;
case "bigint":
CSharpDataType = "long";
break;
case "smallmoney":
case "money":
case "numeric":
case "decimal":
CSharpDataType = "int";//decim
break;
case "float":
CSharpDataType = "double";
break;
case "real":
CSharpDataType = "float";
break;
case "smalldatetime":
case "datetime":
case "timestamp":
CSharpDataType = "DateTime";
break;
case "char":
case "text":
case "varchar":
case "nchar":
case "ntext":
case "nvarchar":
CSharpDataType = "string";
break;
case "binary":
case "varbinary":
case "image":
CSharpDataType = "byte[]";
break;
case "uniqueidentifier":
CSharpDataType = "Guid";
break;
case "Variant":
CSharpDataType = "object";
break;
default:
break;
}
return CSharpDataType;
}
在C#中,我们可以新建一个字段类来存放在数据库查询的字段信息
///
/// 字段
///
public class Field
{
///
/// 字段名称
///
public string fieldName { get; set; }
///
/// 字段类型
///
public string fieldType { get; set; }
///
/// 字段说明
///
public string fieldDesc { get; set; }
///
/// 表名称
///
public string tableName { get; set; }
///
/// 表说明
///
public string tableDesc { get; set; }
}
通过查询数据库用户表字段信息,保存于DataGridView中,可再次编辑信息,再根据DataGridView的信息生成预览代码,最后生成.cs文件
我们可以先自己新建一个类,研究各个部分的构成
首先是引入命名空间
lsbMode.Items.Add("using System;");
lsbMode.Items.Add("using System.Collections.Generic;");
lsbMode.Items.Add("using System.Linq;");
lsbMode.Items.Add("using System.Text;");
lsbMode.Items.Add("");
然后就是类名,属性等一些信息,遍历所有字段信息
lsbMode.Items.Add("");
lsbMode.Items.Add(" /// ");
lsbMode.Items.Add(" /// " + fields[i].fieldDesc);
lsbMode.Items.Add(" /// ");
lsbMode.Items.Add(" public " + SqlDataTypeToCSharp(fields[i].fieldType) + " " + fields[i].fieldName +" { get; set; }");
最后将代码保存到.cs文件中,在项目中添加现有项即可
private void SaveToFile(string path)
{
StreamWriter writer = File.CreateText(path);
foreach (var item in lsbMode.Items)
{
writer.WriteLine(item);
}
writer.Close();
}
源码:SqlServer数据库表生成C# Model实体类 小工具 TableToModel源码