【问题标题】:Linq To Data set error System.InvalidCastException: Specified cast is not validLinq To 数据集错误 System.InvalidCastException:指定的转换无效
【发布时间】:2012-01-15 01:19:23
【问题描述】:

我使用 Linq 对数据集“System.InvalidCastException: Specified cast is not valid.”得到以下异常。

问题如下我有一个具有两个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() 的值。 使用字符串作为类型是不可能的...

谢谢

【问题讨论】:

  • 当您尝试 'YearBegin = m.Field("YearBegin")' 时发生了什么?你有同样的错误吗?
  • 是的,同样的错误。 m.IsNull("YearEnd") 似乎也一直返回 true。
  • 虽然您的模型可能将字段作为 int,但列类型的基础数据库是什么?无效转换可能是因为您正在尝试转换不兼容的类型(例如 Oracle 喜欢将 Number 列返回为十进制)。列也可能是 Date/DateTime,在这种情况下,您需要转换为 DateTime 并提取 Year 属性。
  • 问题已解决,我正在处理旧式访问数据库,并且数据类型存储为 Integer 而不是 Long Integer,这意味着它在数据集中表示为 Int16,因此出现 Invalid cast 异常...

标签: c# .net linq dataset


【解决方案1】:

您没有使用类型化 DataSet,所以我的第一个问题是 DataTable 是否知道这些字段应该是“int”?首先,还是它们被列为字符串?如果 DataTable 将这些字段视为字符串,您将遇到该错误。下面的代码假设一个带有 Models DataRow 的 TestData 数据集,有两个可为空的字符串列作为 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"),
                 };
}

看看你的数据表。您可以在那里纠正您的问题。字段转换为int?除非您的 DataTable 字段与 int 匹配,否则将不起作用?输入。

【讨论】:

  • 我必须定义目标表中的每个字段才能使其像宣传的那样工作。我还重写了一些底层 db sql 以确保没有返回空列 - 在适当的情况下提供默认值。
【解决方案2】:

问题已解决,我正在处理旧式访问数据库,数据类型存储为 Integer 而不是 Long Integer,这意味着它在数据集中表示为 Int16,因此出现 Invalid cast 异常...

【讨论】:

    猜你喜欢
    • 2013-08-27
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多