Problème VB6 at ADO - Programmation
Marsh Posté le 12-02-2001 à 09:06:15
dis-moi, es-tu obligé de passer par un find ?
je te proposerai plutôt un
recordser.open "select * from table1 where champ1 like '" & valeur & '"'
à condition que ton recordset soit fermé avant
sinon, utilise un recordset temporaire qui te servira toujours pour ce genre d'utilisation !
sinon, le find m'embête ...
Marsh Posté le 12-02-2001 à 09:21:03
Moi le find ne m'embête pas
Je l'ai même testé un certain nombre de fois, pas de problème
Une piste: ton champ ne serait pas du string par hasard, auquel cas:
champs = '" & valeur & "'"
Marsh Posté le 12-02-2001 à 09:24:10
je remarque qu'à l'affichage, il y a un problème entre ' et "" quand ils sont accolés comme dans '" ou "'", non ?
mais pas à l'édition du message !
--Message édité par Hepil--
Marsh Posté le 12-02-2001 à 11:22:04
Bon, 2 points...
1) Ne jamais faire à la main les '...
En effet, je jour où il y a une appostrophe, ben proutch !
Créer une fonction quote...
function Quote(str)
if cstr(str) <> "" then
Quote = "'" & replace(str, "'", "''" ) & "'"
else
Quote = "''"
end if
end function
2) Le find est à banir...
Seuls rs.open et cnx.execute doivent être utilisés.
Pkoi ? Tout simplement pour deux raisons principales...
a- Votre code sera peut-être un jour repris dans un langage qui ne supporte pas les options avancées des reccordsets de VB.
b- Selon la version des drivers ODBC, du SGDB et de la requête, les résultats peuvent être différents...
Même le reccordcount est à banir...
Je ne retrouve plus l'article, mais grosso-modo, les drivers ADO ODBC 2.0 pour SQL Server et Oracle sont buggés, et lors d'une jointure, une grande partie des propriétés des recordsets partent en live (notamment recordcount = -1)
Note: Pour voir si un RS est vide ou non, à tout moment, vous pouvez faire :
if rs.EOF and rs.BOF then
' le recordset est vide
else
' le recordset contient au moins un élément
end if
--Message édité par MagicBuzz--
Marsh Posté le 12-02-2001 à 11:38:23
sinon, aussi, met des '%' devant et après ta valeur...
il y a peut-être des espaces cachés (selon les types, les SGBD en rajoutent parfois)
Marsh Posté le 12-02-2001 à 12:16:27
Merci pour tes éclaircissements
Mais, à mon avis, faut pas se prendre la tête pour 2 ou 3 bugs dans des cas particuliers
"Seuls rs.open et cnx.execute doivent être utilisés"
je sais que Microsoft c'est pas des dieux, mais quand même, ne pas utiliser les 99 % des fonctionnalités de ADO, c'est un peu exagéré
On a le droit au rs.MoveNext quand même, parce que sinon se taper toutes les lignes une par une
Marsh Posté le 12-02-2001 à 14:51:14
Oui...
Mais moi, je ne fais que ressortir bêtement les différentes infos que j'ai pu lire dans MSDN (doc officielle de M$)
seuls rs.movenext et rs.movefirst doivent être utilisés pour se déplacer des les rs.
Seuls rs.EOF et rs.BOF doivent être utilisés pour savoir où on est.
seule cnx.execute doit être utilisée pour éxécuter des requêtes muettes (INSERT, UPDATE, DELETE, ...)
seule rs.open doit être utilisée pour éxécuter des requêtes retournant un résultat (SELECT)
il ne faut ouvrir des recordset qu'avec les propriété FORWARD_ONLY, et LOCKED (pas de rs.update, etc. dispo)
En effet, car le jour où plusieurs personnes sont connectées à la base en même temps, des modifs peuvent avoir lieu dans la base. Donc les RS ne sont plus des vues exactes de la base, ce qui risque de faire des choses inatendues et des erreures...
deplus modifier le résultat d'un select par exemple ne fait absolument pas partie du standard SQL (sur lequel se base ODBC) donc d'une version de pilotes à l'autre il y a de grandes chances que les fonctions ne fonctionnement pas correctement.
et surtout pense toujours qu'un jour ton appli (même si c'est un petit truc à la con) risque d'être portée sur un autre OS/La,gage/SGDB, donc plus tu restes dans les fonctions standard, moins tu risque d'avoir de soucis d'intégration.
Marsh Posté le 12-02-2001 à 15:15:53
je confirme le tout ( quelle référence ! )
j'ai testé tout ça et suis tombé sur les problèmes et les mêmes conclusions !
Marsh Posté le 13-02-2001 à 12:56:21
Merci pour les infos
Je viens de me choper au moins 1 an d'expérience
Marsh Posté le 11-02-2001 à 21:11:43
J'exécute l'instruction suivante :
adodc1.recordset.find "champs = " & valeur, , , 1
le '1' c'est pour qu'il commence tj la recherche à partir du premier record, et il me dit qu'il est en EOF alors que je suis sûr que le record recherché existe ????