Linq到数据集错误系统.InvalidCastException:指定的类型转换无效

本文关键字:类型转换 无效 InvalidCastException 数据集 错误 系统 Linq | 更新日期: 2023-09-27 18:17:07

我得到以下异常使用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()的值。使用string作为类型是不可能的…

谢谢

Linq到数据集错误系统.InvalidCastException:指定的类型转换无效

你不使用类型化数据集,所以我的第一个问题是数据表知道这些字段应该是'int?’,还是它们被列为字符串?如果DataTable将这些字段作为字符串处理,您将遇到该错误。下面的代码假设TestData数据集有一个Models DataRow,有两个可空字符串列,分别是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上的类型转换为可空的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。你可以在那里改正你的问题。Field转换为int?将无法工作,除非您的DataTable字段匹配int?类型。

问题解决了,我正在针对遗留访问数据库工作,数据类型存储为Integer而不是长整数,这意味着它在数据集中表示为Int16,因此无效强制转换异常…