methodmay31
Messages postés45Date d'inscriptionjeudi 16 juin 2005StatutMembreDernière intervention 6 mai 2006
-
15 mars 2006 à 12:18
methodmay31
Messages postés45Date d'inscriptionjeudi 16 juin 2005StatutMembreDernière intervention 6 mai 2006
-
16 mars 2006 à 09:50
Bonjour a Tous
g un petit probleme avec une connection a une base de donnée voila mon code
Sub maxkeyNumCandidat(ByVal maxcand As Integer)
Dim db As Connection
Dim Max As Recordset
Set db = Connection
db.CursorLocation = adUseClient
db.Open "PROVIDER =Microsoft.Jet.OLEDB.4.0;Data Source='" & CheminBase & "';"
Set Max = New Recordset
Max.Open "Select (max(NumCandidat)+1) as cand from Candidat", db, adOpenStatic, adLockOptimistic
While Not Max.EOF
Candid = Max![cand]
Max.MoveNext
Wend
maxcand = Candid
End Sub
Je ne compren pas pourquoi la ligne gras bloque ..
quand j'affiche l'aide Vb me parle toujours de la librairie MSDN que je n'ai pas est ce que l'erreur vient vraimen du fait qu'il me manque cette libraire ??
On ma parlé aussi de msdn Online ? Ou puis je trouver ca sur le web ?
methodmay31
Messages postés45Date d'inscriptionjeudi 16 juin 2005StatutMembreDernière intervention 6 mai 2006 15 mars 2006 à 12:20
Cette procédure sert en fait a prendre le dernier identifiant inscrit dans la BDD et de lui ajouter un pour pouvoir insérer des données a l'identifiant +1 ds la BDD
rvblog
Messages postés792Date d'inscriptionvendredi 4 mars 2005StatutMembreDernière intervention12 juin 20127 15 mars 2006 à 12:28
Salut MethodMay31,
je n'ai pas essayé d'exécuter ton code, je ne l'ai que lu.
essayes déjà :
Set db = New Connection 'il s'agit de créer une instance et la référencer, donc opérateur New, à moins que Connection soit une variable globale, ce dont je doute.
en plus, conseil pour le long terme, écrit plutôt :
Dim db As ADODB.Connection
Dim Max As ADODB.Recordset
et
Set db = New ADODB.Connection
Set Max = New ADODB.Recordset
Pendant que j'y suis, ton maxcand ne renverra pas son résultat, car il faut déclarer :
ByRef maxcand As Integer
Voilà,
pour info, la librairie MSDN n'est pas une bibliothèque de liaison dynamique (dll) manquante, mais une vraie bibliothèque électronique, toute aussi manquante pour toi, contenant un savoir-faire étonnant, et une base de connaissance époustoufflante, et on peut l'acheter auprès de Microsoft ou de ses revendeurs.
rvblog
Messages postés792Date d'inscriptionvendredi 4 mars 2005StatutMembreDernière intervention12 juin 20127 15 mars 2006 à 12:38
C'est encore moi,
je viens de lire ton 2ème message, et j'ajoute:
si tu n'as pas trop avancé dans ton développement, et que tu es l'architecte de la base de données, et que CheminBase pointe vers une Base Access, tu pourrais avoir le champ cand (qui d'ailleurs aurait mieux fait de s'appeler CANDIDATS.Id, c'est plus parlant et plus conventionné, mais ça, c'est moi qui le dit) de type NuméroAuto, ce qui aurait pour effet immédiat de ne pas avoir à te préoccuper du prochain identifiant disponible avant de faire une insertion d'un nouveau candidat.
methodmay31
Messages postés45Date d'inscriptionjeudi 16 juin 2005StatutMembreDernière intervention 6 mai 2006 15 mars 2006 à 12:47
Je part en fait d'un existant et de tré peu de connection en VB puisque j'ai commencé lundi a coder en VB
Je ne suis donc par l'architecte de la BDD en question Mais je doi adapter cette appli a l'entreprise qui m'embauche en tan que stagiaire donc je pren en note ta remarque et ds ma prochaine Bdd le champ sera auto incrémenté
rvblog
Messages postés792Date d'inscriptionvendredi 4 mars 2005StatutMembreDernière intervention12 juin 20127 15 mars 2006 à 13:05
Pour résumer le adUseClient te donne un curseur côté client, ce qui veut dire que tu ne peux l'utiliser qu'en lecture seule.adUseNone, pas de curseur, adUseServer, côté serveur, et adUseClientBatch, je ne sais pas, je crois que c'est obsolète.
Ensuite, je persiste avec mon conseil de ADODB.Connection (et idem pour Recordset). Pourquoi?
L'objet Data Access Object (DAO) implémente aussi un objet Connection, mais il n'implémente pas de propriété CursorLocation (et si tu l'utilise, VB te dira "erreur de compilation Méthode ou membre de donnée introuvable....").
Vérifies dans tes références de projet quel est l'objet que tu utilise DAO ou ADO?
PhilocheMan
Messages postés55Date d'inscriptionjeudi 28 juillet 2005StatutMembreDernière intervention23 mars 20061 15 mars 2006 à 13:59
Pour la propriété CursorLocation, j'ai trouvé qu'elle permettait de définir (ou de retourner) le type de curseur utilisé, soit :
adUseServer (par défaut) : pour utiliser le curseur fourni par le driver ou le data utilisé
ou
adUseClient : pour utiliser le curseur local "côté client"
Il est dit aussi que cette propriété doit être fixée avant d'établir la connection, sinon cela reste sans effet.
Pour être complet, cette propriété existe pour l'objet Collection MAIS AUSSI pour l'objet RecordSet.
Je peux me tromper, mais dans ton exemple (Base de donnée JET), je ne crois pas qu'on puisse gérer des curseurs... A voir...
BasicInstinct
Messages postés1470Date d'inscriptionmardi 5 février 2002StatutMembreDernière intervention20 octobre 201412 15 mars 2006 à 14:14
db.Open "PROVIDER=Microsoft.Jet.OLEDB.4.0;Data Source='" & CheminBase & "';"
Set Max = New Recordset
Max.CursorLocation = adUseClient ' sur le recordset, pas sur la connection.
Max.Open "Select (max (NumCandidat)+1) as cand from Candidat", db, adOpenStatic, adLockOptimistic
Candid = Max![cand] 'ta requete ne revoyant qu'une valeur, il n'est pas utile de parcourir le recordset
'perso je prefere l'ecriture
Candid = Max("cand") 'quand j'ai plusieurs champs
'sinon das ton cas, j'ecris
Candid=Max(0)
methodmay31
Messages postés45Date d'inscriptionjeudi 16 juin 2005StatutMembreDernière intervention 6 mai 2006 15 mars 2006 à 15:21
meme erreur que ce dessus avec db.Open "PROVIDER=Microsoft.Jet.OLEDB.4.0;Data Source='" & CheminBase & "';" je ne compren pas tro si vous pouviez m'aider ??
methodmay31
Messages postés45Date d'inscriptionjeudi 16 juin 2005StatutMembreDernière intervention 6 mai 2006 15 mars 2006 à 15:34
Dim baseCV As New ADODB.Connection 'connection à la base de données des CV.
Public Sub EtablirConnection()
baseCV.Provider = "Microsoft.Jet.OLEDB.4.0"
baseCV.ConnectionString = CheminBase
baseCV.Open
End Sub
Public Sub FermerConnection() ' fermeture de la base de donnée des CV.
baseCV.Close
End Sub
Sub maxkeyNumCandidat(ByRef maxcand As Integer)
Dim db As ADODB.Connection
Dim Max As ADODB.Recordset
Set db1 = New ADODB.Connection
Set Max1 = New ADODB.Recordset
Max1.CursorLocation = adUseClient
db.Open "PROVIDER=Microsoft.Jet.OLEDB.4.0;Data Source='" & CheminBase & "';"
Max1.CursorLocation = adUseClient ' sur le recordset, pas sur la connection.
Max.Open "Select (max (NumCandidat)+1) as cand from Candidat", db, adOpenStatic, adLockOptimistic
While Not Max.EOF
Max .CursorLocation = adUseClient 'pas max1' sur le recordset, pas sur la connection
Max.Open "Select (max (NumCandidat)+1) as cand from Candidat", db, adOpenStatic, adLockOptimistic
If Not Max.EOF then
Candid = Max.fields("cand").value
End if
maxcand = Candid
Max.Close 'n'oublie pas
Set Max = Nothing 'n'oublie pas non plus
End Sub
En plus BasicInstinct a raison, pas besoin d'itérer (while wend) tu n'as qu'une réponse dans le recordser (le max), mais vérifies quand même Not Max.EOF. Le CursorLocation sur la connection, c'est tout aussi possible, mais cela n'affecte pas le curseur du Recordset, donc aussi sur le Recordset. Enfin, dans le cadre de la portabilité VB.Net, il faut mieux spécifier Max. fields ("ezreorfozei").value.
Je ne m'attendais pas à tant de code, mais, cela fait apparaître que tu as une connection globale baseCV. Donc remplace
Set db = New ADODB.Connection
par
Set db = baseCV
et ne refait pas db.Open, elle est déjà ouverte (umm, si elle est bien ouverte).
rvblog
Messages postés792Date d'inscriptionvendredi 4 mars 2005StatutMembreDernière intervention12 juin 20127 15 mars 2006 à 16:50
mets un point d'arrêt sur le db.open et vérifie ce qui se trouve dans CheminBase.
point d'arrêt = click gauche dans la barre verticale grise à gauche dans le panneau de code (jusqu'à ce qu'un point rouge apparaisse), sur la ligne concernée.
Puis tu exécutes le code, et quand il s'arrête, tu promènes ta souris sur la variable CheminBase, tu attends que l'infobulle apparaisse, et tu regardes le contenu.
il est bien possible, si on voit là tout ton code, que cette variable ne soit pas initialisée.
ne supprime pas tout de suite la ligne db.open, mais plus tard, quand cela marchera, tu vérifieras si la portion de code EtablirConnection est exécutée, et si elle ouvre bien la baseCV (mais plus tard, c'est pas le problème du moment)
BasicInstinct
Messages postés1470Date d'inscriptionmardi 5 février 2002StatutMembreDernière intervention20 octobre 201412 15 mars 2006 à 16:53
Perso je le coderai plutot comme ca :
Function maxkeyNumCandidat() as long 'renvoie le nouveau numero a attribuer ou -1 en cas d'echec
Dim Max As NEW ADODB.Recordset
on error goto Suite
Max.Open "Select (max (NumCandidat)+1) as cand from Candidat", baseCV 'pourquoi redéclarer une nouvelle connexion ?
maxkeyNumCandidat=Max(0)
Set Max = Nothing
exit function
Suite:
maxkeyNumCandidat=-1