为什么会这样做
int collectionCharge = (int)cmdCheck.ExecuteScalar();
但这会产生异常
double collectionCharge = (double)cmdCheck.ExecuteScalar();
System.InvalidCastException:指定的强制转换无效。
为什么它无效?
修改
我试图简单地从查询返回一个结果,这得到一些运费的价格。所以我不能把它变成int
,因为它必须有小数,因此试图转换为double
。我还在学习asp.net,所以如果有更好的方法来实现这一点,请指出我正确的方向:)
编辑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;
}
答案 0 :(得分:8)
这里的问题是ExecuteScalar
正在返回一个int
,它被装入object
。要转换为double
,您必须首先取消装箱到int
,然后转换为double
double collectionCharge = (double)(int)cmdCheck.ExecuteScalar();
答案 1 :(得分:3)
使用Convert.ToXXX来避免无效的强制转换异常。
即
collectionCharge=Convert.ToDouble(cmdCheck.ExecuteScalar());
看来ExecuteScalar返回一个Object,所以代码为:
double collectionCharge = (double)cmdCheck.ExecuteScalar();
仍然可能失败
答案 2 :(得分:2)
感谢@DJKRAZE。
我将查询更新为SELECT CASE(FREIGHT_PRICE AS FLOAT)
,现在可以使用(双)强制转换。
double collectionCharge = (double)cmdCheck.ExecuteScalar();
答案 3 :(得分:0)
阅读所有答案后,我确实收到了十进制值,并且解决方法很简单! 我只是将函数声明为字符串,并接收了十进制值作为字符串!
public static string Sals_AccountExpensesGetSums(int accountID)
{
SqlParameterHelper sph = new
SqlParameterHelper(ConnectionString.GetWriteConnectionString(),
"sals_AccountExpenses_GetAllSums", 1);
sph.DefineSqlParameter("@AccountID", SqlDbType.Int, ParameterDirection.Input, accountID);
string res = sph.ExecuteScalar().ToString();
return res;
}
在业务层中,我将结果更改为两倍!
public static decimal GetAccountExpensesSums(int accountId)
{
string res = "";
decimal sums = 0;
res = DBAccount.Sals_AccountExpensesGetSums(accountId);
// check so we will not have exception
if ( res != "")
sums = Convert.ToDecimal(res);
return sums;
}
结果非常理想:889678.70
答案 4 :(得分:-1)
我建议使用此代码:
object o = c.ExecuteScalar();
if (o != null)
{
int x = Int32.Parse(o.ToString());
}
这有两件事。首先它确保你的c.ExecuteScalar()没有返回 null 如果它这样做并且你试图施放,你就会遇到问题。
其次,它使得转换变得更加简单,因为它可以在从查询中读取时应用于几乎所有情况。
对象变为字符串。如果你想把它作为一个字符串,你就完成了。
如果你想要它作为布尔值,检查是否该string.Equals(“true”)
如果你想把它当作int,Int32.Parse(string);
如果你想要它作为一个长Int64.Parse(string);
基本上,您不必担心完全理解重载/显式转换。