2013-03-15 52 views
3

为什么将这项工作铸造的ExecuteScalar()结果C#

int collectionCharge = (int)cmdCheck.ExecuteScalar(); 

但是这会产生一个异常

double collectionCharge = (double)cmdCheck.ExecuteScalar(); 

System.InvalidCastException:指定的转换无效。

为什么它不是有效的?

编辑 我想简单地从查询返回一个单一的结果,即得到一些运费的价格。所以我不能把它变成int,因为它必须有小数,因此试图投到double。我仍然在学习asp.net所以如果有更好的方式来实现这一目标,请点我在正确的方向:)

EDIT 2 完整的代码和SQL ...

using (SqlCommand cmdCheck = new SqlCommand("SELECT FREIGHT_PRICE FROM FREIGHT_QUOTER_BELNL_NEW WHERE CUSTOMER_NO = @CUSTOMER_NO AND COUNTRY = @COUNTRY AND ROUND(WEIGHT_FROM,0) < @WEIGHT AND ROUND(WEIGHT_TO,0) >= @WEIGHT AND SHIPVIA = '48';", connection)) 
       { 
        double collectionCharge = (double)cmdCheck.ExecuteScalar(); 
        FreightAmount = collectionCharge; 
       } 
+1

因为它返回一个int,不返回一个double? – 2013-03-15 15:06:47

+1

我不知道,但双重演员可能会让你过去:'(double)(int)cmdCheck.ExecuteScalar()'。 – neontapir 2013-03-15 15:07:05

+0

'-1'ExecuteScalar不会返回'double' [MSDN Execute Scalar](http://msdn.microsoft.com/zh-cn/library/system.data.sqlclient.sqlcommand.executescalar.aspx) – MethodMan 2013-03-15 15:09:39

回答

1

与感谢@DJKRAZE。

我将我的查询更新为SELECT CASE(FREIGHT_PRICE AS FLOAT),它现在与(双)演员一起工作。

double collectionCharge = (double)cmdCheck.ExecuteScalar(); 
+1

这是不安全的例外。看到我对JaredPar的回答的评论。请看看这个解决方案:http://stackoverflow.com/questions/870697/unable-to-cast-object-of-type-system-dbnull-to-type-system-string/870771#870771 – asawyer 2013-03-15 15:40:34

+0

斯图尔特我道歉没有提供给你一个确切的例子,但给你的示例使用Scope_Identity作为一个例子,导致你正确的解决方案.. +1为了能够得到这个工作的基础上建议 – MethodMan 2013-03-15 16:01:04

+0

@asawyer,我同意你,然而在我的情况,它是安全的空值,因为我们有一个NVL()在该视图被查询的字段,所以它永远不会为空(但0)。 – Stuart 2013-03-15 16:18:12

8

这里的问题是,ExecuteScalar正在返回一个int,它被装箱到object。为了转换为double必须先拆箱到int然后转换为double

double collectionCharge = (double)(int)cmdCheck.ExecuteScalar(); 
+0

的对象。' – asawyer 2013-03-15 15:19:39

3

使用Convert.ToXXX可以避免无效的转换异常。

IE

collectionCharge=Convert.ToDouble(cmdCheck.ExecuteScalar()); 

因为它看起来的ExecuteScalar返回一个对象这样的代码:

double collectionCharge = (double)cmdCheck.ExecuteScalar(); 

也不能正常工作

-1

我会建议使用此代码:

object o = c.ExecuteScalar(); 
    if (o != null) 
    { 
     int x = Int32.Parse(o.ToString());  
    } 

这有两件事。首先它确保你的c.ExecuteScalar()没有返回null如果它这样做了,而你试图施放,你就会遇到问题。其次,它使铸造更简单,因为它可以应用于从查询中读取时几乎所有的情况。

该对象变成一个字符串。如果你想要它作为一个字符串,你就完成了。 如果您想将它作为布尔值,请检查该字符串。等于(“真”) 如果你想把它当作一个int,Int32.Parse(string); 如果你想让它作为一项长期的,Int64.Parse(string);

基本上,你会不会担心完全理解超载/显式转换。

+0

将某些东西转换为字符串,以便将其转换回数字?这看起来非常笨拙和缓慢。在我看来,根据我的经验(PostgreSQL smallint可以简写为short,但不能为整数),并且从阅读此线程可知,其中一种Convert方法是最佳解决方案。 – 2015-10-29 14:31:28