zoukankan      html  css  js  c++  java
  • 数据的列存储转换为行存储

    一、菜单数据表中的存储结构

         

    二、转换后的数据结构

        

    三、 转换过程

         1、确定菜单数据的最大级别

            /// <summary>
            /// 获得Nature定义的最大目录级别,以便于确定Nature的DataTable表结构中的列数目
            /// </summary>
            /// <returns></returns>
            public int GetMaxNatureLevel()
            {
                if (dtNature == null && dtNature.Rows.Count == 0)
                {
                    dtNature = GetNatureData();
                }
    
                int maxLevel = 0;
                foreach (DataRow dr in dtNature.Rows)
                {
                    int currentLevel = 0;
                    GetLevelByNatureID(dr["natureid"].ToString(), ref currentLevel);
                    if (currentLevel > maxLevel)
                    {
                        maxLevel = currentLevel;
                    }
                }
                return maxLevel;
            }
    
            public void GetLevelByNatureID(string natureid, ref int level)
            {
                if (dtNature == null || dtNature.Rows.Count == 0)
                {
                    dtNature = GetNatureData();
                }
    
                if (dtNature.Rows.Count > 0)
                {
                    DataRow[] drs = dtNature.Select(string.Format("natureid='{0}'", natureid));
                    if (drs.Count() > 0)
                    {
                        level++;
                        string parentid = drs[0]["parentid"].ToString();
                        DataRow[] drst = dtNature.Select(string.Format("natureid='{0}'", parentid));
                        if (drst.Length > 0)
                        {
                            GetLevelByNatureID(parentid, ref level);
                        }
                    }
                }
            }

         2、 构造存储该数据的表结构

            /// <summary>
            /// 依据Nature目录的最大级别,声明表的存储结构
            /// </summary>
            /// <returns></returns>
            public DataTable DeclareNatureTable()
            {
                DataTable dt = new DataTable();
                if (dtNature == null && dtNature.Rows.Count == 0)
                {
                    dtNature = GetNatureData();
                }
                dt.Columns.Add("natureid");
    
                int MaxLevel = GetMaxNatureLevel();
                for (int i = 1; i <= MaxLevel; i++)
                {
                    dt.Columns.Add("nature" + i.ToString());
                }
                return dt;
            }

    三、 获得菜单数据的全部信息

          

       /// <summary>
            /// 获得数据库中Nature的所有信息
            /// </summary>
            /// <returns></returns>
            public DataTable GetNatureData()
            {
                DataTable dt = new DataTable();
                try
                {
                    string sQuery = string.Format(" SELECT natureid,naturenm,parentid,seqnumbr FROM dbo.CRNATUREM0  WHERE dsblflag =0 ORDER BY seqnumbr ");
                    Database db = DatabaseFactory.CreateDatabase();
                    DataSet ds = db.ExecuteDataSet(CommandType.Text, sQuery);
    
                    if (ds != null)
                    {
                        dt = ds.Tables[0];
                    }
                }
                catch (Exception ex)
                {
                    MessageBox.Show("查询数据失败:" + ex.Message);
                }
                return dt;
            }

    四、将数据的树形存储转为线性存储

        

            public DataTable GetNatureTable()
            {
                try
                {
                    if (dtNature != null && dtNature.Rows.Count == 0)
                    {
                        dtNature = GetNatureData();
                    }
    
                    dtResult = DeclareNatureTable(); // 声明表的结构
                    foreach (DataRow dr in dtNature.Rows)
                    {
                        DataRow drn = dtResult.NewRow();
                        string natureid = dr["natureid"].ToString();
                        drn["natureid"] = natureid;
                        int level = 0;
                        GetLevelByNatureID(natureid, ref level);
                        int leve11 = 0;
                        Dictionary<int, string> natureDict = new Dictionary<int, string>();
                        GetNatureValsByID(natureid, ref leve11,natureDict);
                        foreach (KeyValuePair<int, string> keyNature in natureDict)
                        {
                            string colName = "nature" + (level - keyNature.Key).ToString();
                            drn[colName] = keyNature.Value;
                        }
                        dtResult.Rows.Add(drn);
                    }
                }
                catch (Exception ex)
                {
                    MessageBox.Show("查询数据失败:" + ex.Message);
                }
                return dtResult;
            }
    
            /// <summary>
            /// 依据Natureid 获得相应的所有级类目信息
            /// </summary>
            /// <param name="natureid"></param>
            /// <param name="level"></param>
            /// <param name="natureDict"></param>
            public void GetNatureValsByID(string natureid, ref int level,Dictionary<int, string> natureDict)
            {
                if (dtNature != null && dtNature.Rows.Count == 0)
                {
                    dtNature = GetNatureData();
                }
    
                if (dtNature != null && dtNature.Rows.Count > 0)
                {
                    DataRow[] drs = dtNature.Select(string.Format("natureid='{0}'", natureid));
                    natureDict.Add(level, drs[0]["naturenm"].ToString());
                    natureid = drs[0]["parentid"].ToString();
    
                    if(natureid.Trim().Length > 0)
                    {
                        ++level;
                        GetNatureValsByID(natureid, ref level, natureDict);
                    }
                }
       
            }

    五、总结(整体代码概览)

        public class NatureData
        {
            private DataTable dtNature = new DataTable();
            private DataTable dtResult = new DataTable();
            public NatureData()
            {
    
            }
    
            public DataTable GetNatureTable()
            {
                try
                {
                    if (dtNature != null && dtNature.Rows.Count == 0)
                    {
                        dtNature = GetNatureData();
                    }
    
                    dtResult = DeclareNatureTable(); // 声明表的结构
                    foreach (DataRow dr in dtNature.Rows)
                    {
                        DataRow drn = dtResult.NewRow();
                        string natureid = dr["natureid"].ToString();
                        drn["natureid"] = natureid;
                        int level = 0;
                        GetLevelByNatureID(natureid, ref level);
                        int leve11 = 0;
                        Dictionary<int, string> natureDict = new Dictionary<int, string>();
                        GetNatureValsByID(natureid, ref leve11,natureDict);
                        foreach (KeyValuePair<int, string> keyNature in natureDict)
                        {
                            string colName = "nature" + (level - keyNature.Key).ToString();
                            drn[colName] = keyNature.Value;
                        }
                        dtResult.Rows.Add(drn);
                    }
                }
                catch (Exception ex)
                {
                    MessageBox.Show("查询数据失败:" + ex.Message);
                }
                return dtResult;
            }
    
            /// <summary>
            /// 依据Natureid 获得相应的所有级类目信息
            /// </summary>
            /// <param name="natureid"></param>
            /// <param name="level"></param>
            /// <param name="natureDict"></param>
            public void GetNatureValsByID(string natureid, ref int level,Dictionary<int, string> natureDict)
            {
                if (dtNature != null && dtNature.Rows.Count == 0)
                {
                    dtNature = GetNatureData();
                }
    
                if (dtNature != null && dtNature.Rows.Count > 0)
                {
                    DataRow[] drs = dtNature.Select(string.Format("natureid='{0}'", natureid));
                    natureDict.Add(level, drs[0]["naturenm"].ToString());
                    natureid = drs[0]["parentid"].ToString();
    
                    if(natureid.Trim().Length > 0)
                    {
                        ++level;
                        GetNatureValsByID(natureid, ref level, natureDict);
                    }
                }
       
            }
    
            public void GetLevelByNatureID(string natureid, ref int level)
            {
                if (dtNature == null || dtNature.Rows.Count == 0)
                {
                    dtNature = GetNatureData();
                }
    
                if (dtNature.Rows.Count > 0)
                {
                    DataRow[] drs = dtNature.Select(string.Format("natureid='{0}'", natureid));
                    if (drs.Count() > 0)
                    {
                        level++;
                        string parentid = drs[0]["parentid"].ToString();
                        DataRow[] drst = dtNature.Select(string.Format("natureid='{0}'", parentid));
                        if (drst.Length > 0)
                        {
                            GetLevelByNatureID(parentid, ref level);
                        }
                    }
                }
            }
    
            /// <summary>
            /// 获得Nature定义的最大目录级别,以便于确定Nature的DataTable表结构中的列数目
            /// </summary>
            /// <returns></returns>
            public int GetMaxNatureLevel()
            {
                if (dtNature == null && dtNature.Rows.Count == 0)
                {
                    dtNature = GetNatureData();
                }
    
                int maxLevel = 0;
                foreach (DataRow dr in dtNature.Rows)
                {
                    int currentLevel = 0;
                    GetLevelByNatureID(dr["natureid"].ToString(), ref currentLevel);
                    if (currentLevel > maxLevel)
                    {
                        maxLevel = currentLevel;
                    }
                }
                return maxLevel;
            }
    
            /// <summary>
            /// 依据Nature目录的最大级别,声明表的存储结构
            /// </summary>
            /// <returns></returns>
            public DataTable DeclareNatureTable()
            {
                DataTable dt = new DataTable();
                if (dtNature == null && dtNature.Rows.Count == 0)
                {
                    dtNature = GetNatureData();
                }
                dt.Columns.Add("natureid");
    
                int MaxLevel = GetMaxNatureLevel();
                for (int i = 1; i <= MaxLevel; i++)
                {
                    dt.Columns.Add("nature" + i.ToString());
                }
                return dt;
            }
    
    
            /// <summary>
            /// 获得数据库中Nature的所有信息
            /// </summary>
            /// <returns></returns>
            public DataTable GetNatureData()
            {
                DataTable dt = new DataTable();
                try
                {
                    string sQuery = string.Format(" SELECT natureid,naturenm,parentid,seqnumbr FROM dbo.CRNATUREM0  WHERE dsblflag =0 ORDER BY seqnumbr ");
                    Database db = DatabaseFactory.CreateDatabase();
                    DataSet ds = db.ExecuteDataSet(CommandType.Text, sQuery);
    
                    if (ds != null)
                    {
                        dt = ds.Tables[0];
                    }
                }
                catch (Exception ex)
                {
                    MessageBox.Show("查询数据失败:" + ex.Message);
                }
                return dt;
            }
    
        }

    六、运行效果;如下图

     数据结构:

    CREATE TABLE [dbo].[CRNATUREM0](
        [natureid] [nvarchar](10) NOT NULL,
        [naturenm] [nvarchar](100) NULL,
        [parentid] [nvarchar](10) NULL,
        [seqnumbr] [int] NULL,
        [dsblflag] [bit] NULL,
        [lstupdby] [nvarchar](30) NULL,
        [lstupddt] [datetime] NULL,
        [natext] [text] NULL,
     CONSTRAINT [PK_CRNATUREM0] PRIMARY KEY CLUSTERED 
    (
        [natureid] ASC
    )WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON) ON [PRIMARY]
    ) ON [PRIMARY] TEXTIMAGE_ON [PRIMARY]

    附源代码:下载

        

  • 相关阅读:
    单调栈问题解析
    Linux进程状态切换
    Shell编程小例子
    Linux之shell编程
    树的遍历框架
    你真的会求1-100有多少个素数吗
    java实现LRU算法
    从上到下打印二叉树 III
    从上到下打印二叉树I
    模拟盘电路板调试过程中出现的问题
  • 原文地址:https://www.cnblogs.com/tianjinquan/p/3702390.html
Copyright © 2011-2022 走看看