C# 使用DataTable值插入到另一个DataTable中

C# 使用DataTable值插入到另一个DataTable中,c#,datatable,C#,Datatable,请原谅我讨厌的方法:我无法在SQL中做到这一点(因为我的使用是动态的,我对SQL的方式不够精通,无法让它创建我想要/需要的动态输出)或EF,因为我无法让它工作,原因不明(如果任何人有一个例子可以帮助初学者使用EF和DataTables,请分享) 我有一个数据表(dt),其中包含我试图提取、计算并输入到另一个数据表(fDt)中的值 dt示例: +-------------------------------------------------------+ |ID |客户名称| 201501 |

请原谅我讨厌的方法:我无法在SQL中做到这一点(因为我的使用是动态的,我对SQL的方式不够精通,无法让它创建我想要/需要的动态输出)或EF,因为我无法让它工作,原因不明(如果任何人有一个例子可以帮助初学者使用EF和DataTables,请分享)

我有一个数据表(
dt
),其中包含我试图提取、计算并输入到另一个数据表(
fDt
)中的值

dt
示例:

+-------------------------------------------------------+
|ID |客户名称| 201501 | 201502 | 201503 | 201504 ||
+-------------------------------------------------------+
|32 | CustOne | 100.00 | 200.00 | 400.00 | 700.00 ||
|56 | CustTwo | | | | | 500.00 ||
|89 | CustThree | 222.22 | 333.33 | 444.44 | 555.55 ||
| .. | ...      |   ..   |   ..   |   ..   |   ..   | ..|
+-------------------------------------------------------+
我想在计算中使用
CustName
之后的值

然后,计算得出上表中两列之间的百分比差:

+-------------------------------------------------------+
|ID | CustName | PerDiff02 | PerDiff03 | PerDiff04 ||
+-------------------------------------------------------+
|32 | CustOne | 0 | 100 | 200 ||
|56 | CustTwo | | | 85.00 ||
|89 | CustThree | 66.66 | 75.00 | 80.00 ||
| .. | ...      |   ....    |    ....   |    ....   | ..|
+-------------------------------------------------------+
(这些百分比是伪造的,但它们表明了我正在努力实现的目标。)

PerDiff
s应从所示的第二个月开始(
201502
)并持续到当前

我相信我已经做到了这一点,但是我现在使用的代码:

for (i = 2; i <= (dt.Columns.Count - 2); i++)
{
    for (int j = 0; j < (dt.Columns.Count); j++)
    {
        //decimal? month1 = dt.Rows[i].Field<decimal?>(j);
        //decimal? month2 = dt.Rows[i].Field<decimal?>(j + 2);

        decimal? month1 = (decimal?)dt.Rows[i][j];
        decimal? month2 = (decimal?)dt.Rows[i][j + 2];

        fDt.Rows[i][j - 1] = ((month1 - month2) / month1) * 100;

    }            
} 
请尝试以下操作:

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Data;

namespace ConsoleApplication1
{
    class Program
    {
        static void Main(string[] args)
        {
            DataTable dt = new DataTable();
            dt.Columns.Add("ID", typeof(int));
            dt.Columns.Add("CustName", typeof(string));
            dt.Columns.Add("201501", typeof(decimal));
            dt.Columns.Add("201502", typeof(decimal));
            dt.Columns.Add("201503", typeof(decimal));
            dt.Columns.Add("201504", typeof(decimal));

            dt.Rows.Add(new object[] {32, "CustOne",100.00, 200.00, 400.00, 700.00});
            dt.Rows.Add(new object[] {56, "CustTwo", 100.00 , 200.00 , 300.00, 500.00});
            dt.Rows.Add(new object[] {89, "CustThree", 222.22 ,333.33, 444.44, 555.55});

            DataTable dt2 = new DataTable();
            dt2.Columns.Add("ID", typeof(int));
            dt2.Columns.Add("CustName", typeof(string));
            for (int i = 2; i < dt.Columns.Count - 1; i++)
            {
                dt2.Columns.Add("PerDiff" + (i).ToString("0#"), typeof(decimal));
            }

            foreach (DataRow row in dt.AsEnumerable())
            {
                DataRow newRow = dt2.Rows.Add();
                newRow["ID"] = row.Field<int?>("ID");
                newRow["CustName"] = row.Field<string>("CustName");
                for (int i = 2; i < dt.Columns.Count - 1; i++)
                {
                    newRow[i] = row.Field<decimal?>(i + 1) / row.Field<decimal?>(i);
                }
            }


        }
    }
}
使用系统;
使用System.Collections.Generic;
使用System.Linq;
使用系统文本;
使用系统数据;
命名空间控制台应用程序1
{
班级计划
{
静态void Main(字符串[]参数)
{
DataTable dt=新的DataTable();
添加(“ID”,typeof(int));
添加(“客户名称”,类型(字符串));
dt.列。添加(“201501”,类型(十进制));
dt.列。添加(“201502”,类型(十进制));
dt.列。添加(“201503”,类型(十进制));
dt.列。添加(“201504”,类型(十进制));
添加(新对象[]{32,“CustOne”,100.00,200.00,400.00,700.00});
Add(新对象[]{56,“custwo”,100.00,200.00,300.00,500.00});
添加(新对象[]{89,“CustThree”,222.22333.33444.44555.55});
DataTable dt2=新的DataTable();
dt2.Columns.Add(“ID”,typeof(int));
dt2.Columns.Add(“CustName”,typeof(string));
对于(int i=2;i
我认为这里的主要问题是循环索引和条件错误,这导致在检索数据时强制转换无效。您有以下代码:

for (i = 2; i <= (dt.Columns.Count - 2); i++)
{
    for (int j = 0; j < (dt.Columns.Count); j++)
    {
        //decimal? month1 = dt.Rows[i].Field<decimal?>(j);
        //decimal? month2 = dt.Rows[i].Field<decimal?>(j + 2);

        decimal? month1 = (decimal?)dt.Rows[i][j];
        decimal? month2 = (decimal?)dt.Rows[i][j + 2];

        fDt.Rows[i][j - 1] = ((month1 - month2) / month1) * 100;
    }            
} 

第二个表已经存在并且您正在尝试填充它,或者您正在尝试从第一个表创建它?@BrianRogers,第二个表已经存在并且需要前两列数据(ID、CustName)其余列所需的列标题都已创建。感谢您的回答!我应用了您的
foreach
,因为这似乎是我唯一需要添加的内容(我现在已将我的完整方法添加到帖子中)。您的
foreach
给出的
指定转换在
新行上无效
错误[“ID”]=row.Field(“ID”);
line谢谢!这似乎100%有效!我已经为此工作了几个月了!(我是一名初级开发人员,有点被扔进去了,有太多的小错误,我都看过头了!)谢谢你花时间在这个答案上并提供帮助!我的支持太多了!
for (i = 2; i <= (dt.Columns.Count - 2); i++)
{
    for (int j = 0; j < (dt.Columns.Count); j++)
    {
        //decimal? month1 = dt.Rows[i].Field<decimal?>(j);
        //decimal? month2 = dt.Rows[i].Field<decimal?>(j + 2);

        decimal? month1 = (decimal?)dt.Rows[i][j];
        decimal? month2 = (decimal?)dt.Rows[i][j + 2];

        fDt.Rows[i][j - 1] = ((month1 - month2) / month1) * 100;
    }            
} 
public DataTable GetPerDiff(DataTable dt)
{
    var fDt = new DataTable();

    // Copy columns for customer name and ID
    fDt.Columns.Add(dt.Columns[0].ColumnName, dt.Columns[0].DataType);
    fDt.Columns.Add(dt.Columns[1].ColumnName, dt.Columns[1].DataType);

    // Create the PerDiff columns
    for (int j = 2; j < dt.Columns.Count - 1; j++)
    {
        string colName = "PerDiff" + dt.Columns[j + 1];
        fDt.Columns.Add(colName, dt.Columns[j + 1].DataType);
    }

    for (int i = 0; i < dt.Rows.Count; i++)
    {
        fDt.Rows.Add(dt.Rows[i][0], dt.Rows[i][1]);

        for (int j = 2; j < dt.Columns.Count - 1; j++)
        {
            decimal? month1 = dt.Rows[i].Field<decimal?>(j);
            decimal? month2 = dt.Rows[i].Field<decimal?>(j + 1);

            if (month1 != decimal.Zero)
            {
                fDt.Rows[i].SetField(j, (month2 - month1) / month1 * 100);
            }
        }
    }
    return fDt;
}