DataTable多列合并问题轻松搞定
程序员文章站
2024-03-02 15:55:52
问题背景: 在做考试系统手动生成试卷部分时由于题库的表结构不相同,导致同样的gridview(已模板化后的,其结构已固定)在显示时不能同时两种不同结构的数据。如gridvi...
问题背景:
在做考试系统手动生成试卷部分时由于题库的表结构不相同,导致同样的gridview(已模板化后的,其结构已固定)在显示时不能同时两种不同结构的数据。如gridview结构如下所示:
这种固定的格式显示的是以选择题为代表的数据结构,但是因为选择题题库表结构与论述题题库表结构不相同,所以无法直接显示以论述题为代表的数据结构。这时如何在这个固定的gridview中显示不同的数据呢?其实在仔细观察后我们可以发现他们唯一的区别在于“答案”这列的数据不同,在选择题类型中,该字段的值仅为一个选项而已,但是对于论述题等类型,其问题有六个,对应的答案也应该有六列才对。分析到此,可以总结一下,最终要解决的问题是如何将六列的答案显示在一列。
解决办法:将六个字段中的内容用sql语句实现合并,将其作为一个新的字段显示出来,具体的实现请看代码:
#region 根据动态生成的数据库表名,从该表中选出questionid,chapterid,questiontypeid,point,不包括难度等级约束
/// <summary>
/// 根据动态生成的数据库表名,从该表中选出questionid,chapterid,questiontypeid,point,
/// degree,fraction,questioincontent,isvalid等内容,不包括难度等级约束
/// </summary>
/// <param name="strdatatablename"></param>
/// <returns></returns>
public datatable bindquestion(string strtablename,string strchaptername,string strquestiontypename)
{
try
{
datatable dt = new datatable ();
if (strquestiontypename != "论述题" && strquestiontypename != "案例分析题")
{
strsql = "select * from " + strtablename + " where chapterid=@chapterid and questiontypeid=@questiontypeid";
}
else
{
strsql = "select questionid,chapterid,questiontypeid,point,degree,fraction,questioncontent,cast(answer1 as nvarchar(4000)) + cast(answer2 as nvarchar(4000)) + cast(answer3 as nvarchar(4000)) + cast(answer4 as nvarchar(4000)) + cast(answer5 as nvarchar(4000)) + cast(answer6 as nvarchar(4000)) as correctanswer,isvalid from " + strtablename + " where chapterid=@chapterid and questiontypeid=@questiontypeid";
}
//strsql = "select * from " + strtablename + " where chapterid=@chapterid and questiontypeid=@questiontypeid";
sqlparameter[] paras = new sqlparameter[]{
new sqlparameter("@chapterid",strchaptername),
new sqlparameter("@questiontypeid",strquestiontypename)
};
dt = sqlhelper.executequery(strsql,paras,commandtype.text);
return dt;
}
catch
{
throw new exception("从动态生成的数据库表中获取questionid,chapterid,questiontypeid,point失败(不包括难度等级)");
}
finally
{
sqlhelper.close();
}
}
#endregion
其中使用cast函数的strsql语句所起到的作用就是将多个字段合并成一个新字段。另外需要注意的是strsql语句中的 “ + ” 号,如果需要合并的字段的内容是text类型的,是不支持该符号的,这时我们需要将其转换成nvarchar类型。到此多列合并问题完美解决。
在做考试系统手动生成试卷部分时由于题库的表结构不相同,导致同样的gridview(已模板化后的,其结构已固定)在显示时不能同时两种不同结构的数据。如gridview结构如下所示:
这种固定的格式显示的是以选择题为代表的数据结构,但是因为选择题题库表结构与论述题题库表结构不相同,所以无法直接显示以论述题为代表的数据结构。这时如何在这个固定的gridview中显示不同的数据呢?其实在仔细观察后我们可以发现他们唯一的区别在于“答案”这列的数据不同,在选择题类型中,该字段的值仅为一个选项而已,但是对于论述题等类型,其问题有六个,对应的答案也应该有六列才对。分析到此,可以总结一下,最终要解决的问题是如何将六列的答案显示在一列。
解决办法:将六个字段中的内容用sql语句实现合并,将其作为一个新的字段显示出来,具体的实现请看代码:
复制代码 代码如下:
#region 根据动态生成的数据库表名,从该表中选出questionid,chapterid,questiontypeid,point,不包括难度等级约束
/// <summary>
/// 根据动态生成的数据库表名,从该表中选出questionid,chapterid,questiontypeid,point,
/// degree,fraction,questioincontent,isvalid等内容,不包括难度等级约束
/// </summary>
/// <param name="strdatatablename"></param>
/// <returns></returns>
public datatable bindquestion(string strtablename,string strchaptername,string strquestiontypename)
{
try
{
datatable dt = new datatable ();
if (strquestiontypename != "论述题" && strquestiontypename != "案例分析题")
{
strsql = "select * from " + strtablename + " where chapterid=@chapterid and questiontypeid=@questiontypeid";
}
else
{
strsql = "select questionid,chapterid,questiontypeid,point,degree,fraction,questioncontent,cast(answer1 as nvarchar(4000)) + cast(answer2 as nvarchar(4000)) + cast(answer3 as nvarchar(4000)) + cast(answer4 as nvarchar(4000)) + cast(answer5 as nvarchar(4000)) + cast(answer6 as nvarchar(4000)) as correctanswer,isvalid from " + strtablename + " where chapterid=@chapterid and questiontypeid=@questiontypeid";
}
//strsql = "select * from " + strtablename + " where chapterid=@chapterid and questiontypeid=@questiontypeid";
sqlparameter[] paras = new sqlparameter[]{
new sqlparameter("@chapterid",strchaptername),
new sqlparameter("@questiontypeid",strquestiontypename)
};
dt = sqlhelper.executequery(strsql,paras,commandtype.text);
return dt;
}
catch
{
throw new exception("从动态生成的数据库表中获取questionid,chapterid,questiontypeid,point失败(不包括难度等级)");
}
finally
{
sqlhelper.close();
}
}
#endregion
其中使用cast函数的strsql语句所起到的作用就是将多个字段合并成一个新字段。另外需要注意的是strsql语句中的 “ + ” 号,如果需要合并的字段的内容是text类型的,是不支持该符号的,这时我们需要将其转换成nvarchar类型。到此多列合并问题完美解决。
推荐阅读