«Указанное приведение не является допустимым» ошибка в программе форм Windows C # - PullRequest
13 голосов
/ 04 февраля 2010

У меня ошибка «Указанное приведение неверно». Приложение Windows Form в C #. Я пытаюсь получить значение из таблицы. Это либо smallint, либо числовое значение (я пробовал оба поля, оба выдают одинаковую ошибку), и я пытаюсь сохранить его в переменной int.

вот источник:

using (SqlDataReader rdr = cmd.ExecuteReader()) //"select * from table where fieldname = " + value
{

 while (rdr.Read())
 {
  int number = (int)rdr["quantity"]; // error is here

Ответы [ 9 ]

19 голосов
/ 04 февраля 2010

rdr["quantity"] будет в штучной упаковке. Если это не int, то вы не можете распаковать его непосредственно на int (что вы и пытаетесь сделать), так как вы должны сначала распаковать его в соответствующий тип (скажем, short). Но это слишком громоздко, поэтому для ясности лучше сказать

Convert.ToInt32(rdr["quantity"]);
5 голосов
/ 04 февраля 2010
  if(rdr["quantity"].GetType() != typeof(int))
    throw new InvalidOperationException(
      "quantity is a " + rdr["quantity"].GetType());
  int number = (int)rdr["quantity"]; // error is here
2 голосов
/ 05 февраля 2010

Глупое предложение, может быть, - но вы не подумали попробовать это - взять результат из вашего SqlDataReader как экземпляр object и затем проверить, какой это тип? Никто не может сказать вам лучше, что это на самом деле , чем система типа CLR! : -)

using (SqlDataReader rdr = cmd.ExecuteReader()) 
{
    while (rdr.Read())
    {
        object obj = rdr["quantity"];

        if(obj != null)
        {
            string objType = obj.GetType().FullName;
        }
    }
 }

Если вы вернете значение, вы можете проверить его тип и, надеюсь, соответствующим образом преобразовать, в зависимости от ваших результатов.

1 голос
/ 04 февраля 2010

Бьюсь об заклад quantity это NULL, что не является целым числом

0 голосов
/ 25 августа 2011
 sl_id = Convert.ToInt32(lblintroducerid.Text.ToString());
 sl_rank = Convert.ToInt32(lblassorank.Text.ToString());
0 голосов
/ 05 февраля 2010

Поскольку вы сказали, что знаете, какое значение должно быть, потому что вы создали базу данных ... Можете ли вы проверить, что rdr ["количество"] имеет значение, а затем запустить анализ parse для него?

if(rdr["quantity"] != null) {
    int? number = null;
    if(int.TryParse(rdr["quantity"].ToString(), out number)) {
        Console.WriteLine("Hurray, I have an int. Up vote Coov!");
    }
}
0 голосов
/ 04 февраля 2010

Попробуйте использовать функцию GetInt32 () * SqlDataReader

rdr.GetInt32(rdr.GetOrdinal("quantity"));
0 голосов
/ 04 февраля 2010

Вы пробовали

int number=convert.toint16(rdr["quantity"]); 
0 голосов
/ 04 февраля 2010

Попробуйте один из двух вариантов.

int number = rdr.getInt32(rdr.GetOrdinal("quantity"));

или

int number = int.parse(rdr["quantity"].ToString());
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...