前言
本文使用Sqlsuger框架对SqlServer数据库进行访问与操作
业务场景有时需要根据数据库名获取表结构对应的列项和描述。
1、使用SqlSuger数据库提供的方法;
2、使用原生的sql进行操作
一、SqlSuger方法
示例使用仓储调用上文Context,使用方法GetColumnInfosByTableName获取数据表信息;
List<DbColumnInfo> GetColumnInfosByTableName(string tableName, bool isCache = true);
入参:
tableName
:表名(string),
isCache
:是否使用Cache数据(当对待查询表进行数据库动态新增或删除字段时,使用true会导致读到脏数据),参数默认值为true
出参:
List<DbColumnInfo> value
:包含表列项的详细数据,包括列名和描述等。
var ColumnList = _DataSourceRepository.Context.DbMaintenance.GetColumnInfosByTableName(custInfo.TableName);
foreach( var column in ColumnList)
{
var item = new DataSource()
{
CustId = parm.CustId,
ProductCode = parm.ProductCode,
//获取表的列项,列
Param = column.DbColumnName,
//获取列项的描述,列名
ParamName = column.ColumnDescription,
IsDefault = "1",
//获取用户名
CreateBy = _HttpContext.User.Identity.Name,
CreateTime = DateTime.Now,
};
SourceList.Add(item);
}
二、使用原生sql
TableName为对应的数据库表名,SqlServer使用以下Sql可查询到表名对应的列项和列项说明(Mysql不一定支持,未测试)。通过方法GetDataTable(sql),执行sql返回DataTable类型数据,再遍历返回值获取里面表的列项和说明。
var sqls = "SELECT B.name AS DbColumnName,C.value AS ColumnDescription " +
"from sys.columns B LEFT JOIN sys.extended_properties C ON C.major_id = B.object_id AND C.minor_id = B.column_id" +
" WHERE B.object_id = object_id('" + TableName + "')";
var ColumnInfoList = _DataSourceRepository.Context.Ado.GetDataTable(sqls);
var tableColumn = new List<TableColumn>();
foreach (DataRow row in ColumnInfoList.Rows)
{
//获取列项
var columnName = row["DbColumnName"].ToString();
//获取列项描述
var columnDes = row["ColumnDescription"].ToString();
var item = new TableColumn
{
ColumnName = columnName,
ColumnDescription = columnDes;
}
tableColumn.Add(item);
}
总结
以上两种方法都能实现通过表名获取表字段和描述,请注意示例里的具体的方法使用。如需使用,请根据具体业务场景考虑。