У меня есть "Указанный бросок, не допустимая" ошибка. Приложение форм 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
rdr ["количество"]
будет чем-то в коробке. Если это не int
, то вы не можете распаковать его напрямую в int
(что вы и пытаетесь сделать), так как вы должны сначала распаковать его до соответствующего типа ( скажем, короткое
). Но это слишком громоздко, поэтому для ясности лучше сказать
Convert.ToInt32(rdr["quantity"]);
if(rdr["quantity"].GetType() != typeof(int))
throw new InvalidOperationException(
"quantity is a " + rdr["quantity"].GetType());
int number = (int)rdr["quantity"]; // error is here
Возможно, глупое предложение - но не думали ли вы попробовать это - возьмите результат из своего SqlDataReader
как экземпляр объекта
, а затем проверяем, что это за тип? Никто не может сказать вам лучше, чем это на самом деле , чем система типов CLR! : -)
using (SqlDataReader rdr = cmd.ExecuteReader())
{
while (rdr.Read())
{
object obj = rdr["quantity"];
if(obj != null)
{
string objType = obj.GetType().FullName;
}
}
}
Если вы вернете значение, вы можете проверить его тип и, надеюсь, преобразовать его соответствующим образом, в зависимости от ваших результатов.
Вы пробовали
int number=convert.toint16(rdr["quantity"]);
Готов поспорить, количество
равно NULL
, что не является целым числом.
Попробуйте один из двух вариантов.
int number = rdr.getInt32(rdr.GetOrdinal("quantity"));
или
int number = int.parse(rdr["quantity"].ToString());
Поскольку вы сказали, что знаете, каким должно быть значение, потому что вы создали базу данных ... Можете ли вы проверить, что 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!");
}
}
Попробуйте использовать GetInt32 () SqlDataReader
rdr.GetInt32(rdr.GetOrdinal("quantity"));