【发布时间】:2012-03-27 08:10:15
【问题描述】:
早安,
IDE Visual Studio 2010
.NET 3.5
平台 WinForms
SO 问题“difference between getting value from DataRow”指代。
我有一个包含[ID] INT IDENTITY(1, 1) NOT NULL PRIMARY KEY 列的数据库表。查询此表并将值存储在局部变量中时,我得到一个无效的强制转换异常;示例代码:
string sQuery = @"
SELECT [ID], [Description]
FROM [Sources]
ORDER BY [Description] ";
using (DataTable dtSources = SQLHelper.Fetch(sQuery))
{
foreach (DataRow drSource in dtSources.Rows)
{
int iID = drSource.Field<int>("ID"); // InvalidCastException
string sDescrption = drSource.Field<string>("Description");
}
}
当单步执行并在故障行上执行“快速监视”时,我发现通过将行更改为drSource.Field<object>("ID"),单元格值类型是short 而不是int。为什么会发生这种情况,在表定义中,这显然是 int?此外,short 应该隐式转换为int,因为short 更小并且应该“适合”对吗?
【问题讨论】:
-
drSource.Field
("ID")。试试这个,让我知道。 -
你试过了吗?有效吗?
-
请参阅下面的评论 - 您实际上有查询返回的 DbNull 值。所以,数据问题,而不是 Field
扩展。 -
大家提供了有用的信息,谢谢。在这种情况下,诸如
int iID = (int)drSource["ID"];或int iID = Convert.ToInt32(drSource["ID"]);之类的“不那么强”转换可以解决问题(因为int iID = drSource.Field<int>("ID");甚至不允许将short 隐式转换为int),但事先检查“可转换性”会可能也是个好主意。 -
其实如果字段类型很短,需要使用Field
("ID")。顺便说一句,为什么它很短,如果在数据库中(如你提供的那样)你有 int,而不是小的 int。