OVH Cloud OVH Cloud

Récupérer sous ADO un numéro auto

3 réponses
Avatar
Lapin
Bonsoir,

Je travaille avec MSDE et ADO (VB).
J'ai une table avec une clé primaire en numéro auto.

Comme la table contient enormément d'enregistrements, j'utilise à
l'ouverture pour ajouter un enregistrement un curseur côté serveur.

Après un addnew et le update correspondant, je ne peux pas récupérer la
valeur du nouveau numéro auto généré (lors de l'update et pas du addnew si
j'ai bien suivi...).
Par contre ça marche avec un curseur côté client.

Donc, y a t'il un poyen avec un curseur coté serveur de récupérer cette
information ?
Sinon, avec une table enorme, comment l'ouvrir pour simplement ajouter un
enregistrement sans que ça mouline pendant 2 heures (ce qui arrive avec un
curseur coté client...) ??!

Merci de vos conseils !

3 réponses

Avatar
Sylvain Lafontaine
Utilisez toujours de préférence un curseur côté client.

Si cela mouline pendant 2 heures, c'est fort probablement parce que vous
avez des problèmes de choix de settings mais comme vous n'indiquez rien sur
la procédure suivie, impossible d'en dire plus ici.

Selon le type de curseur sélectionné, son côté, la couche de travail (DAO ou
ADO) et les options choisies; il est possible de retirer le numéro auto
généré avant l'update, après l'update, après l'update mais avec un retour
sur l'enregistrement (le curseur ayant changé de position après l'update) ou
jamais.

Voici un court exemple; notez l'utilisation du WHERE 1=0 pour retourner un
recordset vide:

sql = " SELECT t_Rapports.* FROM t_Rapports WHERE 1=0"
rs.Open sql, StlRapports, adOpenKeyset, adLockOptimistic, adCmdText
rs.AddNew
rs.Fields ("NomUsager") = NomUsager
rs.Update
ValeurAutogere = rs ("Id")
rs.close

Dans cet exemple, j'ai écrit un adOpenKeyset mais c'est probablement un
oubli de ma part, les curseurs côté client étant statiques (façon de parler
puisqu'il ne s'agit pas de la même chose que pour adOpenStatic) mais je n'ai
pas le temps de vérifier.

S. L.

"Lapin" wrote in message
news:eWicquL$
Bonsoir,

Je travaille avec MSDE et ADO (VB).
J'ai une table avec une clé primaire en numéro auto.

Comme la table contient enormément d'enregistrements, j'utilise à
l'ouverture pour ajouter un enregistrement un curseur côté serveur.

Après un addnew et le update correspondant, je ne peux pas récupérer la
valeur du nouveau numéro auto généré (lors de l'update et pas du addnew si
j'ai bien suivi...).
Par contre ça marche avec un curseur côté client.

Donc, y a t'il un poyen avec un curseur coté serveur de récupérer cette
information ?
Sinon, avec une table enorme, comment l'ouvrir pour simplement ajouter un
enregistrement sans que ça mouline pendant 2 heures (ce qui arrive avec un
curseur coté client...) ??!

Merci de vos conseils !




Avatar
Lapin
Merci de votre réponse.
En ce qui concerne les settings:
J'ai une table de 500.000 enregistrements sur 20 champs environ.
Je veux juste ajouter une ligne et récupérer le numauto généré.
Si j'utilise rs.CursorLocation­UseClient alors le code suivant fonctionne
mais *l'ouverture* de la table prend plusieurs très longues secondes.
Au contraire, c'est instantané avec un adUseServer, mais là, plus moyen de
récupérer le numéro auto généré.

rs.open "Table",adOpenStatic,adLockPessimistic,adCmdTable
rs.addnew
rs.fields("toto")=1
rs.update
rs.close

Merci !



"Sylvain Lafontaine" <sylvain aei ca (fill the blanks, no spam please)> a
écrit dans le message de news:uzjJ$hP$
Utilisez toujours de préférence un curseur côté client.

Si cela mouline pendant 2 heures, c'est fort probablement parce que vous
avez des problèmes de choix de settings mais comme vous n'indiquez rien


sur
la procédure suivie, impossible d'en dire plus ici.

Selon le type de curseur sélectionné, son côté, la couche de travail (DAO


ou
ADO) et les options choisies; il est possible de retirer le numéro auto
généré avant l'update, après l'update, après l'update mais avec un retour
sur l'enregistrement (le curseur ayant changé de position après l'update)


ou
jamais.

Voici un court exemple; notez l'utilisation du WHERE 1=0 pour retourner un
recordset vide:

sql = " SELECT t_Rapports.* FROM t_Rapports WHERE 1=0"
rs.Open sql, StlRapports, adOpenKeyset, adLockOptimistic, adCmdText
rs.AddNew
rs.Fields ("NomUsager") = NomUsager
rs.Update
ValeurAutogere = rs ("Id")
rs.close

Dans cet exemple, j'ai écrit un adOpenKeyset mais c'est probablement un
oubli de ma part, les curseurs côté client étant statiques (façon de


parler
puisqu'il ne s'agit pas de la même chose que pour adOpenStatic) mais je


n'ai
pas le temps de vérifier.

S. L.

"Lapin" wrote in message
news:eWicquL$
> Bonsoir,
>
> Je travaille avec MSDE et ADO (VB).
> J'ai une table avec une clé primaire en numéro auto.
>
> Comme la table contient enormément d'enregistrements, j'utilise à
> l'ouverture pour ajouter un enregistrement un curseur côté serveur.
>
> Après un addnew et le update correspondant, je ne peux pas récupérer la
> valeur du nouveau numéro auto généré (lors de l'update et pas du addnew


si
> j'ai bien suivi...).
> Par contre ça marche avec un curseur côté client.
>
> Donc, y a t'il un poyen avec un curseur coté serveur de récupérer cette
> information ?
> Sinon, avec une table enorme, comment l'ouvrir pour simplement ajouter


un
> enregistrement sans que ça mouline pendant 2 heures (ce qui arrive avec


un
> curseur coté client...) ??!
>
> Merci de vos conseils !
>
>




Avatar
Lapin
Peut-on utiliser sans risque, pour faire un Addnew via ADO, votre méthode
(qui fonctionne semble t'il parfaitement) qui consiste à ouvrir non pas en
adCmdTabel mais avec un "SELECT * FROM Table1 WHERE Champ1=0" où Champ1 est
la clé primaire avec un num_auto (donc jamais =0), le tout avec un curseur
côté client ?
Je veux dire par là, rien à savoir d'autre de particulier ?

Merci bien.

"Sylvain Lafontaine" <sylvain aei ca (fill the blanks, no spam please)> a
écrit dans le message de news:uzjJ$hP$
Utilisez toujours de préférence un curseur côté client.

Si cela mouline pendant 2 heures, c'est fort probablement parce que vous
avez des problèmes de choix de settings mais comme vous n'indiquez rien


sur
la procédure suivie, impossible d'en dire plus ici.

Selon le type de curseur sélectionné, son côté, la couche de travail (DAO


ou
ADO) et les options choisies; il est possible de retirer le numéro auto
généré avant l'update, après l'update, après l'update mais avec un retour
sur l'enregistrement (le curseur ayant changé de position après l'update)


ou
jamais.

Voici un court exemple; notez l'utilisation du WHERE 1=0 pour retourner un
recordset vide:

sql = " SELECT t_Rapports.* FROM t_Rapports WHERE 1=0"
rs.Open sql, StlRapports, adOpenKeyset, adLockOptimistic, adCmdText
rs.AddNew
rs.Fields ("NomUsager") = NomUsager
rs.Update
ValeurAutogere = rs ("Id")
rs.close

Dans cet exemple, j'ai écrit un adOpenKeyset mais c'est probablement un
oubli de ma part, les curseurs côté client étant statiques (façon de


parler
puisqu'il ne s'agit pas de la même chose que pour adOpenStatic) mais je


n'ai
pas le temps de vérifier.

S. L.

"Lapin" wrote in message
news:eWicquL$
> Bonsoir,
>
> Je travaille avec MSDE et ADO (VB).
> J'ai une table avec une clé primaire en numéro auto.
>
> Comme la table contient enormément d'enregistrements, j'utilise à
> l'ouverture pour ajouter un enregistrement un curseur côté serveur.
>
> Après un addnew et le update correspondant, je ne peux pas récupérer la
> valeur du nouveau numéro auto généré (lors de l'update et pas du addnew


si
> j'ai bien suivi...).
> Par contre ça marche avec un curseur côté client.
>
> Donc, y a t'il un poyen avec un curseur coté serveur de récupérer cette
> information ?
> Sinon, avec une table enorme, comment l'ouvrir pour simplement ajouter


un
> enregistrement sans que ça mouline pendant 2 heures (ce qui arrive avec


un
> curseur coté client...) ??!
>
> Merci de vos conseils !
>
>