这种树状表挺普遍的,和大家探讨下,挺喜欢递归方式读取这表,以前写过个递归读取用户控件生成管理这种表数据的table。 

应聘:

读书三年,毕业了,实习半年的旅游公司也已辞职,打算找正儿八经的搞程序的公司。网上投吧,暂不打算离开桂林

那范围就小了,看来看去就投了两家,桂林这行真的不砸的...

面试还算顺利,最后还要做道笔试题,笔就笔吧

题目:

/*
要求:根据下面提供的树状表Tasks,
         使用C#,写一个函数,读取数据库表Tasks,
         根据表的内容输出string类型的结果,
         结果的内容如下:
[
  {
    TaskID:'1',ParentID:'0',TaskName:'软件开发',
    children:[
               {
                 TaskID:'2',ParentID:'1',TaskName:'需求分析',
                 children:[
                            {TaskID:'3',ParentID:'2',TaskName:'客户需求调研'},
                            {TaskID:'4',ParentID:'2',TaskName:'生成需求文档'}
                           ]
                },
                {
                  TaskID:'5',ParentID:'1',TaskName:'系统分析',
                  children:[ 
                             {TaskID:'6',ParentID:'5',TaskName:'数据库设计'}
                            ]
                 }
              ]
  }
]
---------------------------------------------------
Tasks(任务表)表结构SQL脚本
---------------------------------------------------
TaskID ParentID TaskName //任务ID,父任务ID,任务名称
---------------------------------------------------
1      0        软件开发
2      1          需求分析
3      2            客户需求调研
4      2            生成需求文档
5      1          系统分析
6      5            数据库设计
---------------------------------------------------
*/


CREATE TABLE Tasks (
    TaskId 
int  ,             // 任务ID
    ParentID  int ,            // 父任务ID
    TaskName varchar ( 50 )    // 任务名称 

GO
Insert Into Tasks (TaskID,ParentID,TaskName)
select 
1 , 0 , ' 软件开发 '

Insert Into Tasks (TaskID,ParentID,TaskName)
select 
2 , 1 , ' 需求分析 '

Insert Into Tasks (TaskID,ParentID,TaskName)
select 
3 , 2 , ' 客户需求调研 '

Insert Into Tasks (TaskID,ParentID,TaskName)
select 
4 , 2 , ' 生成需求文档 '

Insert Into Tasks (TaskID,ParentID,TaskName)
select 
5 , 1 , ' 系统分析 '

Insert Into Tasks (TaskID,ParentID,TaskName)
select 
6 , 5 , ' 数据库设计 '

 

思考:

粗略看了下,还行挺普遍的数据表估计是要生成用在ext上的json数据,呵呵还对得起我这应届生,有两思路

一个用DataReader这玩意,一个用datatable。算了这是笔试要讲速度的就先用datareader写吧

 

解题:

1.花了20分钟搞出来了,慢了点,其实我对datatable更熟悉的怎么选了reader

 

         public   static   string  GetTasksString( int  TaskId)
        
{
            
using (OleDbConnection conn = new OleDbConnection(ConfigurationManager.ConnectionStrings["Link"].ConnectionString))
            
{
                conn.Open();
                
return "[" + GetTasksString(TaskId, conn) + "]";
            }
 
        }


        
private   static   string  GetTasksString( int  TaskId, OleDbConnection conn)
        
{
            OleDbCommand comm 
= new OleDbCommand("select * from [Tasks] where ParentID=" + TaskId, conn);
            OleDbDataReader red 
= comm.ExecuteReader();
            
if (!red.Read()) return string.Empty;

            StringBuilder str 
= new StringBuilder();
            
do
            
{
                str.Append(
"{");
                
for (int i = 0; i < red.FieldCount; i++)
                
{
                    
if (i != 0) str.Append(",");
                    str.Append(red.GetName(i));
                    str.Append(
":'");
                    str.Append(red.GetString(i));
                    str.Append(
"'");
                }

                str.Append(
",children:[");
                str.Append(GetTasksString(red.GetInt32(
0), conn));
                str.Append(
"]},");

            }
 while (red.Read());

            
return str[str.Length] == ',' ? str.ToString(0, str.Length - 1) : str.ToString();
        }

 

 2.为什么我总是喜欢用datatable

 

         public   static   string  GetTasks( int  TaskId)
        

            
using (OleDbConnection conn = new OleDbConnection(ConfigurationManager.ConnectionStrings["Link"].ConnectionString))
            
{
                conn.Open();
                OleDbCommand comm 
= new OleDbCommand("select * from [Tasks]", conn);
                OleDbDataAdapter ada 
= new OleDbDataAdapter();
                DataTable table 
= new DataTable();
                ada.Fill(table);
            }

            
return "["+GetTasksString(TaskId,table)+"]";
        }


        
private   static   string  GetTasksString( int  TaskId,DataTable table)
        
{
                DataRow[] rows 
= table.Select("ParentID="+TaskId.ToString());

                
if (rows.Length == 0return string.Empty; ;
                StringBuilder str 
= new StringBuilder();
                
                
foreach(DataRow row in rows)
                
{
                    str.Append(
"{");
                    
for (int i = 0; i < row.Table.Columns.Count; i++)
                    
{
                        
if(i!=0)str.Append(",");
                        str.Append(row.Table.Columns[i].ColumnName);
                        str.Append(
":'");
                        str.Append(row[i].ToString());
                        str.Append(
"'"); 
                    }

                    str.Append(
",children:[");
                    str.Append(GetTasksString((
int)row["TaskID"],table));
                    str.Append(
"]},");
                }

                
return str[str.Length] == ',' ? str.ToString(0, str.Length - 1) : str.ToString();
            
        }
GitHub 加速计划 / js / json
41.72 K
6.61 K
下载
适用于现代 C++ 的 JSON。
最近提交(Master分支:1 个月前 )
960b763e 2 个月前
8c391e04 5 个月前
Logo

旨在为数千万中国开发者提供一个无缝且高效的云端环境,以支持学习、使用和贡献开源项目。

更多推荐