日期:2014-05-18  浏览次数:20460 次

DATASET 中table 合并的问题,解决者50分奉送,第一次求助
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;
       }
    }