C#实现GRID字段别名显示,利用MS SQL数据库表及字段描述

大家看到现有的大多数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;
            }
        }

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

时间: 2024-11-10 11:21:58

C#实现GRID字段别名显示,利用MS SQL数据库表及字段描述的相关文章

利用oracle rownum让表排序字段值连续

利用oracle rownum让表排序字段值连续 1.需求说明 表(eval_index)中有字段如下: 表字段 描述 说明 ID 主键 GROUP_ID 分组编号 SORT_NUM 排序序号 按照分值编号并排序:1.2.- 由于删除或其他操作,导致sort_num序号不连续:需要不改变原来的排序,保持其编号连续. 2.利用rownum功能实现 update eval_index a seta.sort_num = ( select b.rn from (select rownum rn ,id

一、数据库表中字段的增删改查,二、路由基础.三、有名无名分组.四、多app共存的路由分配.五、多app共存时模板冲突问题.六、创建app流程.七、路由分发.八、路由别名,九、名称空间.十、反向解析.十一、2.x新特性.十二、自定义转换器

一.数据库表中字段的增删改查 ''' 直接在modules中对字段进行增删改查 然后在tools下点击Run manage.py Task执行makemigrations和migrate 注意在执行字段的删除过程中需不需要对数据进行备份 ''' 二.路由基础 ''' # url中含有四个参数 # url(regex, view, kwargs=None, name=None) # 正则路径 视图函数地址 默认关键字参数(了解) 路由别名 # r'index' 只要请求中含有index都可以匹配成

SQL 把表中字段存储的逗号隔开内容转换成列表形式

原文:[原创]SQL 把表中字段存储的逗号隔开内容转换成列表形式 我们日常开发中,不管是表设计问题抑或是其他什么原因,或多或少都会遇到一张表中有一个字段存储的内容是用逗号隔开的列表. 具体效果如下图: ------> 从左边图转换成右边图,像这种需求,我们难免会遇到. 今天我写了个存储过程来解决这种问题.主要方式是利用master..spt_values表. 具体存储过程如下: -- Author: LHM -- Create date: 2015-01-10 -- Description: 把

sql语句查询同一表内多字段同时重复的记录 sql数据库重复记录删除

分享下用sql语句删除数据库中重复记录的方法.比如现在有一人员表 (表名:peosons) 若想将姓名.身份证号.住址这三个字段完全相同的记录查询出来select p1.* from persons p1,persons p2 where p1.id<>p2.id and p1.cardid = p2.cardid and p1.pname = p2.pname and p1.address = p2.address可以实现上述效果.几个删除重复记录的SQL语句 1.用rowid方法2.用gr

基于SQL脚本将数据库表及字段提取为C#中的类

开发时,勉不了需要使用SQL直接与数据库交互,这时对于数据库中的表名及字段名会使用的比较多.如果每使用一次都复制一个,实在蛋疼. 所以就考虑将其做成const常量.但是数据库中的表和字段相当多,一个一个敲,不但累,还有可能敲错.要保证正确,最好的办法当然是使用工具或者脚本. 这里提供一个SQL脚本的实现. 原理:获取数据库的表--->遍历每个表中的字段--->生成数据 SQL代码 DECLARE @tableName VARCHAR(MAX) DECLARE @tableCount int D

Java 通过JDBC查询数据库表结构(字段名称,类型,长度等)

Java 通过JDBC查询数据库表结构(字段名称,类型,长度等) 发布者:唛唛家的豆子 时间:2012-11-20 17:54:02 在JDBCPreparedStatement.executeQuery().getMetaData();后,我们可以通过ResultSetMetaData对象查询返回结果集的源数据信息,也就是表结构信息. 示例代码如下: package astar.sutil.db; import java.sql.Connection; import java.sql.Driv

[Oracle]根据字段值全库搜索相关数据表和字段

这个需求比较冷门,但对于在某些特定的情况下,还是会有这样的需要的.好在Oracle实现还比较方便,用存储过程则轻松实现. 查询字符串: create or replace procedure search_string(pString in varchar) as cursor all_tab_cursor is select a.owner, a.table_name, b.column_name from dba_tables a, dba_tab_columns b, dba_object

SQL 查找表名 字段名

转载:http://www.accessoft.com/article-show.asp?id=6135 经常碰到一些忘记表名称的情况,此时只记得个大概,此时可通过查询系统表Sysobjects找到所要的表名,如要查找包含用户的表名,可通过以下SQL语句实现, Select * From sysobjects Where name like '%user%' 如果知道列名,想查找包含有该列的表名,可加上系统表syscolumns来实现,如想查找列名中包含有user的所有表名,可通过以下SQL语句

sql数据库查询结果字段包含换行符导致复制到Excel发生错位问题的解决

问题描述:在工作过程中,有时会遇到这样的问题,写好sql查询语句在数据库中查询数据,看到行数(比如说是1000行),但是把查询结果复制到Excel里面,却发生了行列错位问题,而导致Excel里面的行数是超过1000行的,造成数据行数的不一致. 问题重现:字段值包含char(10)换行符,复制字段值到Excel. 根源:某些行列对应单元格包含了换行符,导致复制到Excel里面发生错位. 解决方案:方案1(推荐):把有问题的字段值,用英文双引号括起来,这样就能把字段值里面的换行符限制在正确的Exce