Erreur lors de la conversion de tiny int en int

Cette erreur dirait qu'il a été causé par l'installation de framework 4.5 sur le serveur, même si le projet est toujours ciblée à 4.0.

4.5 remplace le CLR et on dirait qu'il a des changements dans unboxing un objet de type tinyint à un int. C'était dans la version 4.0, mais pas après l'installation 4.5.

============================================

Veuillez lire l'ensemble de la question avant de répondre, la majorité des réponses ne répondent pas à la question que je pose.

Nous avons aujourd'hui eu une erreur dans un plâtre à partir d'un tinyint dans sql vers un int à l'aide de

Daterow datarow = GetOneDatarow(connection,
                         "SELECT tinyintcolumn FROM table1 WHERE id = 4");
int i = (int)datarow["tinyintcolumn"];

C'est un vieux code qui a été dans le produit pendant plusieurs années sans aucune modification et qu'il a travaillé jusqu'à hier. (Et c'est pas le code exact, juste assez pour montrer le contexte)

=== Mise à JOUR

Le message d'erreur exact était: "Le cast spécifié n'est pas valide!" et la dernière ligne

int i = (int)datarow["tinyintcolumn"];

est l'exacte de la ligne à partir de notre code de l'erreur de casting avec seulement les noms de variable et le nom de colonne changé.

Et la base de données de la colonne est de type tinyint avec la valeur par défaut de 0, pas d'index ou d'autres contraintes.

=== Mise à jour de fin

=== Mise à JOUR 2

Henk Holterman, dans sa réponse m'a informé que le FW 4.5 remplace le CLR 4.0 de même pour les projets compilés spécifiquement pour la version 4.0, ce qui pourrait changer à distance existant 4.0 comportement comme celui-là.

Je vais garder cette ouverture d'un tout plus mais sa réponse est la plus prometteuse pour l'instant 😀
=== Fin

Nous avons changé de cadre de 3.5 à 4.0 il y a quelques semaines, mais c'était seulement hier après-midi après une recompile que ce qui s'est passé, hier matin, le même code (même après recompiler) a fonctionné comme sur des roulettes.

Faire quelqu'un a une idée sur les raisons de ce qui fonctionnait avant et ne fonctionne pas maintenant?

A Microsoft fait tout sous le capot des changements qui ont supprimé une conversion implicite ou a travaillé par de la pure magie avant?

Nous l'avons résolu en changeant la base de données de la colonne de type int, mais je suis toujours curieux de ce qui pourrait avoir causé l'échec de la droite maintenant.

=== Mise à JOUR 3

Juste de le terminer.

J'ai trouvé le changement entre les cadres. Dans une mise à jour de Microsoft a changé la façon dont boxing et unboxing est fait. De ce fait, les implicites de fonte à partir de l'octet de type int que plus le FW n'a à échouer lors de l'octet a été converti, car il est dans une datatable.

Un unboxed octet sera en 4.5 être implicitement converti en type int, mais un coffret octet est un objet générique qui ne peut pas être implicitement exprimés.

Pas, ce qui a changé en 3.5 SP1 donc notre FW 4.0 devrait également avoir échoué, sauf si la mise à jour vers le SP1 n'était pas dans la version 4.0 mise à jour. Cela n'a pas encore répondu 🙂

Voici le billet à partir de MS sur ce 😉
https://connect.microsoft.com/VisualStudio/feedback/details/766887/casting-tinyint-from-sql-datarow-to-int-no-longer-possible

source d'informationauteur David Mårtensson