1

我在以下行收到无效的演员表异常:

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

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

问题:为什么将空头转为多头是非法的?

环境:

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

2 回答 2

6

问题:为什么将空头转为多头是非法的?

您正在尝试将盒装短线转换为长线。您可以在没有数据库的情况下看到这一点:

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

如果您在拆箱时转换为正确的类型,然后转换为您真正想要的类型,就可以了:

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

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

于 2013-12-05T17:21:46.627 回答
3

问题在于它rdr["MinSeq"]的类型object(实际上是一个int装箱的对象)。当您尝试将其强制转换object为 along时,它会给您一个无效的强制转换,因为编译器不能简单地类型的对象object强制转换为实际装箱类型(在这种情况下int)之外的其他东西。

你可以试试这个,

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

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

 DestMinSeq = (long)(int)rdr["MinSeq"];
于 2013-12-05T17:26:13.000 回答