C#windows窗体程序中的“指定的强制转换无效”错误

我有一个“指定演员阵容无效”错误。 C#中的Windows表单应用程序。 我正在尝试从表中检索值。 值是smallint或数字(我试过两个字段,都给我相同的错误),我尝试将它存储在一个int变量中。

这里是来源:

using (SqlDataReader rdr = cmd.ExecuteReader()) //"select * from table where fieldname = " + value { while (rdr.Read()) { int number = (int)rdr["quantity"]; // error is here 

rdr["quantity"]将是一个盒装的东西。 如果它不是int那么你不能将它直接拆箱到int (这是你想要做的),因为你必须首先将它拆箱到适当的类型(比方说, short )。 但这太麻烦了,为了清楚起见,你最好说

 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获取结果作为object的实例,然后检查它是什么类型? 没有人能比CLR型系统更好地告诉你它到底是什么! 🙂

 using (SqlDataReader rdr = cmd.ExecuteReader()) { while (rdr.Read()) { object obj = rdr["quantity"]; if(obj != null) { string objType = obj.GetType().FullName; } } } 

如果你确实得到了一个值,你可以检查它是什么类型,并希望相应地转换它,具体取决于你的结果。

我打赌quantityNULL ,这不是一个整数。

尝试两种选择之一。

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

要么

 int number = int.parse(rdr["quantity"].ToString()); 

既然你说你知道应该是什么值,因为你创建了数据库…你能检查rdr [“quantity”]是否有值然后对它运行try解析?

 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!"); } } 
  sl_id = Convert.ToInt32(lblintroducerid.Text.ToString()); sl_rank = Convert.ToInt32(lblassorank.Text.ToString()); 

你有没有尝试过

 int number=convert.toint16(rdr["quantity"]); 

尝试使用SqlDataReader的GetInt32()

 rdr.GetInt32(rdr.GetOrdinal("quantity"));