[ASP-SQL] pb requete...........

pb requete........... [ASP-SQL] - ASP - Programmation

Marsh Posté le 02-06-2003 à 15:18:40    

Bonjour,
voila ce que je fais :
 

SQL = "SELECT * FROM faq WHERE id LIKE '%"&rech&"%' ORDER BY id"


Et kan j'execute, il me dit :  

La conversion implicite du type de données 'numeric' en 'varchar' n'est pas autorisée. Employez la fonction CONVERT pour exécuter cette requête

.  
 
Mon champ id est bien sur en numeric, mais je ne veux pas le convertir, je comprend pas.....  :(  

Reply

Marsh Posté le 02-06-2003 à 15:18:40   

Reply

Marsh Posté le 02-06-2003 à 15:22:27    

tu fais de la recherche de chaine dans un numéric [:spamafote]
 
C'est mysql...  
mets id en varchar dans ta base (à moins que tu fasses des calculs sur l'ID, mais je ne pense pas)...
 
Ca résoudra tes problèmes

Reply

Marsh Posté le 02-06-2003 à 15:32:39    

Ya pas un autre moyen?
Ca m'embete de toucher à la base  :heink:


Message édité par gothico le 02-06-2003 à 15:32:58
Reply

Marsh Posté le 02-06-2003 à 15:35:17    

gothico a écrit :

Ya pas un autre moyen?
Ca m'embete de toucher à la base  :heink:


 
Le problème est que tu as un champ numérique.
Si tu ne veux pas le toucher, alors tu ne peux pas rechercher de texte (varchar) à l'interieur avec un like.
 
Tu peux par contre, changer ta condition, avec des > ou des <, ou n'importe quel autre opérateur...
le like fait la conversion implicite de id (numeric) en varchar, et c'est la que ca plante...
 
 
edit: tu peux chercher la dessus si tu veux :
http://johnny.iut-blagnac.fr/tuffery/
 
Les cours sont très bien, je t'assure...
Soit tu changes ta base, soit tu cherches une autre requete...


Message édité par backdafuckup le 02-06-2003 à 15:36:34
Reply

Marsh Posté le 02-06-2003 à 15:38:09    

where convert(id, varchar) like ...
 
enfin, je sais pas si c'est ça la syntaxe de convert...
 
sous Oracle, ça serait "to_char(...)" c'est plus compréhensible, et sous sql server, je préfère cast, qui est plus intuitif niveau syntaxe : cast(id as varchar)

Reply

Marsh Posté le 02-06-2003 à 15:40:06    

Arf, merci!!!
En fait, je v directement faire id="&rech&" c'est le plus simple  ;)  
@++

Reply

Marsh Posté le 02-06-2003 à 15:53:32    

bah ça dépend de ce que contient "rech", mais c clair que je trouve bizarre de faire un like sur un id, surtout si c'est un numérique... Un = semble plus approprié en effet :)


Message édité par MagicBuzz le 02-06-2003 à 15:53:55
Reply

Marsh Posté le 02-06-2003 à 16:19:59    

MagicBuzz a écrit :

Un = semble plus approprié en effet :)


Tout à fait, je viens de réaliser ma connerie  :D  
Dis, en fait, je v avoir besoin d'un cast je crois, car kan je met une donnée avec des lettres dans ma recherche, il me sort une erreur au lieu de dire kil n'a rien trouvé!!
J'ai fais avec ca cast(id as varchar), mais il me dis

caErreur de compilation Microsoft VBScript erreur '800a03ee'  
 
')' attendu  
 
/winscope/support/faq.asp, ligne 57  
 
cast(id as varchar)
--------^

Reply

Marsh Posté le 02-06-2003 à 16:37:52    

A la limite, comment tester si une variable est un chiffre??

Reply

Marsh Posté le 02-06-2003 à 16:55:24    

gothico a écrit :

A la limite, comment tester si une variable est un chiffre??


en php il existe is_numeric(var), cherche l'équivalent en asp


Message édité par backdafuckup le 02-06-2003 à 16:55:30
Reply

Marsh Posté le 02-06-2003 à 16:55:24   

Reply

Marsh Posté le 02-06-2003 à 17:31:55    

bah...
 
cast c'est pas une fonction ASP, mais SQL.
 
Si tu utilises SQL Server (ça marche peut-être aussi avec les version récentes d'Access, je sais pas) :
 

sql = "select id from tab where cast(id as varchar) = '123'"


 
Normalement ça marche.
 
Sinon, en ASP, chais pu s'il existe une fonction isNumeric.
 
Si elle existe pas, alors méthode de bourrin powa :
 

function isNumeric(byval var)
   on error resume next
   var = cdbl(var)
   if err <> 0 then
      isNumeric = false
   else
      isNumeric = true
   end if
   on error goto 0
end function


 
 :whistle:

Reply

Marsh Posté le 03-06-2003 à 08:39:26    

Dsl, avec le cast, ca me fait ca :

[Microsoft][ODBC SQL Server Driver][SQL Server]'cast' n'est pas un(e) nom de fonction intégrée reconnu(e).

Reply

Marsh Posté le 03-06-2003 à 08:50:31    

gothico a écrit :

Dsl, avec le cast, ca me fait ca :

[Microsoft][ODBC SQL Server Driver][SQL Server]'cast' n'est pas un(e) nom de fonction intégrée reconnu(e).




essaie d'utiliser convert() (regarde la syntaxe) plutot que cast [:spamafote]

Reply

Marsh Posté le 03-06-2003 à 09:01:41    

MagicBuzz a écrit :

bah...
Sinon, en ASP, chais pu s'il existe une fonction isNumeric.


oui


---------------
.: Clône de Drasche .:. Ebichuleys .:. Avec l'Aloe Vera je fais de beaux cacas [:dawa] .: www.oserselancer.com :.
Reply

Marsh Posté le 03-06-2003 à 09:11:44    

dis moi magicbuzz, ta fonction marche bien, mais je ne comprend pas ton goto 0?  :??:

Reply

Marsh Posté le 03-06-2003 à 09:12:43    

il doit y avoir un label 0 quelque part...
J'y connais rien en asp, mais d'instinct : lbl 0 par exemple...
 
 
edit: on appelle ca une redirection sur erreur : on error goto 0


Message édité par backdafuckup le 03-06-2003 à 09:13:03
Reply

Marsh Posté le 03-06-2003 à 09:16:31    

Ouaip, je connais bien ca, mais justement, il me donne une fonction avec un goto sans lbl, c'est pour ca que je ne comprend pas :/

Reply

Marsh Posté le 03-06-2003 à 09:19:02    

il peut pas non plus taper la fonction à ta place avec ton clavier !
 
Si tu traites les erreurs, tu crées un label !
Si tu ne les traite pas, alors tu enlèves la clause On error [:spamafote]

Reply

Marsh Posté le 03-06-2003 à 09:27:45    

Arf, alors je l'enleve, j'aime pas les goto  :D

Reply

Marsh Posté le 03-06-2003 à 10:12:21    

gothico a écrit :

Dsl, avec le cast, ca me fait ca :

[Microsoft][ODBC SQL Server Driver][SQL Server]'cast' n'est pas un(e) nom de fonction intégrée reconnu(e).




 
:??: C'est quelle version de SQL Server :??:
 
J'ai jamais utilisé vraiment le 6.5, mais avec le 7.0 et le 2000, ça marche très bien, c'est dans la MSDN Library d'avril 1999 (donc pour SQL Server 7.0 et quelques topics dédiés à SQL Server 2000). Cette fonction est documentée dans le "Online Workbook" (aide en ligne de SQL Server que je te recommende d'utiliser) à la même page que convert.

Reply

Marsh Posté le 03-06-2003 à 10:19:02    

C'est la version 7, mais j'ai réussi nickel avec convert  ;)  
Et puis, j'ai trouvé une autre solution qui marche po mal aussi  :whistle:

Reply

Marsh Posté le 03-06-2003 à 10:27:59    


on error resume next
=> Traduction littérale : "en cas d'erreur, continue au suivant". Cela correspond un peu à un "try" en C, sauf que ça s'applique à tous le code suivant, dans le scope. Si une erreur se produit, alors l'objet "err" se remplit avec, et le script continue normalement son éxécution. (numéro d'erreur, code d'erreur, objet source etc.)
 
Le problème, c'est que contrairement à un "try", le scope n'est pas défini, et du coup ça va s'appliquer à tout le reste de la fonction/procédure ou même tout le script si tu as écrit ça dans la partie commune du script.
 
Le "on error goto 0" permet de forcer l'interpréteur à planter à nouveau en cas d'erreur. Il n'y a pas de label "0", c'est une instruction telle qu'elle. Si tu tentes de mettre un autre label, tu auras une erreur, VBS/ASP ne supportant pas les goto.
 
Il est extrêment recommandé de mettre un "on error goto 0" dès que la partie contenant l'erreur à tester est finie. A 80% de mon boulot, je fais de la maintenance sur des sites ASP. Plus d'un bug sur deux (donc certains sont ultra grave, genre vidange totale de la base pour une raison inconnue) sont dûs à des "on error resume next" non neutralisés par un "on error goto 0". En effet, l'endroit sensible ne plante pas, donc on ne rentre pas dans la gestion d'erreur, mais un peu plus loin dans le code on fait une erreur qu'on ne trappe pas. Résultat, à cause du "on error resume next", le script continue normalement comme s'il ne s'était produit aucune erreur.
 
C'est ainsi qu'un script d'un client vidait toutes les tables une à une de la base, puis était censé les remplir à partir d'autres requêtes. Pas de chance, suite à une mise à jour de leur SGBD, la moitiée des requêtes d'alimentation ne fonctionnaient plus, et provoquaient une erreur. A cause d'un "on error resume next" placé au moment de la connection à la base, aucune erreur n'était levée, et ils ne comprennaient pas pourquoi le script vidait la base sans rien remettre dedans. On leur à vendu 5 jours pour corriger l'erreur, pensant à un gros souci de compatibilité au niveau de la nouvelle plateforme. Au bout de 10 minutes j'avais fini, j'ai mis un "on error goto 0" et me suis apperçu que les requêtes se basant sur la date ne fonctionnaient plus, car les paramètres du nouveau serveur n'était plus les mêmes qu'avant :sarcastic:
 
Donc voilà, j'espère que tu as bien compris ce que c'est, et que surtout, tu en mettras systématiquement :)
 
PS: L'objet "err" contient la dernière erreur, et la liste des numéros d'erreurs de toutes les erreurs précédentes. Si tu veux tester plusieurs fois de suite si une erreur se produit, et que tu ne veux pas t'amuser à connaître les numéros d'erreur, alors fait simplement un "err.clear" à la fin de chaque test : cela va réinitialiser l'objet d'erreur, afin de ne pas rentrer dans tes conditions d'erreur même si les lignes suivantes ne lèvent pas d'erreur.
 
Exemple :
 

a = 2
on error resume next
a = 1 / 0
if err <> 0 then
     Response.Write "Division par zéro !"
end if
a = a * 1
if err <> 0 then
     Response.Write "a n'est pas un nombre !"
end if
set a = nothing
if err <> 0 then
     Response.Write "a n'est pas un objet !"
end if
on error goto 0


 
=> Ca va afficher tous les messages d'erreur, alors que le second test est bon.
 

a = 2
on error resume next
a = 1 / 0
if err <> 0 then
     Response.Write "Division par zéro !"
end if
err.clear
a = a * 1
if err <> 0 then
     Response.Write "a n'est pas un nombre !"
end if
set a = nothing
err.clear
if err <> 0 then
     Response.Write "a n'est pas un objet !"
end if
on error goto 0


=> Seuls les vrais erreurs seront levées (première et troisième)


Message édité par MagicBuzz le 03-06-2003 à 10:29:12
Reply

Marsh Posté le 03-06-2003 à 10:29:50    

backdafuckup a écrit :

il peut pas non plus taper la fonction à ta place avec ton clavier !
 
Si tu traites les erreurs, tu crées un label !
Si tu ne les traite pas, alors tu enlèves la clause On error [:spamafote]


Y'a PAS de label en ASP

Reply

Marsh Posté le 03-06-2003 à 10:31:11    

backdafuckup a écrit :

il peut pas non plus taper la fonction à ta place avec ton clavier !
 
Si tu traites les erreurs, tu crées un label !
Si tu ne les traite pas, alors tu enlèves la clause On error [:spamafote]


Non non, la fonction, je l'ai écrite exprès pour ce topic, moi j'ai pas ce genre de problèmes, quand j'ai un nombre je sais que c'est un nombren et idem pour les chaînes de caractères :D

Reply

Marsh Posté le 03-06-2003 à 10:32:22    

MagicBuzz a écrit :


Y'a PAS de label en ASP


je sais pas, j'y connais rien en asp... [:spamafote]

Reply

Marsh Posté le 03-06-2003 à 10:33:43    

backdafuckup a écrit :


je sais pas, j'y connais rien en asp... [:spamafote]


Bah maintenant tu sais :D

Reply

Marsh Posté le 03-06-2003 à 10:38:36    

Je m'en v remettre le "on error goto 0"  :D  
 :whistle:

Reply

Marsh Posté le 03-06-2003 à 10:41:04    

Bon, ben tout marche maintenant, non ?

Reply

Marsh Posté le 03-06-2003 à 10:55:32    

Yep  ;)  
http://60gp.ovh.net/~metalfor/mf/forumphp/images/smiles/merci.gif

Reply

Marsh Posté le    

Reply

Sujets relatifs:

Leave a Replay

Make sure you enter the(*)required information where indicate.HTML code is not allowed