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
Vous devez vous connecter pour publier un commentaire.
Il ne devrait jamais avoir travaillé. Qui fait, il est probable que quelque chose a été fixé dans le cadre.
Le problème en C#:
Le correctif:
Et de commentaire d'trail ci-dessous:
un type TinyInt, par défaut, de retour d'un octet de type qui lui-même est de moulage pour un int, mais la db, type TinyInt est pas, alors essayez ceci:
Parce que
tinyint
est unByte
type. En voici une liste: LISTEVous avez besoin de convertir
byte array
àint
. La Solution ici: SOLUTIONPour rendre la réponse utilisable avec d'autres bibliothèques de connexion je partage cette. Je suis l'aide de MariaDb et MySql connector/Net donc choisi de répondre ne fonctionne pas pour moi directement. Alors d'abord vous devez trouver le C# type de données retourné sql de type tinyint champ.
Ici est un exemple:
Je suis en utilisant MySqlHelper.ExecuteDataset() et de l'exécution de requête d'extraction de type tinyint(4) de la colonne:
J'ai fait le "Le cast spécifié n'est pas valide!" exception même si j'ai utilisé la fonction de distribution dans la requête SQL:
J'ai d'abord essayé toutes les propositions d'ici et d'ailleurs, mais enfin ce qui a fonctionné, c'est de découvrir quel est le type du champ en c#:
Résultat: Système.SByte! Donc, pour moi, c'est bien d'utiliser l'un de ceci:
Je crois que la taille de SQL de type tinyint est de 1 octet (8 bits) donc, essayez de casting pour un "octet" au lieu d'un moulage d'un " int " (qui est en 32 bits). Mais je n'ai pas essayé car je n'utilise pas de type tinyint dans ma base de données.
Aussi, si votre colonne dans la base de données tinyintcolumn est nullable, vous avez également besoin de prendre en compte lorsque vous lancez la valeur.