“Указанный бросок не является допустимой” ошибкой в программе форм окон C#

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

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

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

 while (rdr.Read())
 {
  int number = (int)rdr["quantity"]; // error is here
13
задан marc_s 4 February 2010 в 21:18
поделиться

8 ответов

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

Convert.ToInt32(rdr["quantity"]);
19
ответ дан 1 December 2019 в 21:24
поделиться
  if(rdr["quantity"].GetType() != typeof(int))
    throw new InvalidOperationException(
      "quantity is a " + rdr["quantity"].GetType());
  int number = (int)rdr["quantity"]; // error is here
5
ответ дан 1 December 2019 в 21:24
поделиться

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

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

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

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

2
ответ дан 1 December 2019 в 21:24
поделиться

Вы пробовали

int number=convert.toint16(rdr["quantity"]); 
0
ответ дан 1 December 2019 в 21:24
поделиться

Готов поспорить, количество равно NULL , что не является целым числом.

1
ответ дан 1 December 2019 в 21:24
поделиться

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

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

или

int number = int.parse(rdr["quantity"].ToString());
0
ответ дан 1 December 2019 в 21:24
поделиться

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

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
ответ дан 1 December 2019 в 21:24
поделиться

Попробуйте использовать GetInt32 () SqlDataReader

rdr.GetInt32(rdr.GetOrdinal("quantity"));
-1
ответ дан 1 December 2019 в 21:24
поделиться
Другие вопросы по тегам:

Похожие вопросы: