无法添加/合并多个DataTable以及不同的行数

时间:2014-08-18 21:38:48

标签: c# sql datatable merge dataset

我目前有一个为2012年以来每年创建数据集的流程。每个数据集都有4个数据表。 2012年的Datatable 1与2013年的Datatable 1结构相同,与2014年的Datatable 1相同。

我需要执行以下操作(这显然无效 - 只是一种表示形式):

DsTotals.Tables[0] = Ds2012.Tables[0] + Ds2013.Tables[0] + Ds2014.Tables[0];

DsTotals.Tables[1] = Ds2012.Tables[1] + Ds2013.Tables[1] + Ds2014.Tables[1];

DsTotals.Tables[2] = Ds2012.Tables[2] + Ds2013.Tables[2] + Ds2014.Tables[2];

etc.

我目前正在实现这一目标:

Year = Convert.ToInt32(DateTime.Now.Year);
 while (2012 <= Year)
{
    var Main = new DataSet();
    var DsT = DataAccess.GetNumbers(ByReferral, Year.ToString());
    //gets table 1 for year
    var DsT1 = DataAccess.GetNumbers(BySource, Year.ToString());
    //gets table 2 for year
    var DsT2 = DataAccess.GetNumbers(ByMedium, Year.ToString());
    //gets table 3 for year
    var DsT3 = DataAccess.GetNumbers(ByCampaign, Year.ToString());
    //gets table 4 for year

        var TableNumber = 0;
        foreach (DataTable table in DsT.Tables)
        {
            var Copy = table.Copy();
            Copy.TableName = "Table" + TableNumber.ToString();
            Main.Tables.Add(Copy);
            TableNumber++;
        }
        foreach (DataTable table in DsT1.Tables)
        {
            var Copy = table.Copy();
            Copy.TableName = "Table" + TableNumber.ToString();
            Main.Tables.Add(Copy);
            TableNumber++;
        }
        foreach (DataTable table in DsT2.Tables)
        {
            var Copy = table.Copy();
            Copy.TableName = "Table" + TableNumber.ToString();
            Main.Tables.Add(Copy);
            TableNumber++;
        }
        foreach (DataTable table in DsT3.Tables)
        {
            var Copy = table.Copy();
            Copy.TableName = "Table" + TableNumber.ToString();
            Main.Tables.Add(Copy);
            TableNumber++;
        }
        Process.Ds = Main;
        //global DataSet Variable

    var GrandTotalData = AddUpData(DsT, DsT1, DsT2, DsT3, Process.Ds, Year);
    Year--;
}

private static DataSet AddUpData(DataSet DsT, DataSet Ds1, DataSet Ds2, DataSet Ds3, DataSet Ds, int Year)
{

    if (Ds.Tables[0].Rows.Count < DsT.Tables[0].Rows.Count)
    {
        for (var i = 0; i < Ds.Tables[0].Rows.Count; i++)
        {
            Processful(i, DsT, TableInt: 0, TableNumber: 0);
        }

    }
    else if (Ds.Tables[0].Rows.Count > DsT.Tables[0].Rows.Count)
    {
        for (var i = 0; i < DsT.Tables[0].Rows.Count; i++)
        {
            Processful(i, DsT, TableInt: 0, TableNumber: 0);
        }
    }
    else
    {
        for (var i = 0; i < DsT.Tables[0].Rows.Count; i++)
        {
            Processful(i, DsT, TableInt: 0, TableNumber: 0);
        }

    }

    if (Ds.Tables[1].Rows.Count < DsT.Tables[1].Rows.Count)
    {
        for (var i = 2; i < Ds.Tables[1].Rows.Count; i++)
        {
            Processful(i, DsT, TableInt: 1, TableNumber: 1);
        }
    }
    else if (Ds.Tables[1].Rows.Count > DsT.Tables[1].Rows.Count)
    {
        for (var i = 2; i < DsT.Tables[1].Rows.Count; i++)
        {
            Processful(i, DsT, TableInt: 1, TableNumber: 1);
        }
    }
    else
    {
        for (var i = 2; i < DsT.Tables[1].Rows.Count; i++)
        {
            Processful(i, DsT, TableInt: 1, TableNumber: 1);
        }

    }

    if (Ds.Tables[2].Rows.Count < DsT.Tables[2].Rows.Count)
    {
        for (var i = 2; i < Ds.Tables[2].Rows.Count; i++)
        {
            Processful(i, DsT, TableInt: 2, TableNumber: 2);
        }

    }
    else if (Ds.Tables[2].Rows.Count > DsT.Tables[2].Rows.Count)
    {
        for (var i = 2; i < DsT.Tables[2].Rows.Count; i++)
        {
            Processful(i, DsT, TableInt: 2, TableNumber: 2);
        }

    }
    else
    {
        for (var i = 2; i < DsT.Tables[2].Rows.Count; i++)
        {
            Processful(i, DsT, TableInt: 2, TableNumber: 2);
        }

    }

        if (Ds.Tables[3].Rows.Count < Ds1.Tables[0].Rows.Count)
        {
            for (var i = 0; i < Ds.Tables[3].Rows.Count; i++)
            {
                Processful(i, Ds1, TableInt: 3, TableNumber: 0);
            }
        }
        else if (Ds.Tables[3].Rows.Count > Ds1.Tables[0].Rows.Count)
        {
            for (var i = 0; i < Ds1.Tables[0].Rows.Count; i++)
            {
                Processful(i, Ds1, TableInt: 3, TableNumber: 0);
            }

        }
        else
        {
            for (var i = 0; i < Ds1.Tables[0].Rows.Count; i++)
            {
                Processful(i, Ds1, TableInt: 3, TableNumber: 0);
            }

        }

依此类推,这种方法以相同的方式对所有12个表执行此操作。

private static void Processful(int i, DataSet DsT, int TableInt = 50, int TableNumber = 50)
        {

                    Process.Ds.Tables[TableInt].Rows[i][1] = (Convert.ToDecimal(Process.Ds.Tables[TableInt].Rows[i][1].ToString()) + Convert.ToDecimal(DsT.Tables[TableNumber].Rows[i][1].ToString())).ToString();
                    Process.Ds.Tables[TableInt].Rows[i][2] = (Convert.ToDecimal(Process.Ds.Tables[TableInt].Rows[i][2].ToString()) + Convert.ToDecimal(DsT.Tables[TableNumber].Rows[i][2].ToString())).ToString();
                    Process.Ds.Tables[TableInt].Rows[i][3] = (Convert.ToDecimal(Process.Ds.Tables[TableInt].Rows[i][3].ToString()) + Convert.ToDecimal(DsT.Tables[TableNumber].Rows[i][3].ToString())).ToString();
                    Process.Ds.Tables[TableInt].Rows[i][4] = (Convert.ToDecimal(Process.Ds.Tables[TableInt].Rows[i][4].ToString()) + Convert.ToDecimal(DsT.Tables[TableNumber].Rows[i][4].ToString())).ToString();
                    Process.Ds.Tables[TableInt].Rows[i][5] = (Convert.ToDecimal(Process.Ds.Tables[TableInt].Rows[i][5].ToString()) + Convert.ToDecimal(DsT.Tables[TableNumber].Rows[i][5].ToString())).ToString();
                    Process.Ds.Tables[TableInt].Rows[i][6] = (Convert.ToDecimal(Process.Ds.Tables[TableInt].Rows[i][6].ToString()) + Convert.ToDecimal(DsT.Tables[TableNumber].Rows[i][6].ToString())).ToString();
                    Process.Ds.Tables[TableInt].Rows[i][7] = (Convert.ToDecimal(Process.Ds.Tables[TableInt].Rows[i][7].ToString()) + Convert.ToDecimal(DsT.Tables[TableNumber].Rows[i][7].ToString())).ToString();
                    Process.Ds.Tables[TableInt].Rows[i][8] = (Convert.ToDecimal(Process.Ds.Tables[TableInt].Rows[i][8].ToString()) + Convert.ToDecimal(DsT.Tables[TableNumber].Rows[i][8].ToString())).ToString();
                    Process.Ds.Tables[TableInt].Rows[i][9] = (Convert.ToDecimal(Process.Ds.Tables[TableInt].Rows[i][9].ToString()) + Convert.ToDecimal(DsT.Tables[TableNumber].Rows[i][9].ToString())).ToString();
                    Process.Ds.Tables[TableInt].Rows[i][10] = (Convert.ToDecimal(Process.Ds.Tables[TableInt].Rows[i][10].ToString()) + Convert.ToDecimal(DsT.Tables[TableNumber].Rows[i][10].ToString())).ToString();
                    Process.Ds.Tables[TableInt].Rows[i][11] = (Convert.ToDecimal(Process.Ds.Tables[TableInt].Rows[i][11].ToString()) + Convert.ToDecimal(DsT.Tables[TableNumber].Rows[i][11].ToString())).ToString();
                    Process.Ds.Tables[TableInt].Rows[i][12] = (Convert.ToDecimal(Process.Ds.Tables[TableInt].Rows[i][12].ToString()) + Convert.ToDecimal(DsT.Tables[TableNumber].Rows[i][12].ToString())).ToString();
                    Process.Ds.Tables[TableInt].Rows[i][13] = (Convert.ToDecimal(Process.Ds.Tables[TableInt].Rows[i][13].ToString()) + Convert.ToDecimal(DsT.Tables[TableNumber].Rows[i][13].ToString())).ToString();
                    Process.Ds.Tables[TableInt].Rows[i][14] = (Convert.ToDecimal(Process.Ds.Tables[TableInt].Rows[i][14].ToString()) + Convert.ToDecimal(DsT.Tables[TableNumber].Rows[i][14].ToString())).ToString();

                }

processful方法只是将所有数据添加到Global DataSet变量中。

现在这种方法确实有效,如果所有表都有相同数量的列和相同的行。幸运的是,我的表格具有相同数量的列。列数是常数。然而,每年都有不同的行数。因此,对于表0,它列出了所有可能的推荐位置,例如:Google,Facebook,Blog等。它对表1,2,3做了类似的事情。但是每年,甚至每月,可能会添加另一行。因此,现在2014年的表0有3个其他推荐类型,或者可能是3个新推荐类型和1个不再存在,即:Twitter,Pinterest,Bing现在在行中但是Blog不再是今年的推荐。

我需要一种更强大的方法来将数据表添加到一起,这样如果一个数据表有30行而另一个有15行,它会将匹配的数据加在一起,而将其他数据单独添加。最后,全局数据集变量将具有所有年份的总计,并且将包含4个表。它将在表0中包含2012年,2013年,2014年等所有推荐,但只有在推荐仍然存在的情况下才会添加数字。

所有Total数据都被写入电子表格(此部分已被处理)。因此,一旦全部累计起来,它将在电子表格中相应地更新行,并在必要时添加任何行。

以下是2012年表0的样子(虚拟数据,实际架构)的快照:

    Source  Jan Feb Mar Apr May Jun Jul Aug Sep Oct Nov Dec Average Median  Total
            8.0 8.0 4.0 4.0 22.03.0 2.0 0.0 0.0 0.0 0.0 0.0  4.3     2.5    51.0
    blog    2.0 1.0 0.0 1.0 0.0 0.0 1.0 0.0 0.0 0.0 0.0 0.0  0.4     0.0    5.0
   Facebook 13.05.0 12.015.064.08.0 14.00.0 0.0 0.0 0.0 0.0  10.9    6.5    131.0
    Forum   0.0 0.0 0.0 1.0 15.02.0 2.0 0.0 0.0 0.0 0.0 0.0  1.7     0.0    20.0
    Google  0.0 0.0 0.0 0.0 1.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0  0.1     0.0    1.0

继续这样并以(中位数,平均值,总数在源列下)结束:

   Median   2   1   1    1   6   1   1   0   0   0   0   0    1       0.0   0.0
   Average  13. 5.8 6.8 5.7 23.2 5.8 5.3 0.0 0.0 0.0 0.0 0.0 5.5      0.0   0.0
   Total    245 40  122 103 417 105 96  0   0   0   0   0     0        0    0

另外值得注意的是,DataTables是已在SQL中转动的表(因此如上所述)

0 个答案:

没有答案