Valeur de caractère non valide pour la spécification cast (# 0) – Je connais le problème, mais pas comment le résoudre

J'ai un problème avec un button dans MS Access demandant une vue SQL qui n'a pas de key étrangère.

Ma question est très similaire à la question trouvée ici: erreur MS Access "ODBC – appel a échoué.valeur de caractère invalide pour la spécification cast (# 0)" – Cela semble être mon problème exact, mais je ne suis pas sûr de savoir comment Résolvez le. Voici quelques détails supplémentaires. Tout d'abord, le message d'erreur exact:

ODBC--call failed. [Microsoft][ODBC SQL Server Driver]Invalid character value for cast specification (#0) 

Voici où je diffère. J'ai un button dans MS Access qui fait ce qui suit:

 Private Sub btnMachineCutSheet_Click() Dim stDocName As Ssortingng stDocName = "qryCutSheetByMachines" DoCmd.OpenQuery stDocName, acNormal, acEdit End Sub 

La requête que vous voyez là-bas ( qryCutSheetByMachines ) est une requête assez longue, mais j'ai réduit le problème à une ligne. Voici la requête:

 SELECT vwCutSheet.Network, vwCutSheet.NetworkSpeed, vwCutSheet.Duplex FROM vwCutSheet INNER JOIN local_tblCreateCutSheet ON vwCutSheet.EquipmentID = local_tblCreateCutSheet.EquipmentID; 

Gardez à l'esprit que toutes les tables / vues sont des tables liées provenant d'une database MS SQL 2008

Le premier bit de l'étrangeté est que tout fonctionne très bien si je supprime le vwCutSheet.NetworkSpeed , ligne. Malheureusement, j'ai besoin de ces données.

Maintenant, si je supprime l'instruction JOIN, la requête fonctionne correctement. Évidemment j'ai besoin de la jointure ou je ne l'aurais pas là. Maintenant, le problème (je suppose) est que la vue (vwCutSheet) n'a pas de PK (les vues doivent-elles avoir des keys primaires? ). vwCutSheet.EquipmentID ne peut pas être un PK car il y aura toujours un cas de plusieurs EquipmentID avec la même valeur dans cette vue.

Et le dernier élément d'information qui pourrait chambouler les choses est le suivant. Si j'ouvre l'affichage en mode Création (dans MS Access), je peux voir qu'Access attend un type de données "Number" – mais si je regarde la table que la vue interroge à l'origine, le type de données est un varchar ( 5). Je m'attends à ce qu'Access regarde le contenu des données et ne voit que des nombres (les valeurs sont 10,100,1000 et 10000).

Je suis heureux de dire que je n'ai pas conçu cela, donc ce n'est pas de ma faute! Hah … mais, je dois le supporter, alors c'est à moi de le faire fonctionner.

Donc … je pense que c'est toute l'information pertinente. Faites-moi savoir si vous avez besoin de plus d'informations et je modifierai ma question au fur et à mesure.

Merci d'avance pour votre aide!

EDIT: Plus d'infos trouvées:

La table dont provient la vue utilise une colonne avec un type de données varchar (5). La raison pour laquelle ce champ est un varchar (5) est qu'il est possible de spécifier une 'vitesse' de 10, 100, 1000, 10000 ou Auto.

De plus, il est possible que le champ rempli de la vue soit nul.

Vous ne savez pas si vous avez la permission de travailler du côté SQL, mais si c'est le cas, essayez de créer votre jointure là-bas et voyez s'il y a un problème.

En outre, pensez à replace la valeur enregistrée 'auto' par une valeur numérique et invalide, comme -1, en supposant à nouveau que vous pouvez apporter des modifications du côté sql.

Vous devrez peut-être effectuer une limitation ou une conversion sur une table liée que vous ne pouvez pas modifier avant de pouvoir vous joindre. Au lieu de la requête que vous avez, vous pouvez avoir besoin de 3, si vous avez besoin de manipuler des données dans les deux sources liées avant de pouvoir les joindre.


En réponse à votre commentaire, joindre une table liée à SQL Server et une table Access locale devrait fonctionner, si les types de données et les valeurs sont compatibles. Si la table liée définit votre champ key comme numérique, mais contient des valeurs de text, comme 'auto', cela ne peut pas fonctionner. Vous aurez besoin de changer la table liée à un champ de text au lieu de numérique afin qu'il puisse joindre avec le champ de text dans votre table locale.

Je dirais que vous avez une erreur de données. Vous stockez des nombres dans un champ de text, sauf lorsque vous ne le faites pas.

Si à la place vous définissez 0 comme signifiant "Auto", vous pouvez en faire un champ numérique. Ou, utilisez une table de search et une valeur de key étrangère de sorte que 1 = 10, 2 = 100, 3 = 1000, 4 = 100000 et 0 = Auto. Si vous faites cela, vous pouvez utiliser la valeur comme exposant (10 ^ N), et les résultats seront 1, 10, 100, 1000, 10000, où 1 serait votre valeur Auto.

Ou faites NULL = Auto, dans ce cas 10 ^ Null vous donnerait Null (Auto), alors que toutes les autres valeurs fonctionneraient.

Cela permettrait de concevoir complètement le problème.

Mais il suppose que vous avez access à la table de données.

Sinon, si vous ne pouvez pas modifier le type de données du champ, vous pouvez créer une vue qui effectue l'une des actions ci-dessus pour vous. Pour moi, la chose la plus facile à faire est de se débarrasser de la valeur du text damné, "Auto". De ce que je faisais, je convertirais probablement "Auto" en Null, donc le résultat serait une colonne de nombres avec Nulls.