J'ai utilisé un ensemble de pages héritées sur mon serveur IIS7 depuis au moins un an. Parfois, quelque chose la semaine dernière a changé et maintenant cette ligne:La page ASP Classic a cessé de fonctionner
Response.Write CStr(myRS(0).name) & "=" & Cstr(myRS(0).value)
qui permet de revenir rien de plus excitant que la chaîne: « Mise à jour = true » (les params d'entrée de traitement sproc, les stocke à une table, des contrôles d'erreurs et quand cela est tout fait retourne un code de succès en exécutant cette déclaration: sélectionnez « true » que [Mise à jour]
maintenant, mon gestionnaire d'erreurs pageside est impliqué et offre:
myError=Error from /logQuizScore.asp
Error source: Microsoft VBScript runtime error
Error number: 13
Error description: Type mismatch
Il est important de noter que tous les lots de l'utilisation des pages le même cadre - même db, même format de codage, connecitonstrings et (autant que je sache) tous les autres travaillent.
dépanné à ce point:
L'appel à la procédure stockée fonctionne correctement (substance est stockée à la table donnée). La sortie de la procédure stockée fonctionne correctement (je peux exécuter un appel direct avec les paramètres donnés et tout fonctionne.) Je peux voir le profiler appelant et passant.Je peux remplacer tout le code avec 'select' vrai 'comme mis à jour' et l'erreur est ... même
tout à la déclaration response.write ci-dessus est correct
donc, quelque chose a changé comment ADO rend ce jeu d'enregistrements particulier
Alors je tente: Response.Write myRS.Item.count
et d'obtenir:
Numéro de l'erreur: 424 Description de l'erreur: Objet requis
L'objet recordset ne semble pas être instancié mais l'objet de commande _did execute. Répétez - beaucoup d'autres pages juste la même logique de base pour frapper d'autres sprocs sans problème.
complet extrait de code
set cmd1 = Server.CreateObject("ADODB.Command")
cmd1.ActiveConnection = MM_cnCompliance4_STRING
cmd1.CommandText = "dbo._usp_UserAnswers_INSERT"
...
cmd1.CommandType = 4
cmd1.CommandTimeout = 0
cmd1.Prepared = true
set myRS = cmd1.Execute
Response.Write CStr(myRS(0).name) & "=" & Cstr(myRS(0).value)
Une pensée aléatoire qui m'a frappé - pourrait-il être que «vrai» est en fait interprété comme un booléen, et ne sera donc pas converti en chaîne? Avez-vous essayé d'exécuter quelque chose comme 'SELECT 'hello world' AS [Mise à jour]'? Aussi, avez-vous essayé cela? Cela peut vous aider à comprendre pourquoi vous obtenez l'erreur d'incompatibilité de type ... http://msdn.microsoft.com/fr-fr/library/ms525253.aspx –
Avez-vous déjà essayé de remplacer 'cmd1.CommandText =" SELECT 'true' AS mis à jour "' et 'cmd1.CommandType = 1'? Qu'est-ce qui se passe derrière '...'? – Filburt
pas de changement avec 'hello world' ou 'select 1 as updated'. Au-delà - cette page est en service depuis des années - le code n'a pas changé. L'idée de fliburt de changer le CommandType - intéressant - et cela a fonctionné.L'objet RecordSet a été créé et envoyé à la ligne reponse.write. La partie coupée des snippets était juste la liste de paramètres sous la forme de - cmd1.Parameters.Append cmd1.CreateParameter ("@ Score", 3, 1,4, cmd1__Score). – justSteve