铸造的ExecuteScalar()结果C#
为什么将这项工作铸造的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;
}
与感谢@DJKRAZE。
我将我的查询更新为SELECT CASE(FREIGHT_PRICE AS FLOAT)
,它现在与(双)演员一起工作。
double collectionCharge = (double)cmdCheck.ExecuteScalar();
这是不安全的例外。看到我对JaredPar的回答的评论。请看看这个解决方案:http://*.com/questions/870697/unable-to-cast-object-of-type-system-dbnull-to-type-system-string/870771#870771 – asawyer 2013-03-15 15:40:34
斯图尔特我道歉没有提供给你一个确切的例子,但给你的示例使用Scope_Identity作为一个例子,导致你正确的解决方案.. +1为了能够得到这个工作的基础上建议 – MethodMan 2013-03-15 16:01:04
@asawyer,我同意你,然而在我的情况,它是安全的空值,因为我们有一个NVL()在该视图被查询的字段,所以它永远不会为空(但0)。 – Stuart 2013-03-15 16:18:12
这里的问题是,ExecuteScalar
正在返回一个int
,它被装箱到object
。为了转换为double
必须先拆箱到int
然后转换为double
double collectionCharge = (double)(int)cmdCheck.ExecuteScalar();
的对象。' – asawyer 2013-03-15 15:19:39
使用Convert.ToXXX可以避免无效的转换异常。
IE
collectionCharge=Convert.ToDouble(cmdCheck.ExecuteScalar());
因为它看起来的ExecuteScalar返回一个对象这样的代码:
double collectionCharge = (double)cmdCheck.ExecuteScalar();
也不能正常工作
我会建议使用此代码:
object o = c.ExecuteScalar();
if (o != null)
{
int x = Int32.Parse(o.ToString());
}
这有两件事。首先它确保你的c.ExecuteScalar()没有返回null如果它这样做了,而你试图施放,你就会遇到问题。其次,它使铸造更简单,因为它可以应用于从查询中读取时几乎所有的情况。
该对象变成一个字符串。如果你想要它作为一个字符串,你就完成了。 如果您想将它作为布尔值,请检查该字符串。等于(“真”) 如果你想把它当作一个int,Int32.Parse(string);
如果你想让它作为一项长期的,Int64.Parse(string);
基本上,你会不会担心完全理解超载/显式转换。
将某些东西转换为字符串,以便将其转换回数字?这看起来非常笨拙和缓慢。在我看来,根据我的经验(PostgreSQL smallint可以简写为short,但不能为整数),并且从阅读此线程可知,其中一种Convert方法是最佳解决方案。 – 2015-10-29 14:31:28
因为它返回一个int,不返回一个double? – 2013-03-15 15:06:47
我不知道,但双重演员可能会让你过去:'(double)(int)cmdCheck.ExecuteScalar()'。 – neontapir 2013-03-15 15:07:05
'-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