为什么将int从SqlDataReader转换为long导致InvalidCastException?

时间:2013-12-05 17:17:54

标签: c# c#-4.0 ssis ssis-2012

我在以下行获得了无效的强制转换例外:

DestMinSeq = (long)rdr["MinSeq"];

当我更改查询以将MinSeq强制转换为BIGINT而不是INT时,它可以正常工作。

问题:为什么将短线投射到长线是违法的?

环境:

VS 2012 SSIS project script task. 
ADO.NET connection manager. 
SQL Server 2012.

2 个答案:

答案 0 :(得分:6)

  

问题:为什么将短线投射到长线是违法的?

您正试图将盒装短片投射到很长时间。你可以在没有数据库的情况下看到这个:

int x = 10;
object o = x;
long y = (long) o; // Bang!

如果你在拆箱时转换为正确的类型,然后转换为你真正想要的类型,那很好:

DestMinSeq = (long)(int)rdr["MinSeq]";

(我怀疑你想要int而不是short,但你必须检查。)

答案 1 :(得分:3)

问题是rdr["MinSeq"]属于object类型(实际上是int作为对象加框)。当您尝试将object强制转换为long时,它会为您提供无效的强制转换,因为编译器不能简单地将<{1}}类型的对象转换为其他内容而不是实际的盒装类型(在这种情况下是object)。

你可以试试这个,

int

或@Jon Skeet所建议的,实际上看起来更漂亮,

 DestMinSeq = Convert.ToInt64(rdr["MinSeq"]);