Pourquoi cette distribution courts int échec?
Nous avons un peu de code que les archives de données à partir d'une base de données Microsoft Access sur un Serveur MS SQL server base de données. En supposant que nous avons un lecteur de données déjà remplie à partir de l'Accès de la table et nous sommes ajout d'un paramètre à un SqlCommand en préparation pour l'insertion, nous avons un transtypage qui est un échec. Voici le code:
oSqlServerDbCmd_ForInsert.Parameters.AddWithValue("@Duration",
(int) oReader["Duration"]);
Le domaine de la oReader est en fait un Accès Entier, ce qui est une courte distance en C#. Si on jette un bref ici il n'y a pas de problème. Cependant, si on jette un int le code génère une InvalidCastException. J'ai peut-être mal interpréter ce à partir de la La documentation MSDN:
"Il y a un prédéfini conversion implicite de court int, long, float, double, decimal."
...mais il semble que cela devrait fonctionner (mon raisonnement étant, si une conversion implicite est définie pourquoi un transtypage explicite pas de travail?). Je me rends compte que le plâtre n'est même pas nécessaire, car AddWithValue accepte un objet, de sorte que nous avons réellement supprimé la distribution de notre code, mais j'aimerais voir une explication à cette distribution n'était pas juste dans le cas que nous rencontrons quelque chose de ce genre dans l'avenir.
Ce n'est pas une réponse à votre question, mais il semble que votre
@Duration
paramètre doit avoir un type de données numérique, dans ce cas, vous ne voulez pas utiliser une valeur de chaîne dans le AddWithValue
appel.J'ai édité le code pour supprimer cette conversion que c'est une distraction de ce que cette question vraiment fini par être sur. La réponse courte est que la chaîne de conversion a été dans le code quand nous avons hérité. Depuis il a travaillé jusqu'à ce que nous avons changé le type de données dans la base de données source, que nous avions avait pas lieu d'étudier le code. Une fois qu'il a été cassé et nous avons creusé dans nous avons vu que la chaîne de conversion a été nécessaire (bien que ne pose pas de problème, croyez-le ou pas).
OriginalL'auteur A. Wilson | 2012-03-16
Vous devez vous connecter pour publier un commentaire.
Ce que vous avez dans vos mains est une instance de unboxing. Plus précisément lors de l'unboxing, vous ne pouvez unbox le type de la valeur qui a été à l'origine boîte; si ce type est Un et vous êtes unboxing à B, il n'a pas d'importance si une conversion implicite de A à B, il existe (l'unboxing échouera toujours).
Voir Eric Lippert est classique post de blog sur le sujet pour participer explication.
object o = (short)10; int i = (int)o;
échoue.Ah ça a du sens. Alors, j'ai d'abord jeté comme un court que je ne puis le jeter comme un int sans problème?
Exactement.
OriginalL'auteur Jon
Vous avez cast vers le type très particulier puisque vous êtes unboxing - le problème est que
oReader["Duration"]
retourne unobject
exemple:Il réussira si vous lancez un retour à court d'abord, puis à int:
OriginalL'auteur BrokenGlass