6

为什么这行得通

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

但这会产生异常

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

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

为什么它无效?

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

使用 SQL编辑 2 的完整代码...

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;
                }
4

5 回答 5

10

这里的问题ExecuteScalar是返回一个int被装箱的object. 为了转换为a double,您必须先取消装箱为an,int然后再转换为adouble

double collectionCharge = (double)(int)cmdCheck.ExecuteScalar();
于 2013-03-15T15:08:20.453 回答
6

使用 Convert.ToXXX 来避免无效的强制转换异常。

IE

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

看起来 ExecuteScalar 返回一个 Object 所以代码:

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

仍然可能失败

于 2013-07-19T07:20:06.850 回答
2

感谢@DJKRAZE。

我更新了我的查询SELECT CASE(FREIGHT_PRICE AS FLOAT),现在可以使用(双重)演员表。

double collectionCharge = (double)cmdCheck.ExecuteScalar();
于 2013-03-15T15:38:56.977 回答
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

于 2019-10-17T12:22:11.640 回答
-1

我建议使用以下代码:

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

这有两件事。首先,它确保您的 c.ExecuteScalar() 没有返回null如果它这样做并且您尝试强制转换,那么您会遇到问题。

其次,它使转换变得更加简单,因为它可以应用于从查询中读取的几乎所有情况。

对象变为字符串。如果你想要它作为一个字符串,你就完成了。如果您希望它作为布尔值,请检查该 string.Equals("true") 如果您希望它作为 int,Int32.Parse(string); 如果您希望它作为 long,Int64.Parse(string);

基本上,您不必担心完全理解重载/显式转换。

于 2015-09-23T10:25:51.827 回答