指定的演员表无效 - C#

时间:2016-10-27 07:56:43

标签: c#

我在SQL Server中创建了一个表,其中OrderId列为BigInt数据类型。当我在c#中比较两个数据表时,我得到了以下错误。

  

指定演员阵容无效

代码如下。

  var idsNotInB = dt.AsEnumerable().Select(r => r.Field<long>("OrderId"))
            .Except(dt1.AsEnumerable().Select(r => r.Field<long>("OrderId")));


   DataTable TableC = (from row in dt.AsEnumerable()
                        join OrderId in idsNotInB
                        on row.Field<long>("OrderId") equals (long)OrderId
                        select row).CopyToDataTable();

请提前指导如何处理此错误。

修改

请参阅下面的图片。我使用了bigint数据类型,之后我编写了上面的c#代码。

enter image description here

2 个答案:

答案 0 :(得分:0)

尝试转换为long?而不是long。 如果列在DB中可以为空,则可能会发生这种情况,因为MZetko未正确提及

答案 1 :(得分:0)

似乎Field<T>方法在尝试从基础数据库表中取消装箱时抛出InvalidCastException。您能否检查两个表dt和dt1中的所有值是否可转换为long:

dt                  // check it also for dt1
  .AsEnumerable()
  .SelectMany(_ => _.ItemArray)
  .Select(_ => new { Value = _, Type = _.GetType() })
  .Where(_ => _.Type != typeof(long))
  .ToList()
  .ForEach(Console.WriteLine);

在这种情况下,通过转换为object然后转换为string的小问题解决方法可以提供帮助:

var idsNotInB = dt
                  .AsEnumerable()
                  .Select(_ => _.Field<object>("OrderId").ToString())
                  .Except(dt1.AsEnumerable().Select(_ => _.Field<object>("OrderId").ToString()));

DataTable TableC = dt
                     .AsEnumerable()
                     .Where(_ => idsNotInB.Contains(_.Field<object>("OrderId").ToString()))
                     .CopyToDataTable();