繁体   English   中英

Linq To数据集错误System.InvalidCastException:指定的强制转换无效

[英]Linq To Data set error System.InvalidCastException: Specified cast is not valid

我使用Linq到数据集“ System.InvalidCastException:指定的转换无效”时出现以下异常。

问题如下,我有一个类型为int?的两个值的模型。 数据库中的值不是必需的,因此某些字段为空白。 我已将表读入数据集,现在需要使用以下代码查询数据集。

//model
public class Model
{
    // Public Properties
    ...
    ...
    ...
    public int? YearBegin { get; set; }
    public int? YearEnd { get; set; }
}

//query
var list = from m in data.Tables["Models"].AsEnumerable()
select new Model
{
   // rest of members omitted to simplify
   YearBegin = m.Field<int>("YearBegin"), 
   YearEnd =   m.Field<int>("YearEnd") 
};

我尝试了以下方法,但均未起作用:

m.Field<int?>("YearBegin")
YearEnd = m.IsNull("YearEnd") ? null, m.Field<int>("YearEnd")

还有另一种方法来检查该字段是否具有类似于String.IsNullOrEmpty()的值。 使用字符串作为类型是不可能的...

谢谢

您没有使用类型化的DataSet,所以我的第一个问题是DataTable是否知道这些字段应该为“ int”? 首先还是它们被列为字符串? 如果DataTable将这些字段视为字符串,则会遇到该错误。 以下代码假定具有Models DataRow的TestData DataSet,其中两个可空字符串列为YearBegin和YearEnd:

using (TestData ds = new TestData())
{
      // Typed Rows
      ds.Models.AddModelsRow("1", "2");
      ds.Models.AddModelsRow(ds.Models.NewModelsRow()); // NULL INFO TEST
      // Untyped rows
      DataRow r = ds.Models.NewRow();
      r[0] = "4";
      r[1] = "5";
      ds.Models.Rows.Add(r);


      //query
      var list = from m in ds.Tables["Models"].AsEnumerable()
                 select new Model
                 {
                     // rest of members omitted to simplify
                     YearBegin = m.Field<int?>("YearBegin"),
                     YearEnd = m.Field<int?>("YearEnd"),
                 };
}

该代码将遇到InvalidCastException。 但是,当我将DataTable上的类型翻转为可为null的Int32时,几乎相同的代码可以正常工作:

using (TestData ds = new TestData())
{
      // Typed Rows
      ds.Models.AddModelsRow(1, 2);
      ds.Models.AddModelsRow(ds.Models.NewModelsRow()); // NULL INFO TEST
      // Untyped rows
      DataRow r = ds.Models.NewRow();
      r[0] = 4;
      r[1] = 5;
      ds.Models.Rows.Add(r);


      //query
      var list = from m in ds.Tables["Models"].AsEnumerable()
                 select new Model
                 {
                     // rest of members omitted to simplify
                     YearBegin = m.Field<int?>("YearBegin"),
                     YearEnd = m.Field<int?>("YearEnd"),
                 };
}

看一下您的数据表。 您可以在那里改正问题。 字段转换为整数? 除非您的DataTable字段与int匹配,否则将无法正常工作? 类型。

问题已解决,我正在使用旧式访问数据库,并且数据类型存储为Integer而不是存储在Long Integer上,这意味着它在数据集中表示为Int16,因此无效的强制转换异常...

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM