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
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"]);
if(rdr["quantity"].GetType() != typeof(int))
throw new InvalidOperationException(
"quantity is a " + rdr["quantity"].GetType());
int number = (int)rdr["quantity"]; // error is here
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.
Je parie que quantity
est NULL
, ce qui n'est pas un entier.
Essayez l'une des deux options.
int number = rdr.getInt32(rdr.GetOrdinal("quantity"));
ou
int number = int.parse(rdr["quantity"].ToString());
As-tu essayé
int number=convert.toint16(rdr["quantity"]);
sl_id = Convert.ToInt32(lblintroducerid.Text.ToString());
sl_rank = Convert.ToInt32(lblassorank.Text.ToString());
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!");
}
}