转换ExecuteScalar()结果c#

时间:2013-03-15 15:04:47

标签: c# asp.net casting executescalar

为什么会这样做

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

5 个答案:

答案 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);

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