DataTable多列合并问题轻松搞定_实用技巧

问题背景
在做考试系统手动生成试卷部分时由于题库的表结构不相同,导致同样的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类型。到此多列合并问题完美解决。

时间: 2024-09-14 15:58:08

DataTable多列合并问题轻松搞定_实用技巧的相关文章

GridView的CheckBox列选择及多参数传递三步搞定_实用技巧

1.GridView的列设置 复制代码 代码如下: <asp:TemplateField HeaderStyle-CssClass="check" ItemStyle-CssClass="check"> <HeaderTemplate> <input type="checkbox" onclick="selectAll(this)" /> 全选 </HeaderTemplate>

删除DataTable重复列,只删除其中的一列重复行的解决方法_实用技巧

vs2005针对datatable已经有封装好的去重复方法: 复制代码 代码如下: //去掉重复行 DataView dv = table.DefaultView; table = dv.ToTable(true, new string[] { "name", "code" });  此时table 就只有name.code无重复的两行了,如果还需要id值则  table = dv.ToTable(true, new string[] { "id"

asp.net实现导出DataTable数据到Word或者Excel的方法_实用技巧

本文实例讲述了asp.net实现导出DataTable数据到Word或者Excel的方法.分享给大家供大家参考,具体如下: /// <summary>< xmlnamespace prefix ="o" ns ="urn:schemas-microsoft-com:office:office" /> /// 导出DataTable数据到Word或者Excel /// </summary> /// <param name=&q

如何合并多个 .NET 程序集_实用技巧

任何曾今寻找过一个将多个程序合并到一个文件中的解决方案的人,可能都听说过项 ILMerge, SmartAssembly, 等这样的工具. 另外一个知名的方案是将DLL作为资源进行嵌入(如果感兴趣,这里有一篇描述这一方案的精彩文章:从嵌入的资源出载入DLL[^]). 而在某些情况中,我意识到有必要使用这些方法.如果我们有了这些汇编的源代码,我们就能通过在编译时将所有这些源代码文件导入一个项目,来获得这些东西的一个完美组合. 在这里我将尝试对如何做到这件事进行简要的描述. 为了进行演示,让我们假设

Asp.net程序优化js、css实现合并与压缩的方法_实用技巧

本文实例讲述了Asp.net程序优化js.css实现合并与压缩的方法.分享给大家供大家参考.具体实现方法如下: 访问时将js和css压缩并且缓存在客户端, 采用的是Yahoo.Yui.Compressor组件来完成的,用户可以点击此处本站下载. 创建一个IHttpHandler来处理文件 复制代码 代码如下: public class CombineFiles : IHttpHandler {         private const string CacheKeyFormat = "_Cac

.Net实现合并文件的具体方法_实用技巧

以上列表中的文件并不是来自于某个文件夹中的所有jpg文件,而是来自于 这个文件.将多个文件合并为一个文件在许多应用领域都十分有用.亲自实现这样一个程序一定不但过瘾且在许多时候可以帮助我们构建更高效的程序.这里我做了一个方案例分享给大家.由于合并后的文件就像一个包裹,所以下文中都把这样的文件称为"包文件"主构思:要把多个文件合并成一个包文件,还要可以区分其中的某个文件并提取出来.我们需要知道文件的名称和这个文件在包文件中的位置及长度,也就是所谓的地址偏移.由于包文件常常会比较大,所以不应

asp.net GridView模板列中实现选择行功能_实用技巧

大部分的功能采用通过模板列实现,为了方便选择和删除使用了它自带的功能和方法,很容易就能实现,没发现有什么大问题:但是在部署到服务器中,发现选择显示的不是文字,而是"select",也没查出是什么原因,后面不得不改为通过模板列实现. 在改为模板列实现时,发现gv_sjy_RowCommand事件里不能通过e.CommandArgument获取行的索引值,只能另想途径了,发现有两种方法可以做到: 第一种: 复制代码 代码如下: <asp:LinkButton ID="btn

SQL为查询的结果加上序号(ROW_NUMBER) 合并多个查询结果_实用技巧

原作者好像叫做topcat,我是自己理解了一下凭记忆写下来备用的. 如果使用Select Name From StudentTable,显示的结果是: Name 张三 李四 而如果使用Select ROW_NUMBER() AS ROWINDEX,Name From StudentTable,则显示的结果是 ROWINDEX Name 1 张三 2 李四 当然一般查询的结果是不需要添加编号的,因为在显示数据的时候,列表本身就有编号.但是这样做的好处就是你可以在数据库查询出多个结果集,然后通过RO

用Photoshop滤镜三分钟轻松搞定拼图

滤镜 女儿最喜欢玩拼图游戏,每次买拼图玩具的理由就是它们的画面不一样.家里的拼图玩具堆成山,可是她的兴致依然不减. 一天,我上网时无意中发现了Photoshop的一款制作拼图的滤镜--AV Bros.公司的Puzzle Pro滤镜.下载回来一试,果然效果不错!女儿喜欢的拼图玩具仅用三分钟就轻松搞定了.好东西不敢独享,下面我就给大家详细介绍一下. 首先,到http://download.sina.com.cn/cgi-bin/detail.cgi?s_id=8779去下载并安装这款滤镜,关于如何安