转换ExecuteScalar()结果c#

本文关键字:结果 ExecuteScalar 转换 | 更新日期: 2023-09-27 18:04:00

为什么可以呢

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

但是这会产生一个异常

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

系统。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;
                }

转换ExecuteScalar()结果c#

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

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

使用转换。

。E

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

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

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

仍可能失败

感谢@DJKRAZE。

我将我的查询更新为SELECT CASE(FREIGHT_PRICE AS FLOAT),现在可以使用(双)强制转换。

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

在阅读了所有答案后,我确实收到了十进制值的情况,解决方案很容易!我只是将函数声明为字符串,并接收到十进制值作为字符串!

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

,在业务层,我将结果更改为double!

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

我建议使用下面的代码:

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

做两件事。首先,它确保你的c.ExecuteScalar()没有返回null如果它这样做,你试图转换,你会有问题。

第二,它使强制类型转换更简单,因为它可以应用于从查询读取时的几乎所有情况。

对象变成字符串。如果你想要一个字符串,你就完成了。如果你想要一个布尔值,检查这个字符串是否。equals ("true")如果你想把它作为整型,Int32.Parse(string);如果你想让它长,Int64.Parse(string);

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