我在以下行获得了无效的强制转换例外:
DestMinSeq = (long)rdr["MinSeq"];
当我更改查询以将MinSeq强制转换为BIGINT而不是INT时,它可以正常工作。
问题:为什么将短线投射到长线是违法的?
环境:
VS 2012 SSIS project script task.
ADO.NET connection manager.
SQL Server 2012.
答案 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"]);