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作为类型是不可能的…
谢谢
你不使用类型化数据集,所以我的第一个问题是数据表知道这些字段应该是'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,因此无效强制转换异常…