Forum de discussion
Forum « Programmation ASP » (archives)
Re: recherche dans bd
Envoyé: 8 août 2003, 11h07 par Oznog
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
|