在C# Windows窗体程序中出现了“指定的转换无效”错误

13

我遇到了一个“指定的转换无效”错误。这是一个C# Windows窗体应用程序,在尝试从表中检索一个值时出现的。该值可能是smallint或numeric类型(我尝试了两个字段,但两个都给我相同的错误),并且我尝试将其存储在int变量中。

以下是源代码:

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

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

你尝试过使用 Convert.ToInt16(rdr["quantity"]) 吗? - David
9个回答

21

rdr["quantity"] 将会是一个装箱的对象。如果它不是一个 int,那么你不能直接将其拆箱为一个 int(这正是你试图做的),因为你必须先将其拆箱到适当的类型(比如说 short)。但这太麻烦了,所以为了清晰起见,最好这样写:

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

5
  if(rdr["quantity"].GetType() != typeof(int))
    throw new InvalidOperationException(
      "quantity is a " + rdr["quantity"].GetType());
  int number = (int)rdr["quantity"]; // error is here

我不明白这个代码是如何将数量分配给数字变量的。如果我没错的话,从逻辑上讲,我应该仍然会得到一个错误。 - jello
1
@jello 它会抛出一个异常,告诉你rdr["quantity"]的确切类型。如果不知道这个,所有这些答案都是在胡说八道。我们可能不知道"quantity"是一个字节数组。将其放入您的代码并运行它。 - user1228
顺便说一句,当我说“运行它”时,我不是指在发布模式下运行它。请从 Visual Studio 中以调试模式运行它。 - user1228
我明白了。嗯,在这种情况下,数据库是我创建的,所以我知道字段的数据类型。 - jello
2
@jello 是的,你可能知道数据库中的数据类型,但显然你不知道.NET等效类型是什么,或者它的DBNULL是什么,因此会出现“指定的转换无效”的消息。 - user1228

2

也许这个建议有点傻,但你考虑过尝试这样做吗 - 将SqlDataReader的结果作为object实例获取,然后检查它的类型?没有人比CLR类型系统更能告诉你它到底是什么! :-)

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

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

如果您得到了一个值,您可以检查它是什么类型,并根据您的结果进行相应的转换,以使其更加符合您的需求。

1

我敢打赌 quantityNULL,而不是整数。


0
 sl_id = Convert.ToInt32(lblintroducerid.Text.ToString());
 sl_rank = Convert.ToInt32(lblassorank.Text.ToString());

0

尝试其中一种选项。

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

或者

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

第一个选项不是有效的重载,第二个无法编译。 - statenjason
哎呀,修正了我的拓扑结构,之前是凭记忆写的。 - Mitchel Sellers

0

你试过了吗?

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

0

既然你说因为你创建了数据库,知道该值应该是什么... 那你能检查一下rdr["quantity"]是否有值,然后再尝试解析它吗?

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!");
    }
}

-1

尝试使用SqlDataReader的GetInt32()方法

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

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接