Указанное приведение недопустимо

#c# #asp.net #sql

#c# #asp.net #sql

Вопрос:

Я пытаюсь получить Score_Waarde значение из моей базы данных, используя следующий код :

 critid = critid_arr[teller2].ToString();

int scorehulp = 0;
string userid = Session["userid"].ToString();

SqlCommand cmd3 = new SqlCommand("SELECT Score_Waarde FROM Score WHERE Crit_ID = '"   critid   "' AND User_ID = '"   userid   "' ", con);
scorehulp = (int)cmd3.ExecuteScalar();
  

Когда я пытаюсь запустить это, я получаю следующую ошибку: Указанное приведение недопустимо.
Я не понимаю, почему я получаю эту ошибку, потому что critid и userid дают правильные значения.

Комментарии:

1. Какое значение возвращается при подключенном отладчике? Если оно не имеет типа System.Int32 , то это приведет к ужасной смерти. (Например, если оно вернет long или byte , это не сработает.) Лучший способ найти / исправить — это протестировать допущения; и использование отладчика здесь пропустит 20 шагов 🙂

2. Вы могли бы попробовать Int32.Parse для строкового представления возвращаемого значения. Но будьте осторожны со Null значениями. Int32.Parse(cmd3.ExecuteScalar().ToString())

3. Вы должны проверить, что возвращаемое значение не является DBNull .

4. Возможно, было бы неплохо объявить scorehulp как тип значения с возможностью обнуления (например, int? ) на случай, если оценка пользователя не найдена.

5. Почему у вас есть число в строковом поле ?

Ответ №1:

Вероятно, ваш SQL возвращает другой числовой тип, такой как long или decimal , или, по-видимому, string .

Вызов Convert.ToInt32 , который не имеет ограничений приведения при распаковке.

Ответ №2:

Изначально я получал эту ошибку (мой код на C #

 someobject.TotalItemCount = (Int32)dbManager.GetParameterValue("TotalRows"))
  

где TotalItemCount было int типа, даже несмотря на то, что SP был в порядке и давал надлежащий результат. Я избавился от этого, просто исправив SP, добавив следующий код

 Set @TotalRows =  @@rowcount.