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

C# 为什么将int从SqlDataReader转换为long会导致InvalidCastException?,c#,c#-4.0,ssis,ssis-2012,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. 问:为什么从短到长是非法的 你想把盒装的短装换成长装。您可以在没有数据库的情况下看到这一点: int x = 10

我在以下行中得到一个无效的强制转换异常:

DestMinSeq = (long)rdr["MinSeq"];
当我将查询改为将MinSeq转换为BIGINT而不是INT时,它就工作了

问:为什么从短到长是非法的

环境:

VS 2012 SSIS project script task. 
ADO.NET connection manager. 
SQL Server 2012.
问:为什么从短到长是非法的

你想把盒装的短装换成长装。您可以在没有数据库的情况下看到这一点:

int x = 10;
object o = x;
long y = (long) o; // Bang!
如果在取消装箱时强制转换为正确的类型,然后强制转换为您真正想要的类型,则可以:

DestMinSeq = (long)(int)rdr["MinSeq]";
(我想您想要的是
int
而不是
short
,但您必须检查。)

问:为什么从短到长是非法的

你想把盒装的短装换成长装。您可以在没有数据库的情况下看到这一点:

int x = 10;
object o = x;
long y = (long) o; // Bang!
如果在取消装箱时强制转换为正确的类型,然后强制转换为您真正想要的类型,则可以:

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

(我想你想要的是
int
而不是
short
,但你必须检查一下。)

问题是
rdr[“MinSeq”]
对象的类型(实际上是作为对象装箱的
int
)。当您尝试将
对象
强制转换为
时,它会给您一个无效的强制转换,因为编译器不能简单地将
对象
类型的对象强制转换为实际装箱类型以外的对象(在本例中为
int

你可以试试这个

 DestMinSeq = Convert.ToInt64(rdr["MinSeq"]);
或者@Jon Skeet所建议的,实际上看起来更花哨

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

问题在于
rdr[“MinSeq”]
属于
object
类型(实际上是作为对象装箱的
int
)。当您尝试将
对象
强制转换为
时,它会给您一个无效的强制转换,因为编译器不能简单地将
对象
类型的对象强制转换为实际装箱类型以外的对象(在本例中为
int

你可以试试这个

 DestMinSeq = Convert.ToInt64(rdr["MinSeq"]);
或者@Jon Skeet所建议的,实际上看起来更花哨

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

我真的需要一段时间。查询结果可以来自两个数据库版本,其中一个数据库版本的列为INT,另一个数据库版本的列为BIGINT。为了安全起见,我在查询中执行强制转换,因此它应该始终返回一个有符号的64位值。@隐喻:对,在这种情况下,您确实应该在查询中执行强制转换。但希望这能解释为什么它以前不起作用,所以这就是它。我从读者那里得到了装箱标量。我早该弄明白的。谢谢那个解决方案可能是最好的。我真的需要一个长期的。查询结果可以来自两个数据库版本,其中一个数据库版本的列为INT,另一个数据库版本的列为BIGINT。为了安全起见,我在查询中执行强制转换,因此它应该始终返回一个有符号的64位值。@隐喻:对,在这种情况下,您确实应该在查询中执行强制转换。但希望这能解释为什么它以前不起作用,所以这就是它。我从读者那里得到了装箱标量。我早该弄明白的。谢谢该解决方案实际上可能是最好的。当查询返回一个bigint时,第二个版本将失败,它确实会失败。当然,出于同样的原因,当代码返回一个
INT
时,它失败了。第一个解决方案应该处理这两种情况以及更多情况,比如标量是
字符串(表示数字的字符串)。第二个版本将在查询返回bigint时失败,它确实如此。当然,出于同样的原因,当代码返回
INT
时失败。第一种解决方案应该同时处理这两种情况以及更多情况,比如标量是
字符串(表示数字的字符串)。