Приведение результата 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;
                }

4 ответа

Решение

С благодарностью @DJKRAZE.

Я обновил свой запрос до SELECT CASE(FREIGHT_PRICE AS FLOAT) который теперь работает с (двойным) приведением.

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

Проблема здесь в том, что ExecuteScalar возвращает int который упакован в object, Для того, чтобы преобразовать в double Вы должны сначала распаковать в int затем преобразовать в double

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

Используйте Convert.ToXXX, чтобы избежать недопустимых исключений приведения.

IE

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

Как оказалось, ExecuteScalar возвращает объект, поэтому код:

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

а в бизнес-уровне я изменил результат на двойной!

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() не возвращает ноль. Если он это сделал и вы попытались привести, у вас возникнут проблемы.

Во-вторых, это значительно упрощает приведение типов, поскольку его можно применять практически во всех случаях при чтении из запроса.

Объект становится строкой. Если вы хотите это как строку, все готово. Если вы хотите, чтобы это было логическое значение, проверьте, является ли эта строка.Equals("true") Если вы хотите, чтобы это было как int, Int32.Parse(string); если ты хочешь так долго, Int64.Parse(string);

По сути, вам не придется беспокоиться о полном понимании перегрузки / явного преобразования.

Другие вопросы по тегам