视频1 视频21 视频41 视频61 视频文章1 视频文章21 视频文章41 视频文章61 推荐1 推荐3 推荐5 推荐7 推荐9 推荐11 推荐13 推荐15 推荐17 推荐19 推荐21 推荐23 推荐25 推荐27 推荐29 推荐31 推荐33 推荐35 推荐37 推荐39 推荐41 推荐43 推荐45 推荐47 推荐49 关键词1 关键词101 关键词201 关键词301 关键词401 关键词501 关键词601 关键词701 关键词801 关键词901 关键词1001 关键词1101 关键词1201 关键词1301 关键词1401 关键词1501 关键词1601 关键词1701 关键词1801 关键词1901 视频扩展1 视频扩展6 视频扩展11 视频扩展16 文章1 文章201 文章401 文章601 文章801 文章1001 资讯1 资讯501 资讯1001 资讯1501 标签1 标签501 标签1001 关键词1 关键词501 关键词1001 关键词1501 专题2001
C#实现GRID字段别名显示,利用MSSQL数据库表及字段描述
2020-11-09 14:13:38 责编:小采
文档


大家看到现有的大多数ERP系统向用户展示的都是中文的字段名,如果维护过ERP就会发现后台的数据库里面用的都是英文字段名的,这时就需要一个字段名别名转换处理,我有想过用[字段名 AS 别名]的方法不过我觉得好麻烦 也写了好多的代码,后面我无意中看到了MSDN

大家看到现有的大多数ERP系统向用户展示的都是中文的字段名,如果维护过ERP就会发现后台的数据库里面用的都是英文字段名的,这时就需要一个字段名别名转换处理,我有想过用[字段名 AS 别名]的方法不过我觉得好麻烦 也写了好多的代码,后面我无意中看到了MSDN上的文档发现了DataTableMapping
以下代码示例创建一个 DataTableMapping(从 System.Data.Common 命名空间)并通过将其命名为“Table”来使其成为指定 DataAdapter 的默认映射。然后,该示例将查询结果中第一个表(Northwind 数据库的 Customers 表)中的列映射到 DataSet 的 Northwind Customers 表中的一组更为用户友好的名称。对于未映射的列,将使用数据源中的列名称。
这里面的“一组更为用户友好的名称” 这几个字吸引了我的眼球。

1.得到一个表包含:表名,表描述,字段名,字段描述等字段资料

 public DataTable GetColumnsInformation(bool IsHeader, params string[] TableNames)
 {
 using (SqlConnection sconn = new SqlConnection(ConnectionString.sqlconnection))
 {
 StringBuilder sbTableInner = new StringBuilder();
 DataSet ds = new DataSet();
 DataTable dt = new DataTable();
 if (!IsHeader)
 {
 for (int CurrentTable = 0; CurrentTable < TableNames.Length; CurrentTable++)
 {
 if (CurrentTable == TableNames.Length - 1)
 {
 sbTableInner.Append("@" + TableNames[CurrentTable]);
 }
 else
 {
 sbTableInner.Append("@" + TableNames[CurrentTable] + ",");
 }
 }
 }
 else
 {
 sbTableInner.Append("@" + TableNames[0]);
 }
 SqlCommand scomm = new SqlCommand("SELECT TableName = OBJECT_NAME(c.object_id)," +
 "TableDecription = (SELECT a.[value] FROM sys.extended_properties a left JOIN sysobjects b ON a.major_id=b.id WHERE b.name=OBJECT_NAME(c.object_id) and a.minor_id=0 )," +
 "ColumnsName = c.name, Description = ex.value, ColumnType = t.name, " +
 "Length = c.max_length, strCount = len(OBJECT_NAME(c.object_id)) " +
 "FROM sys.columns c LEFT OUTER JOIN sys.extended_properties ex " +
 "ON ex.major_id = c.object_id AND ex.minor_id = c.column_id AND ex.name = 'MS_Description' " +
 "left outer join systypes t on c.system_type_id = t.xtype WHERE " +
 "OBJECTPROPERTY(c.object_id, 'IsMsShipped') = 0 " +
 "AND OBJECT_NAME(c.object_id) in (" + sbTableInner.ToString() + ") " +
 "order by strCount", sconn);
 if (!IsHeader)
 {
 for (int CurrentTable = 0; CurrentTable < TableNames.Length; CurrentTable++)
 {
 scomm.Parameters.AddWithValue("@" + TableNames[CurrentTable], TableNames[CurrentTable]);
 }
 }
 else
 {
 scomm.Parameters.AddWithValue("@" + TableNames[0], TableNames[0]);
 }
 SqlDataAdapter sda = new SqlDataAdapter(scomm);
 sda.MissingSchemaAction = MissingSchemaAction.AddWithKey;//添加必须的列和主键信息以完成架构
 sda.Fill(ds, "FieldTable");
 dt = ds.Tables[0];
 dt.Columns.Add("InnerColumns");
 dt.Columns.Add("InnerColumnsCN");
 for (int CurrentRow = 0; CurrentRow < dt.Rows.Count; CurrentRow++)
 {
 dt.Rows[CurrentRow]["InnerColumns"] = dt.Rows[CurrentRow]["TableName"] + "." +
 dt.Rows[CurrentRow]["ColumnsName"];
 dt.Rows[CurrentRow]["InnerColumnsCN"] = dt.Rows[CurrentRow]["TableDecription"] + "-" +
 dt.Rows[CurrentRow]["Description"];

 }
 return dt;
 }
 }
2.利用DataTableMapping 实现,向用户显示友好的字段名称
 public DataTable Query(string tableName, string where, bool IsAlias = true)
 {
 DataTable dtColumns = new DataTable();
 dtColumns = bq.ColumnsInformation(false, new string[] { tableName });
 using (SqlDataAdapter sda = new SqlDataAdapter("SELECT * FROM " + tableName +
 " WHERE InnerID LIKE @where ORDER BY RowID", ConnectionString.sqlconnection))
 {
 SqlParameter parm = new SqlParameter("@where", "%" + where + "%");
 sda.SelectCommand.Parameters.Add(parm);
 DataTableMapping mapping = sda.TableMappings.Add(tableName, dtColumns.Rows[0]["TableDecription"].ToString());
 for (int CurrentRow = 0; CurrentRow < dtColumns.Rows.Count; CurrentRow++)
 mapping.ColumnMappings.Add(dtColumns.Rows[CurrentRow]["ColumnsName"].ToString(),
 dtColumns.Rows[CurrentRow]["Description"].ToString());
 DataSet ds = new DataSet();
 if (IsAlias)
 {
 sda.Fill(ds, mapping.SourceTable);
 }
 else
 {
 sda.Fill(ds, mapping.DataSetTable);
 }
 DataTable dt = new DataTable();
 dt = ds.Tables[0];
 return dt;
 }
 }

这边可以考虑多表关联的情况,留给大家去动动脑子吧!

下载本文
显示全文
专题