这种树状表挺普遍的,和大家探讨下,挺喜欢递归方式读取这表,以前写过个递归读取用户控件生成管理这种表数据的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 == 0) return 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();
}