dataset 中有多个table tb1 tb2 tb3 tb4....,
每个表都有两个字段,第一个字段名相同,第二个字段为数据型(b1 c1 等都是数值),如下:
tb1 | tb2 .....
co1 ca |co1 cb
a1 b1 | a1 c1 .....
a2 b2 | a2 c2 ....
a3 b3 | a4 c4 ....
a4 b4 | a6 c6 ....
a5 b5 | a8 c8 .....
a7 b7 | a10 c10 .....
.....
要求:把多个table 合成一个table ,第一个字段的值相同,合为一行,其中一个表无第一个字段的值的,按0计入该列.如下示:
注:每个表的记录数据最多为30条,dataset 中的tb1...都是经过复杂sql提取出来,不要想着从sql语句着手.
合并成一个table 如tball
tball
coall1 coall2 coall3 .....
a1 b1 c1 ......
a2 b2 c2 .......
a3 b3 0 .......
a4 b4 c4 .....
a5 b5 0 .....
a6 0 c6 .....
a7 b7 0 .....
a8 0 c8 .....
a10 0 c10 .....
......
------解决方案--------------------------------------------------------
table1.Merge(table2);
------解决方案--------------------------------------------------------
多少个表就定义多少个dataTable
dt1,dt2,dt3....
前台 重构一个 datatable
------解决方案--------------------------------------------------------
你不是说在sql中实现已经不可能了吗?
那只好重新构造一个表了。
在程序中,通过判断你所知道的两个表的DataRow,来构造一个新的表的DataRow,我能想到的只有这些了。
========================
fancystyle
请问能教教我这个Merge的用法吗?
------解决方案--------------------------------------------------------
我觉得资料量不是很大吧, 30 ×(表的数量有100 吗?),对于CPU来说小意思吧,
重新构造一个表吧。
- C# code
//取得处理之后的table private DataTable GetTableByDS(DataSet das) { DataTable dt = das.Tables[0].Clone(); //记录行数最长的值 int intRowsCount = das.Tables[0].Rows.Count; //记录行数最长的那一个table 的index int indexDt = 0 ; for (int i = 1; i < das.Tables.Count; i++) { if(intRowsCount < das.Tables[i].Rows.Count) { intRowsCount = das.Tables[i].Rows.Count ; indexDt = i; } //没有重复column name 的情况下,不需要判断是否有重复的 dt.Columns.Add(das.Tables[i].Columns[1].ColumnName,typeof(Int32)); } dt.AcceptChanges(); //记录行数最长的那一个table DataTable keepDatadt = das.Tables[indexDt]; DataRow dr = null; for (int i = 0; i < intRowsCount; i++) { dt.ImportRow(keepDatadt.Rows[i]);//添加一行资料 dr =dt.Rows[i]; for (int j = 0; j < das.Tables.Count; j++) { //为每个栏位赋值 dr[j + 1] = GetNumber(das.Tables[j], dt.Columns[0].ColumnName); } } dt.AcceptChanges(); return dt; } //取得 某个栏位的值 private int GetNumber(DataTable dt, string strColumn1Value) { DataRow[] drs = dt.Select(string.Format("{0} = '{1}'", dt.Columns[0].ColumnName, strColumn1Value)); if (drs.Length > 0) { Convert.ToInt32(drs[0][1]); } else { return 0; } }