System.InvalidCastException与比较两个数据表

时间:2016-03-25 18:30:32

标签: c# database linq datatables

我在使用LINQ比较C#中的两个数据表时遇到了问题。该应用程序的目的是从3个不同的Oracle数据库中获取数据并将所述数据传输到MySQL数据库。在应用程序内部,我拉两个表并比较它们以找到MySQL表中缺少的行并添加它们。

MySQL数据库中的表使用了三个主键,因为我从中获取的数据可能包含重复项。相同的数据将发送到三个Oracle数据库中的每个数据库,但它们位于不同的环境服务器上。即(生产,登台等...)我可以通过添加环境列将所有三个放入一个数据表中,以便它们不会重复行,但是当我比较并找到缺少的行并尝试将它们复制到新数据表我总是得到无效的强制转换异常。

我从Oracle数据库中获取第一个表,然后我复制了表并设置了克隆表的DataTypes。

    o1Clone.Columns["CASEID"].DataType = typeof(Int64);
    o1Clone.Columns["CASENAME"].DataType = typeof(string);
    o1Clone.Columns["CREATEDDATE"].DataType = typeof(DateTime);
    o1Clone.Columns["STUDYMODEID"].DataType = typeof(int);
    o1Clone.Columns["ENVIRONMENT"].DataType = typeof(string);

添加DataTypes后,我将所有三个不同的数据表导入一个,并将它们与MySQL数据库进行比较。

var matched = from table1 in oClone.AsEnumerable()
                          join table2 in mClone.AsEnumerable() on table1.Field<Int64>("CASEID") equals table2.Field<Int64>("CASEID")
                          where table1.Field<string>("CASENAME") == table2.Field<string>("CASENAME") || table1.Field<DateTime>("CREATEDDATE") == table2.Field<DateTime>("CREATEDDATE") || table1.Field<int>("STUDYMODEID") == table2.Field<int>("STUDYMODEID") || table1.Field<string>("ENVIRONMENT") == table2.Field<string>("ENVIRONMENT")
                          select table1;
            var missing = from table1 in oClone.AsEnumerable()
                          where !matched.Contains(table1)
                          select table1;
            DataTable mm = missing.CopyToDataTable();

这是错误的图片: Error

我不知道为什么我收到错误,因为我确保数据类型匹配所以任何帮助都会非常感激。此外,如果有人有更好的方法这样做,而不是使用LINQ随意张贴。

1 个答案:

答案 0 :(得分:0)

经过大量的反复试验后,我找到了一个有效的解决方案。

var matched = from table1 in oClone.AsEnumerable()
              join table2 in mClone.AsEnumerable() on table1.Field<decimal>("CASEID") equals table2.Field<Int64>("CASEID")
              where table1.Field<decimal>("CASEID") == table2.Field<Int64>("CASEID") || 
              table1.Field<string>("CASENAME") == table2.Field<string>("CASENAME") || 
              table1.Field<DateTime>("CREATEDDATE") == table2.Field<DateTime>("CREATEDDATE") || 
              table1.Field<int>("STUDYMODEID") == table2.Field<int>("STUDYMODEID") || 
              table1.Field<string>("ENVIRONMENT") == table2.Field<string>("ENVIRONMENT")
              select table1;
var missing = from table1 in oClone.AsEnumerable()
              where !matched.Contains(table1)
              select table1;