web-dev-qa-db-fra.com

Erreur "La distribution spécifiée n'est pas valide" dans le programme de formulaires Windows C #

Je rencontre une erreur "La distribution spécifiée n'est pas valide". Application de formulaire Windows en C #. J'essaie de récupérer une valeur d'une table. La valeur est soit un smallint, soit un numérique (j'ai essayé les deux champs, les deux me donnent la même erreur), et j'essaie de le stocker dans une variable int.

voici la source:

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

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

rdr["quantity"] va être une boîte quelque chose. Si ce n'est pas un int, vous ne pouvez pas décompresser directement dans un int (ce que vous essayez de faire), car vous devez d'abord le décompresser dans le type approprié (par exemple, short). Mais ceci est trop lourd, alors pour plus de clarté, vous feriez mieux de dire

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

Une suggestion idiote, peut-être - mais avez-vous pensé à essayer ceci - récupérez le résultat de votre SqlDataReader en tant qu'instance de object et vérifiez de quel type il s'agit? Personne ne peut mieux vous dire ce que c'est {vraiment} _ que le système de type CLR! :-)

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

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

Si vous récupérez une valeur, vous pouvez vérifier son type et, espérons-le, la convertir en conséquence, en fonction de vos résultats.

2
marc_s

Je parie que quantity est NULL, ce qui n'est pas un entier.

1
John Saunders

Essayez l'une des deux options.

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

ou

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

As-tu essayé

int number=convert.toint16(rdr["quantity"]); 
0
David
 sl_id = Convert.ToInt32(lblintroducerid.Text.ToString());
 sl_rank = Convert.ToInt32(lblassorank.Text.ToString());
0
Roki

Puisque vous avez dit que vous savez quelle devrait être la valeur parce que vous avez créé la base de données ... Pouvez-vous vérifier que rdr ["quantité"] a une valeur puis exécuter un essai d'analyse dessus?

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
Billy Coover