&引用;指定的强制转换无效";C#windows窗体程序中出错

&引用;指定的强制转换无效";C#windows窗体程序中出错,c#,sql-server,C#,Sql Server,我有一个“指定的强制转换无效”错误。C#中的Windows窗体应用程序。我正在尝试从表中检索值。该值要么是smallint,要么是数值(我尝试了两个字段,两个字段都给出了相同的错误),我尝试将其存储在int变量中 以下是消息来源: using (SqlDataReader rdr = cmd.ExecuteReader()) //"select * from table where fieldname = " + value { while (rdr.Read()) { int num

我有一个“指定的强制转换无效”错误。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

试试这两个选项中的一个

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

你试过了吗

int number=convert.toint16(rdr["quantity"]); 
rdr[“数量”]
将是一个装箱的东西。如果它不是
int
,则不能将其直接解装箱到
int
(这就是您要做的),因为您必须首先将其解装箱到适当的类型(例如,
short
)。但这太麻烦了,所以为了清楚起见,你最好说

Convert.ToInt32(rdr["quantity"]);

我打赌
quantity
NULL
,它不是整数。

尝试使用SqlDataReader的GetInt32()


可能是一个愚蠢的建议——但您是否考虑过尝试一下——从
SqlDataReader
获取结果作为
对象的实例,然后检查它是什么类型?没有人能比CLR类型系统更好地告诉您它到底是什么!:-)


如果您确实得到了一个值,您可以检查它是什么类型的,并希望根据您的结果相应地转换它。

因为您说您知道该值应该是什么,因为您创建了数据库。。。您能否检查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!");
    }
}

您是否尝试过转换.toint16(rdr[“quantity”];第一个选项不是有效的重载,第二个无法编译。Oops,修复了我的拓扑,正在从内存写入。我不知道这是如何在数字变量中分配数量的。从逻辑上讲,如果我right@jello它将抛出一个异常,告诉您rdr的类型[“数量”]是。不知道这一点,所有这些答案都是空穴来风。因为我们所知道的“数量”是一个friggen字节数组。把它放在你的代码中并运行它。顺便说一句,当我说“运行它”时“我不是说在发布模式下运行它。在visual studio的调试模式下运行它。我明白了。在本例中,我创建了数据库,因此我知道字段的数据类型are@jello是的,您可能知道数据库中的数据类型,但是您显然不知道.NET等效类型是什么,或者它的DBNULL,因此“指定的强制转换无效”消息
Convert.ToInt32(rdr["quantity"]);
rdr.GetInt32(rdr.GetOrdinal("quantity"));
using (SqlDataReader rdr = cmd.ExecuteReader()) 
{
    while (rdr.Read())
    {
        object obj = rdr["quantity"];

        if(obj != null)
        {
            string objType = obj.GetType().FullName;
        }
    }
 }
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());