一个DataSet内进行数据操作的问题

yayx 2007-06-16 11:22:37
现在在DataSet内已经得到一张数据表 举例如下

userID Fields Content
2 A 2Adata
2 B 2Bdata
3 A 3Adata
3 B 3bData
4 C 4cData
原始表就是这样了

想这样显示出来
UserId A B C
2 2Adata 2Bdata
3 3Adata 3bData
4 4cData

根据Fields字段中不同字段数自动建立列,根据UserID的不同ID数建立行,最后填入数据
没有的数据就空或者默认一个数据
可以保证UserID和Fields的对应不会出现重复
希望能直接在DataSet里操作获得新的表,因为上面的原始数据来自XML和数据库,已经是整合过的了...
数据量不算特别大,顶多几百条,试问下如何用DataSet的到下面的表,或者有没有其他更好的一些办法~

感觉这应该是个老问题了,也感谢能提供任何源码~~~
...全文
342 18 打赏 收藏 转发到动态 举报
写回复
用AI写文章
18 条回复
切换为时间正序
请发表友善的回复…
发表回复
v5 2011-12-01
  • 打赏
  • 举报
回复
day day up!
Jinglecat 2007-06-17
  • 打赏
  • 举报
回复
@sp1234(音乐让我糊涂)

甚至不用进行数据库查询计算
--------------------------------
1。
我在想 数据库计算 难道是在硬盘上执行的?

2。
当然,不管怎样,我在 “数据库中计算” 也好, 在 “应用程序服务器中计算” 也好,这些数据,都要通过数据库查询出来吧?

3。
一般讲,
“数据库中计算” 基于 集合 吧? 当然,使用 游标 之类,就是我们避而远之的 迭代 了
“应用程序服务器中计算” 基于 迭代 吧?

4。
还是有待具体的测试
xiaoliangwh 2007-06-17
  • 打赏
  • 举报
回复
up
yayx 2007-06-17
  • 打赏
  • 举报
回复
问题是解决了,写几个迭代解决的,还不是特别麻烦
感谢Jinglecat(晓风残月) 的文章。。。

现在性能方面似乎更需要讨论了,我觉得筛选数据的工作还是SQL做起来快,使用Dataset来做,好处应该就是离线搜索,减轻数据库服务器压力吧
想进行一些真实的测试
lonehare 2007-06-17
  • 打赏
  • 举报
回复
DataView oldView = new DataView(oldData.Tables[0]);
oldView.sort = "Fields";
// 建立新的DataSet及DataTable
DataSet ......;
....;
// 获取新的DataTable的引用
DataTable tb = .....;
// 添加userid列
tb.Columns.Add(....);
// 建立新的表结构
string tmpField = "";
for (int i = 0; i < oldView.Count; i++)
{
string f = oldView[i]["Fields"].ToString().Trim().ToLower();
if (f != tmpField)
{
tb.Columns.Add(f);
tmpField = f;
}
}
// 将userid作为主键填充新的数据集
......(代码略)
  • 打赏
  • 举报
回复
内存中的计算比通过SQL Server至少会快100倍,使用数据库来计算太奢侈了。
  • 打赏
  • 举报
回复
直接的写法:

private DataTable cst(DataTable t)
{
DataTable r = new DataTable();
DataColumn c = t.Columns["userID"];
DataColumn d = t.Columns["Content"];
DataColumn e = t.Columns["Fields"];
if (e.DataType != typeof(string))
throw new Exception("字段Fields必须是字符串。");

r.Columns.Add(new DataColumn("userID", c.DataType));
foreach (DataRow dr in t.Rows)
{
DataColumn fc = null;
int n = r.Columns.IndexOf((string)dr["Fields"]);
if (n < 0)
{
fc = new DataColumn((string)dr["Fields"], d.DataType);
r.Columns.Add(fc);
}
else
fc = r.Columns[n];
DataRow fr = null;
foreach (DataRow x in r.Rows)
if (x[0].Equals(dr[c]))
{
fr = x;
break;
}
if (fr == null)
{
fr = r.NewRow();
fr[0] = dr[c];
r.Rows.Add(fr);
}

fr[fc] = dr[d];
}
return r;
}
Jinglecat 2007-06-16
  • 打赏
  • 举报
回复
看看我的两个 DEMO,
这里,你可以选择方法 1 了,
如有可能,还是用 2 效率高些

1.
交叉表的简单实现2:使用前端程序实现
http://www.cnblogs.com/Jinglecat/archive/2007/05/24/757919.html

2.
交叉表的简单实现1:使用存储过程 http://www.cnblogs.com/Jinglecat/archive/2007/05/23/756427.html
amandag 2007-06-16
  • 打赏
  • 举报
回复
貌似没有简单的办法,DataTable不能用SQL的查询..
wzd24 2007-06-16
  • 打赏
  • 举报
回复
源码没有,思路有一个:

先New一个新的Table,再创建UserId列,然后遍历Fields字段,逐个创建列,
再遍历UserID字段,插入所有不重复的UserID数据,最后遍历Content,根据对应的UserID和Fields插入到指定的位置!
lnwuyaowei 2007-06-16
  • 打赏
  • 举报
回复
交差表交给sql处理会容易一些,如果非得用代码处理,那么写循环是必不可少的了,慢慢写吧.
hrjdt61144 2007-06-16
  • 打赏
  • 举报
回复
看了一下 不会 呵呵 偶是新手 一起学习
hrjdt61144 2007-06-16
  • 打赏
  • 举报
回复
sf
linlinselina 2007-06-16
  • 打赏
  • 举报
回复
某大型外资IT公司广州公司招聘,ASP.NET工程师.
2年以上相关工作经验.良好的教育背景.
有朋友CV请推荐:Selina@mst.com.cn
msn:lin830413@hotmail.com
  • 打赏
  • 举报
回复
你把从xml中的100多条DataRow写入数据库表,然后使用复杂的多个select,然后取出来,然后删除表中数据?

甚至不用进行数据库查询计算,我相信仅删除原有数据、写入和读出记录,就比内存中计算出结果慢很多。

另外,你如何防范多个计算并行时对数据库设计的限制情况呢?
MicroDeviser 2007-06-16
  • 打赏
  • 举报
回复
学习
yayx 2007-06-16
  • 打赏
  • 举报
回复
@ Jinglecat(晓风残月)
正在看你的sample...还有期待测试
理论上讲应该是内存计算快,但是这种情况需要大量的迭代,里面可以优化的地方很多,sql做了大量优化工作,但是自己迭代可能有大量冗余计算...其实这个问题用一堆循环慢慢做不麻烦,但是我很担心性能问题

@wzd24(牧野)(衣带渐宽终不悔,为伊消得人憔悴)
我担心这样做的性能问题....
Jinglecat 2007-06-16
  • 打赏
  • 举报
回复
内存中的计算比通过SQL Server至少会快100倍,使用数据库来计算太奢侈了。
------------
这里我会去作个测试,特别是对于动态交叉的情况

62,046

社区成员

发帖
与我相关
我的任务
社区描述
.NET技术交流专区
javascript云原生 企业社区
社区管理员
  • ASP.NET
  • .Net开发者社区
  • R小R
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

.NET 社区是一个围绕开源 .NET 的开放、热情、创新、包容的技术社区。社区致力于为广大 .NET 爱好者提供一个良好的知识共享、协同互助的 .NET 技术交流环境。我们尊重不同意见,支持健康理性的辩论和互动,反对歧视和攻击。

希望和大家一起共同营造一个活跃、友好的社区氛围。

试试用AI创作助手写篇文章吧