Trucsweb.com

Forum de discussion

 Forum « Programmation ASP » (archives)

Re: recherche dans bd

Envoyé: 8 août 2003, 11h07 par Oznog


Salut,

Avant tout n'oublie pas que le VBS n'y peut rien. Le VBS ne fait qu'utiliser ADO qui lui passe une requête SQL à la basse de données. Enfin c'est transparent pour le programmeur. Pour bien comprendre les processus, voir la série de tutoriel sur "ActiveX® Data Objects (ADO)" (http://www.trucsweb.com/ASP/trucs.asp?no=176&type=7)

Il y a plusieurs façon de faire.
Tu as le choix entre la méthodes "AddNew" ADO ou le SQL "Insert".

Dans les deux cas tu peux tester la présence de l'enregistrement avec la commande SQL "select". Si l'enregistrement existe tu ne l'ajoute pas, sinon tu l'ajoute avec la méthode de ton choix.

Pour la requête SQL "insert" tu peux directement l'ajouter sans faire de test. Si la base est bien montée, c'est à dire que tyu ne permet pas de "doublon" ne de valeur vide, l'ajout ne se fera pas. C'est à toi de gérer alors l'erreur.

Ex: avec Insert sans test.

Dim oConn, oAjout, sSQL, sMess, sNom

Const adOpenKeyset = 1
Const adLockOptimistic = 3

sNom = request.queryString("hNom")
sMess = "Une erreur inconnue c'est produite!"

On Error Resume Next
Set oConn = Server.CreateObject("ADODB.Connection")
oConn.Open sConnect 'Chaine de connexion
Set oAjout = Server.CreateObject("ADODB.Recordset")
sSQL = "insert into t_clients (nom) values ('" & sNom & "')"
oAjout.Open sSQL, oConn, adOpenKeySet, adLockOptimistic
If Err.Number <> 0 Then
Select Case Err.Number
CASE -2147217900 sMess = "Erreur : Le nom " & sNom & " existe déjà dans la base de données!"
CASE -2147467259 sMess = "Erreur : Vous devez entrer un nom!"
End Select
else
sMess = "Merci<br>Le nom " & sNom & " a été ajouté dans la base de données!"
End If
response.write sMess

oAjout.Close
Set oAjout = Nothing
oConn.Close
Set oConn = Nothing

Le problème avec cette méthode rapide et simple à gérer est que l'index est automatiquement incrémenté. C'est à dire que si j'ai une erreur (même si le nouvel enregistrement n'a pas été ajouté) l'index sera incrémenté.

Ainsi si j'en suis au 110 enregistrement, si je fais 20 erreur par la suite. L'enregistrement suivant le 110 sera le numéro 130. Il faut donc compacter la base pour refaire un index qui se suit. Non seulement pour les destruction mais pour toutes les erreur.

Exemple d'un test avant l'ajout.

sSql = "SELECT nom FROM t_clients WHERE nom = '"&sNom&"'"
set oAjout = oConn.Execute(sSql)
If oAjout.EOF then
' Ajoute l'enregistrement avec AddNew ou Insert à ton choix
' Exemple avec AddNew
oAjout.AddNew
oAjout.Fields("nom") = Request.form("hNom")
else
' Oups, l'enregistrement est déjà dans la base
end if

Avec cette méthode, tu as deux requètes car tu devra ouvrir un nouveau pointeur pour ajouter l'enregistrement. C'est donc un peu plus long mais ton index ne changera pas et tu n'a même pas besoin de spécifier dans la base de données que le champ ne supporte pas les doublons! Je te conseil quand même cette méthode.

Note que dans mes exemple je ne fait pas de validation ne de convertion pour la requête SQL. Cette requiête est une simple chaîne de caractères envoyé à ADO. Si tu as des double guuillemets tu provoquera une erreur car dans la chaine c'est comme un caractère de fin de chaine quand c'est tout sinmplement un double guillements.

Donc, l'idéale :

1. Premièrement tester en Javascript si le nom a bien été entré.

2. Refaire cette validation en VBS côté serveur après l'envoie du formulaire.

if request.form("nom") <> ""...

3. Même chose pour tout les champs mais tu dois tester aussi manuellement les nombres, réel ou Integer, les date, les boléenne etc.

4. Et enfin doubler les doubles guillemets pour éviter une erreur.

nom = replace(request.form("nom"), ""","""")

Note que c'est simplement pour une requète SQL ex:

"SELECT titre FROM table WHERE mon titre avec "des guillemets" ORDER by titre"

Provoque une erreur alors que:

"SELECT titre FROM table WHERE mon titre avec ""des guillemets doublé"" ORDER by titre"

Aucune erreur.

En d'autre mots :
"SELECT titre FROM table WHERE " & replace(monTitre,""","""") & " ORDER by titre"

Mais PAS dans l'ajout lui même car tu va avoir dans ta base tout les double guillemets "DOUBLÉS"! ce qui n'est la le but. Exemple

oAjout.AddNew
oAjout.Fields("titre") = Request.form("monTitre")

Ceci fonctionne très bien même si j'ai des double guillemets dans ma chaîne.

Voilà, j'ai passer à peu près tout en détail. Essai erreur et tu va y arriver.

Ciao
Oznog


Réponses

 Aucune réponse à ce message... 
Aucun médias sociaux
X

Trucsweb.com Connexion

Connexion

X

Trucsweb.com Mot de passe perdu

Connexion

X

Trucsweb.com Conditions générales

Conditions

Responsabilité

La responsabilité des Trucsweb.com ne pourra être engagée en cas de faits indépendants de sa volonté. Les informations mises à disposition sur ce site le sont uniquement à titre purement informatif et ne sauraient constituer en aucun cas un conseil ou une recommandation de quelque nature que ce soit.

Aucun contrôle n'est exercé sur les références et ressources externes, l'utilisateur reconnaît que les Trucsweb.com n'assume aucune responsabilité relative à la mise à disposition de ces ressources, et ne peut être tenue responsable quant à leur contenu.

Droit applicable et juridiction compétente

Les règles en matière de droit, applicables aux contenus et aux transmissions de données sur et autour du site, sont déterminées par la loi canadienne. En cas de litige, n'ayant pu faire l'objet d'un accord à l'amiable, seuls les tribunaux canadien sont compétents.

X

Trucsweb.com Trucsweb

X

Trucsweb.com Glossaire

X

Trucsweb.com Trucsweb

X

Trucsweb.com Trucsweb

Conditions

Aucun message!

Merci.

X
Aucun message!
X

Trucsweb.com Créer un compte

Créer un compte

.
@