OVH Cloud OVH Cloud

Pb with ADO

6 réponses
Avatar
Alain79
J'utilise ADO pour extraire des données d'un Classeur et cela fonctionne
fort bien mais il y a un mais...
Lorsque plusieurs utilisateurs active la fonction en même temps à partir de
leur propre machine, Excel génère des "Catastrophic error" rien que cela...

Aurais-je loupé quelquechose dans la façon d'établir la connexion et dans
celle de récupéper les données - genre pas bien précisé que je ne voulais
faire que de la lecture...

Ou alors est-ce tout simplement innévitable...

Le fichier attaqué est un classeur Excel (partagé) situé sur un serveur
Le code de connexion est le suivant
-> Set updADOConnection = New ADODB.Connection
-> With updADOConnection
-> .ConnectionString = _
-> "Provider=Microsoft.Jet.OLEDB.4.0;" & _
-> "Data Source=" & updRefSourceFile_path & ";" & _
-> "Extended Properties=Excel 8.0;"
-> .CursorLocation = adUseClient
-> .Open
-> End With
La récup de data se faisan avec:
- .Open Source:=SqlStringSeq, ActiveConnection:=Connection
ou SqlStringSeq est une string préparée à l'avance

Merci vous
Alain79

6 réponses

Avatar
MichDenis
Bonjour Alain79,

As-tu essayé quelque chose dans le genre :

J'ai ajouté ceci à ta connexion : Mode = adModeWrite

Et j'ai ajouté une gestion d'erreur, peut être nous donnera-t-elle plus d'informations sur ce qui ne va pas.

Si tu résout la problématique, j'aimerais bien que tu publies la solution.

'------------------------------------
Sub LaProcedure()

Dim Gestion_Error As String
On Error GoTo Gestion_Erreur

Set updADOConnection = New ADODB.Connection
With updADOConnection
'Users can not write data
.Mode = adModeWrite
.ConnectionString = _
"Provider=Microsoft.Jet.OLEDB.4.0;" & _
"Data Source=" & updRefSourceFile_path & ";" & _
"Extended Properties=Excel 8.0;"
.CursorLocation = adUseClient
.Open
End With

'Pour ce qui est du curseur de ton recordset
'si c'est seulement pour importer des données
'Avant d'ouvrir le recordset
'rst.CursorType = adOpenForwardOnly

'recordset(rst)
Rst.Open [Source], updADOConnection, _
adOpenForwardOnly, adLockReadOnly, adCmdText

'..../....


Rst.Close
updADOConnection.Close
Set Rst = Nothing: Set updADOConnection = Nothing

Exit Sub
Gestion_Erreur:
Dim Erreur As ADODB.Error
For Each Erreur In updADOConnection.Errors
MsgBox "Erreur : " & Erreur.Description
Next

'Pour fermer le Recordset(rst)
If (Rst.State & adStateOpen) Then Rst.Close

'Pour fermer la connexion si elle est ouverte
If (updADOConnection.State & adStateConnecting) Then
updADOConnection.Close
End If
Set Rst = Nothing: Set updADOConnection = Nothing
Exit Sub

End Sub
'------------------------------


Salutations!




"Alain79" a écrit dans le message de news: cun9md$6mq$
J'utilise ADO pour extraire des données d'un Classeur et cela fonctionne
fort bien mais il y a un mais...
Lorsque plusieurs utilisateurs active la fonction en même temps à partir de
leur propre machine, Excel génère des "Catastrophic error" rien que cela...

Aurais-je loupé quelquechose dans la façon d'établir la connexion et dans
celle de récupéper les données - genre pas bien précisé que je ne voulais
faire que de la lecture...

Ou alors est-ce tout simplement innévitable...

Le fichier attaqué est un classeur Excel (partagé) situé sur un serveur
Le code de connexion est le suivant
-> Set updADOConnection = New ADODB.Connection
-> With updADOConnection
-> .ConnectionString = _
-> "Provider=Microsoft.Jet.OLEDB.4.0;" & _
-> "Data Source=" & updRefSourceFile_path & ";" & _
-> "Extended Properties=Excel 8.0;"
-> .CursorLocation = adUseClient
-> .Open
-> End With
La récup de data se faisan avec:
- .Open Source:=SqlStringSeq, ActiveConnection:=Connection
ou SqlStringSeq est une string préparée à l'avance

Merci vous
Alain79
Avatar
Alain79
Merci "MichDenis" - Ton intervention me semble providentielle !!! mais je
n'en saisie pas toute la portée, dommage... Un grand merci tout de même

1 - Pour remettre en évidence l'erreur avant de faire des modifications j'ai
ouvert deux sessions Excel sur ma machine et ai lancé la même fonction sur
les deux instance d'Excel - le fichier "sondé" par l'ADO étant un seul et
même workbook excel situé sur un serveur sur le net => l'erreur se
produisait bien comme espéré

2 - J'ai dans un premier temps forcé le Recordset.CursorType à
adOpenForwardOnly cela a semble t'il eu pour effet d'accélerer sensiblement
les opérations mais sans empécher pour autant la collision fatale lorsque je
lançais les deux appli en même temps - En tout cas déjà un bel effort...

3 - J'ai dans un deuxième temps fait passer Connection.mode à adModeWrite.
Après avoir fait cette deuxième modif je n'arrive plus à reproduire le
fameux "Catastrophic failure" - Bravo! - le problème semble réglé mais je ne
saisie pas vraiment cette notion de mode - Je me serais attendu à devoir
utiliser adModeRead ou encore adModeReadWrite ou encore adModeShareDenyNone
mais pas adModeWrite - si ce n'est pas trop demandé que signifie ce mode, la
doc ne m'inspire pas vraiment... En quoi le mode adModeWrite permet l'accès
concurentiel de deux appli excel faisant appel a des connexions ADO sur le
même fichier?

4 - Merci également pour le code d'erreur, je n'ai pas eu le temps de le
mettre en oeuvre à la place du mien mais je le met au chaud pour le futur...
Mon code d'erreur se résumais à On Error Resume Next encadrant l'ouverture
du recordset mais en fait ne me protégais pas du tout du "Catastrophic
Failure"

5 - Dois-je insiter sur les paramètres additionel du recordset que sont
adLockReadOnly, adCmdText - tu les mentionnes dans ton exemple.

Mon code devient: (sans mention du code d'erreur)
Set updADOConnection = New ADODB.Connection
With updADOConnection
.Mode = adModeWrite
.ConnectionString = _
"Provider=Microsoft.Jet.OLEDB.4.0;" & _
"Data Source=" & updRefSourceFile_path & ";" & _
"Extended Properties=Excel 8.0;"
.CursorLocation = adUseClient
.Open
End With
La récup de data se faisant avec:
With recordset
.CursorType = adOpenForwardOnly
.Open Source:=SqlStringSeq, ActiveConnection:=Connection
End With




"MichDenis" wrote in message
news:
Bonjour Alain79,

As-tu essayé quelque chose dans le genre :

J'ai ajouté ceci à ta connexion : Mode = adModeWrite

Et j'ai ajouté une gestion d'erreur, peut être nous donnera-t-elle plus
d'informations sur ce qui ne va pas.


Si tu résout la problématique, j'aimerais bien que tu publies la solution.

'------------------------------------
Sub LaProcedure()

Dim Gestion_Error As String
On Error GoTo Gestion_Erreur

Set updADOConnection = New ADODB.Connection
With updADOConnection
'Users can not write data
.Mode = adModeWrite
.ConnectionString = _
"Provider=Microsoft.Jet.OLEDB.4.0;" & _
"Data Source=" & updRefSourceFile_path & ";" & _
"Extended Properties=Excel 8.0;"
.CursorLocation = adUseClient
.Open
End With

'Pour ce qui est du curseur de ton recordset
'si c'est seulement pour importer des données
'Avant d'ouvrir le recordset
'rst.CursorType = adOpenForwardOnly

'recordset(rst)
Rst.Open [Source], updADOConnection, _
adOpenForwardOnly, adLockReadOnly, adCmdText

'..../....


Rst.Close
updADOConnection.Close
Set Rst = Nothing: Set updADOConnection = Nothing

Exit Sub
Gestion_Erreur:
Dim Erreur As ADODB.Error
For Each Erreur In updADOConnection.Errors
MsgBox "Erreur : " & Erreur.Description
Next

'Pour fermer le Recordset(rst)
If (Rst.State & adStateOpen) Then Rst.Close

'Pour fermer la connexion si elle est ouverte
If (updADOConnection.State & adStateConnecting) Then
updADOConnection.Close
End If
Set Rst = Nothing: Set updADOConnection = Nothing
Exit Sub

End Sub
'------------------------------


Salutations!




"Alain79" a écrit dans le message de news:
cun9md$6mq$

J'utilise ADO pour extraire des données d'un Classeur et cela fonctionne
fort bien mais il y a un mais...
Lorsque plusieurs utilisateurs active la fonction en même temps à partir
de

leur propre machine, Excel génère des "Catastrophic error" rien que
cela...


Aurais-je loupé quelquechose dans la façon d'établir la connexion et dans
celle de récupéper les données - genre pas bien précisé que je ne voulais
faire que de la lecture...

Ou alors est-ce tout simplement innévitable...

Le fichier attaqué est un classeur Excel (partagé) situé sur un serveur
Le code de connexion est le suivant
-> Set updADOConnection = New ADODB.Connection
-> With updADOConnection
-> .ConnectionString = _
-> "Provider=Microsoft.Jet.OLEDB.4.0;" & _
-> "Data Source=" & updRefSourceFile_path & ";" & _
-> "Extended Properties=Excel 8.0;"
-> .CursorLocation = adUseClient
-> .Open
-> End With
La récup de data se faisan avec:
- .Open Source:=SqlStringSeq, ActiveConnection:=Connection
ou SqlStringSeq est une string préparée à l'avance

Merci vous
Alain79





Avatar
MichDenis
Bonjour Alain79,

Le mode .Mode = adModeWrite
Permet d'ouvrir une connexion en mode lecture seulement malgré les apparences.

Pour obtenir toutes les constantes possibles :

Dim x As ADODB.ConnectModeEnum
x = adModeWrite

Si tu effaces le signe "=" et que tu le retype et que tu appuies après sur la barre d'espacement, une liste déroulante
devrait apparaître avec la liste des constantes disponibles. Probablement dans l'aide, tu auras leur signification.

Quant au type de curseur utilisé :
CursorType = adOpenForwardOnly

Effectivement, c'est le curseur le plus rapide et qui demande le moins de ressource système. Par contre, tu ne pourras
utiliser la méthode RecordCount de ton recordset car la valeur renvoyé sera toujours égale à -1 . De plus, comme son nom
l'indique, le curseur se déplace de l'enregistrement 1 au dernier ... le curseur va toujours de l'avant et ne recule pas
....! Mais si l'objectif est de collé le recordset dans une feuille excel, c'est suffisant ... enfin, encore une fois,
il doit y avoir quelque chose dans l'aide !

Je te suggère d'utiliser aussi un bidule comme ceci pour gérer le recouvrement du recordset.

Bof = Beginning of file -> juste avant le premier enregistrement
Eof = End of file -> juste après le dernier enregistrement.

Rst = recordset
If Rst.BOF = True And Rst.EOF = True Then
MsgBox "Aucun enregistrement trouvé."
Else
'copie le recordset
With Worksheets("Feuil1") 'à déterminer
.Range("A1").CopyFromRecordset Rst
End With
End If

Enfin, les messages d'erreur permettre aiguiller les recherches lorsque quelque chose ne tourne pas rond.

P.S. Comme je n'évolue pas dans un environnement réseau, les propositions n'ont pas été testées !


Salutations!










"Alain79" a écrit dans le message de news: cuo5sb$jg1$
Merci "MichDenis" - Ton intervention me semble providentielle !!! mais je
n'en saisie pas toute la portée, dommage... Un grand merci tout de même

1 - Pour remettre en évidence l'erreur avant de faire des modifications j'ai
ouvert deux sessions Excel sur ma machine et ai lancé la même fonction sur
les deux instance d'Excel - le fichier "sondé" par l'ADO étant un seul et
même workbook excel situé sur un serveur sur le net => l'erreur se
produisait bien comme espéré

2 - J'ai dans un premier temps forcé le Recordset.CursorType à
adOpenForwardOnly cela a semble t'il eu pour effet d'accélerer sensiblement
les opérations mais sans empécher pour autant la collision fatale lorsque je
lançais les deux appli en même temps - En tout cas déjà un bel effort...

3 - J'ai dans un deuxième temps fait passer Connection.mode à adModeWrite.
Après avoir fait cette deuxième modif je n'arrive plus à reproduire le
fameux "Catastrophic failure" - Bravo! - le problème semble réglé mais je ne
saisie pas vraiment cette notion de mode - Je me serais attendu à devoir
utiliser adModeRead ou encore adModeReadWrite ou encore adModeShareDenyNone
mais pas adModeWrite - si ce n'est pas trop demandé que signifie ce mode, la
doc ne m'inspire pas vraiment... En quoi le mode adModeWrite permet l'accès
concurentiel de deux appli excel faisant appel a des connexions ADO sur le
même fichier?

4 - Merci également pour le code d'erreur, je n'ai pas eu le temps de le
mettre en oeuvre à la place du mien mais je le met au chaud pour le futur...
Mon code d'erreur se résumais à On Error Resume Next encadrant l'ouverture
du recordset mais en fait ne me protégais pas du tout du "Catastrophic
Failure"

5 - Dois-je insiter sur les paramètres additionel du recordset que sont
adLockReadOnly, adCmdText - tu les mentionnes dans ton exemple.

Mon code devient: (sans mention du code d'erreur)
Set updADOConnection = New ADODB.Connection
With updADOConnection
.Mode = adModeWrite
.ConnectionString = _
"Provider=Microsoft.Jet.OLEDB.4.0;" & _
"Data Source=" & updRefSourceFile_path & ";" & _
"Extended Properties=Excel 8.0;"
.CursorLocation = adUseClient
.Open
End With
La récup de data se faisant avec:
With recordset
.CursorType = adOpenForwardOnly
.Open Source:=SqlStringSeq, ActiveConnection:=Connection
End With




"MichDenis" wrote in message
news:
Bonjour Alain79,

As-tu essayé quelque chose dans le genre :

J'ai ajouté ceci à ta connexion : Mode = adModeWrite

Et j'ai ajouté une gestion d'erreur, peut être nous donnera-t-elle plus
d'informations sur ce qui ne va pas.


Si tu résout la problématique, j'aimerais bien que tu publies la solution.

'------------------------------------
Sub LaProcedure()

Dim Gestion_Error As String
On Error GoTo Gestion_Erreur

Set updADOConnection = New ADODB.Connection
With updADOConnection
'Users can not write data
.Mode = adModeWrite
.ConnectionString = _
"Provider=Microsoft.Jet.OLEDB.4.0;" & _
"Data Source=" & updRefSourceFile_path & ";" & _
"Extended Properties=Excel 8.0;"
.CursorLocation = adUseClient
.Open
End With

'Pour ce qui est du curseur de ton recordset
'si c'est seulement pour importer des données
'Avant d'ouvrir le recordset
'rst.CursorType = adOpenForwardOnly

'recordset(rst)
Rst.Open [Source], updADOConnection, _
adOpenForwardOnly, adLockReadOnly, adCmdText

'..../....


Rst.Close
updADOConnection.Close
Set Rst = Nothing: Set updADOConnection = Nothing

Exit Sub
Gestion_Erreur:
Dim Erreur As ADODB.Error
For Each Erreur In updADOConnection.Errors
MsgBox "Erreur : " & Erreur.Description
Next

'Pour fermer le Recordset(rst)
If (Rst.State & adStateOpen) Then Rst.Close

'Pour fermer la connexion si elle est ouverte
If (updADOConnection.State & adStateConnecting) Then
updADOConnection.Close
End If
Set Rst = Nothing: Set updADOConnection = Nothing
Exit Sub

End Sub
'------------------------------


Salutations!




"Alain79" a écrit dans le message de news:
cun9md$6mq$

J'utilise ADO pour extraire des données d'un Classeur et cela fonctionne
fort bien mais il y a un mais...
Lorsque plusieurs utilisateurs active la fonction en même temps à partir
de

leur propre machine, Excel génère des "Catastrophic error" rien que
cela...


Aurais-je loupé quelquechose dans la façon d'établir la connexion et dans
celle de récupéper les données - genre pas bien précisé que je ne voulais
faire que de la lecture...

Ou alors est-ce tout simplement innévitable...

Le fichier attaqué est un classeur Excel (partagé) situé sur un serveur
Le code de connexion est le suivant
-> Set updADOConnection = New ADODB.Connection
-> With updADOConnection
-> .ConnectionString = _
-> "Provider=Microsoft.Jet.OLEDB.4.0;" & _
-> "Data Source=" & updRefSourceFile_path & ";" & _
-> "Extended Properties=Excel 8.0;"
-> .CursorLocation = adUseClient
-> .Open
-> End With
La récup de data se faisan avec:
- .Open Source:=SqlStringSeq, ActiveConnection:=Connection
ou SqlStringSeq est une string préparée à l'avance

Merci vous
Alain79





Avatar
Alain79
Merci pour les explications

J'ai tout de même un doute à propos du RecordCount
J'utilise cette variable pour tourner sur le Recordset et elle n'est pas
égale à -1 mais bien au nombre d'enregistrements récupérés
J'en viens à douté d'avoir effectivement fait CursorType = adOpenForwardOnly
?!
Non - non après verif - j'ai bien programmé la chose
Possible à ton sens ?
Aller - c'est pas une journée, le dimanche, pour travailler surtout que la
semaine va être dur...

Merci pour ton aide fort documentée
Bien cordialement
@+ j'espère
Bye

PS:

"MichDenis" wrote in message
news:etw$$
Bonjour Alain79,

Le mode .Mode = adModeWrite
Permet d'ouvrir une connexion en mode lecture seulement malgré les
apparences.


Pour obtenir toutes les constantes possibles :

Dim x As ADODB.ConnectModeEnum
x = adModeWrite

Si tu effaces le signe "=" et que tu le retype et que tu appuies après sur
la barre d'espacement, une liste déroulante

devrait apparaître avec la liste des constantes disponibles. Probablement
dans l'aide, tu auras leur signification.


Quant au type de curseur utilisé :
CursorType = adOpenForwardOnly

Effectivement, c'est le curseur le plus rapide et qui demande le moins de
ressource système. Par contre, tu ne pourras

utiliser la méthode RecordCount de ton recordset car la valeur renvoyé
sera toujours égale à -1 . De plus, comme son nom

l'indique, le curseur se déplace de l'enregistrement 1 au dernier ... le
curseur va toujours de l'avant et ne recule pas

....! Mais si l'objectif est de collé le recordset dans une feuille excel,
c'est suffisant ... enfin, encore une fois,

il doit y avoir quelque chose dans l'aide !

Je te suggère d'utiliser aussi un bidule comme ceci pour gérer le
recouvrement du recordset.


Bof = Beginning of file -> juste avant le premier enregistrement
Eof = End of file -> juste après le dernier enregistrement.

Rst = recordset
If Rst.BOF = True And Rst.EOF = True Then
MsgBox "Aucun enregistrement trouvé."
Else
'copie le recordset
With Worksheets("Feuil1") 'à déterminer
.Range("A1").CopyFromRecordset Rst
End With
End If

Enfin, les messages d'erreur permettre aiguiller les recherches lorsque
quelque chose ne tourne pas rond.


P.S. Comme je n'évolue pas dans un environnement réseau, les propositions
n'ont pas été testées !



Salutations!










"Alain79" a écrit dans le message de news:
cuo5sb$jg1$

Merci "MichDenis" - Ton intervention me semble providentielle !!! mais je
n'en saisie pas toute la portée, dommage... Un grand merci tout de même

1 - Pour remettre en évidence l'erreur avant de faire des modifications
j'ai

ouvert deux sessions Excel sur ma machine et ai lancé la même fonction sur
les deux instance d'Excel - le fichier "sondé" par l'ADO étant un seul et
même workbook excel situé sur un serveur sur le net => l'erreur se
produisait bien comme espéré

2 - J'ai dans un premier temps forcé le Recordset.CursorType à
adOpenForwardOnly cela a semble t'il eu pour effet d'accélerer
sensiblement

les opérations mais sans empécher pour autant la collision fatale lorsque
je

lançais les deux appli en même temps - En tout cas déjà un bel effort...

3 - J'ai dans un deuxième temps fait passer Connection.mode à adModeWrite.
Après avoir fait cette deuxième modif je n'arrive plus à reproduire le
fameux "Catastrophic failure" - Bravo! - le problème semble réglé mais je
ne

saisie pas vraiment cette notion de mode - Je me serais attendu à devoir
utiliser adModeRead ou encore adModeReadWrite ou encore
adModeShareDenyNone

mais pas adModeWrite - si ce n'est pas trop demandé que signifie ce mode,
la

doc ne m'inspire pas vraiment... En quoi le mode adModeWrite permet
l'accès

concurentiel de deux appli excel faisant appel a des connexions ADO sur le
même fichier?

4 - Merci également pour le code d'erreur, je n'ai pas eu le temps de le
mettre en oeuvre à la place du mien mais je le met au chaud pour le
futur...

Mon code d'erreur se résumais à On Error Resume Next encadrant l'ouverture
du recordset mais en fait ne me protégais pas du tout du "Catastrophic
Failure"

5 - Dois-je insiter sur les paramètres additionel du recordset que sont
adLockReadOnly, adCmdText - tu les mentionnes dans ton exemple.

Mon code devient: (sans mention du code d'erreur)
Set updADOConnection = New ADODB.Connection
With updADOConnection
.Mode = adModeWrite
.ConnectionString = _
"Provider=Microsoft.Jet.OLEDB.4.0;" & _
"Data Source=" & updRefSourceFile_path & ";" & _
"Extended Properties=Excel 8.0;"
.CursorLocation = adUseClient
.Open
End With
La récup de data se faisant avec:
With recordset
.CursorType = adOpenForwardOnly
.Open Source:=SqlStringSeq, ActiveConnection:=Connection
End With




"MichDenis" wrote in message
news:
Bonjour Alain79,

As-tu essayé quelque chose dans le genre :

J'ai ajouté ceci à ta connexion : Mode = adModeWrite

Et j'ai ajouté une gestion d'erreur, peut être nous donnera-t-elle plus
d'informations sur ce qui ne va pas.


Si tu résout la problématique, j'aimerais bien que tu publies la
solution.



'------------------------------------
Sub LaProcedure()

Dim Gestion_Error As String
On Error GoTo Gestion_Erreur

Set updADOConnection = New ADODB.Connection
With updADOConnection
'Users can not write data
.Mode = adModeWrite
.ConnectionString = _
"Provider=Microsoft.Jet.OLEDB.4.0;" & _
"Data Source=" & updRefSourceFile_path & ";" & _
"Extended Properties=Excel 8.0;"
.CursorLocation = adUseClient
.Open
End With

'Pour ce qui est du curseur de ton recordset
'si c'est seulement pour importer des données
'Avant d'ouvrir le recordset
'rst.CursorType = adOpenForwardOnly

'recordset(rst)
Rst.Open [Source], updADOConnection, _
adOpenForwardOnly, adLockReadOnly, adCmdText

'..../....


Rst.Close
updADOConnection.Close
Set Rst = Nothing: Set updADOConnection = Nothing

Exit Sub
Gestion_Erreur:
Dim Erreur As ADODB.Error
For Each Erreur In updADOConnection.Errors
MsgBox "Erreur : " & Erreur.Description
Next

'Pour fermer le Recordset(rst)
If (Rst.State & adStateOpen) Then Rst.Close

'Pour fermer la connexion si elle est ouverte
If (updADOConnection.State & adStateConnecting) Then
updADOConnection.Close
End If
Set Rst = Nothing: Set updADOConnection = Nothing
Exit Sub

End Sub
'------------------------------


Salutations!




"Alain79" a écrit dans le message de news:
cun9md$6mq$

J'utilise ADO pour extraire des données d'un Classeur et cela fonctionne
fort bien mais il y a un mais...
Lorsque plusieurs utilisateurs active la fonction en même temps à partir
de

leur propre machine, Excel génère des "Catastrophic error" rien que
cela...


Aurais-je loupé quelquechose dans la façon d'établir la connexion et
dans


celle de récupéper les données - genre pas bien précisé que je ne
voulais


faire que de la lecture...

Ou alors est-ce tout simplement innévitable...

Le fichier attaqué est un classeur Excel (partagé) situé sur un serveur
Le code de connexion est le suivant
-> Set updADOConnection = New ADODB.Connection
-> With updADOConnection
-> .ConnectionString = _
-> "Provider=Microsoft.Jet.OLEDB.4.0;" & _
-> "Data Source=" & updRefSourceFile_path & ";" & _
-> "Extended Properties=Excel 8.0;"
-> .CursorLocation = adUseClient
-> .Open
-> End With
La récup de data se faisan avec:
- .Open Source:=SqlStringSeq, ActiveConnection:=Connection
ou SqlStringSeq est une string préparée à l'avance

Merci vous
Alain79










Avatar
MichDenis
Bonjour Alain79,

J'ai omis de commenter ceci dans ta question :

5 - Dois-je insister sur les paramètres additionel du recordset que sont
adLockReadOnly, adCmdText - tu les mentionnes dans ton exemple.

adLockReadOnly : Comme la connection est ouverte en lecture seule dans ton code (défini par la propriété Mode), il
existe pour certains éléments, le phénomène "Héritage" c'est-à-dire que le recordset que va être en mode lecture seule à
cause de "l'héritage" du mode de la connection. Ce choix a été arrêté pour éviter que tu n'utilises un autre élément qui
soit contradictoire lors de l'ouverture du recordset.-> ce qui serait une source d'une erreur !

adCmdText : On peut ne pas définir le dernier paramètre de la méthode "Open" du recordset ... lorsque non défini, il
prend pas défaut la valeur "adCmdUnknown" qui est l'équivalent à définir une variable de type Variant plutôt que de lui
attribuer un type spécifique (lorsque on le connaît) . Si tu désignes le bon, cela a pour effet d'optimiser le
traitement. Ce n'est pas négligeable !

AdCmdText s'appllique seulement, si tu utilises une chaîne SQL comme "SOURCE DE TES DONNÉES" pour effectuer l'ouverture
du recordset.
Tu peux utiliser le même technique (retype le signe "=" + une barre d'espacement) pour obtenir la liste disponible des
constantes disponibles. Un petit tour dans l'aide pour en connaître la signification.

Dim Q As ADODB.CommandTypeEnum
Q = adCmdText


Salutations!


"Alain79" a écrit dans le message de news: cuo5sb$jg1$
Merci "MichDenis" - Ton intervention me semble providentielle !!! mais je
n'en saisie pas toute la portée, dommage... Un grand merci tout de même

1 - Pour remettre en évidence l'erreur avant de faire des modifications j'ai
ouvert deux sessions Excel sur ma machine et ai lancé la même fonction sur
les deux instance d'Excel - le fichier "sondé" par l'ADO étant un seul et
même workbook excel situé sur un serveur sur le net => l'erreur se
produisait bien comme espéré

2 - J'ai dans un premier temps forcé le Recordset.CursorType à
adOpenForwardOnly cela a semble t'il eu pour effet d'accélerer sensiblement
les opérations mais sans empécher pour autant la collision fatale lorsque je
lançais les deux appli en même temps - En tout cas déjà un bel effort...

3 - J'ai dans un deuxième temps fait passer Connection.mode à adModeWrite.
Après avoir fait cette deuxième modif je n'arrive plus à reproduire le
fameux "Catastrophic failure" - Bravo! - le problème semble réglé mais je ne
saisie pas vraiment cette notion de mode - Je me serais attendu à devoir
utiliser adModeRead ou encore adModeReadWrite ou encore adModeShareDenyNone
mais pas adModeWrite - si ce n'est pas trop demandé que signifie ce mode, la
doc ne m'inspire pas vraiment... En quoi le mode adModeWrite permet l'accès
concurentiel de deux appli excel faisant appel a des connexions ADO sur le
même fichier?

4 - Merci également pour le code d'erreur, je n'ai pas eu le temps de le
mettre en oeuvre à la place du mien mais je le met au chaud pour le futur...
Mon code d'erreur se résumais à On Error Resume Next encadrant l'ouverture
du recordset mais en fait ne me protégais pas du tout du "Catastrophic
Failure"

5 - Dois-je insiter sur les paramètres additionel du recordset que sont
adLockReadOnly, adCmdText - tu les mentionnes dans ton exemple.

Mon code devient: (sans mention du code d'erreur)
Set updADOConnection = New ADODB.Connection
With updADOConnection
.Mode = adModeWrite
.ConnectionString = _
"Provider=Microsoft.Jet.OLEDB.4.0;" & _
"Data Source=" & updRefSourceFile_path & ";" & _
"Extended Properties=Excel 8.0;"
.CursorLocation = adUseClient
.Open
End With
La récup de data se faisant avec:
With recordset
.CursorType = adOpenForwardOnly
.Open Source:=SqlStringSeq, ActiveConnection:=Connection
End With




"MichDenis" wrote in message
news:
Bonjour Alain79,

As-tu essayé quelque chose dans le genre :

J'ai ajouté ceci à ta connexion : Mode = adModeWrite

Et j'ai ajouté une gestion d'erreur, peut être nous donnera-t-elle plus
d'informations sur ce qui ne va pas.


Si tu résout la problématique, j'aimerais bien que tu publies la solution.

'------------------------------------
Sub LaProcedure()

Dim Gestion_Error As String
On Error GoTo Gestion_Erreur

Set updADOConnection = New ADODB.Connection
With updADOConnection
'Users can not write data
.Mode = adModeWrite
.ConnectionString = _
"Provider=Microsoft.Jet.OLEDB.4.0;" & _
"Data Source=" & updRefSourceFile_path & ";" & _
"Extended Properties=Excel 8.0;"
.CursorLocation = adUseClient
.Open
End With

'Pour ce qui est du curseur de ton recordset
'si c'est seulement pour importer des données
'Avant d'ouvrir le recordset
'rst.CursorType = adOpenForwardOnly

'recordset(rst)
Rst.Open [Source], updADOConnection, _
adOpenForwardOnly, adLockReadOnly, adCmdText

'..../....


Rst.Close
updADOConnection.Close
Set Rst = Nothing: Set updADOConnection = Nothing

Exit Sub
Gestion_Erreur:
Dim Erreur As ADODB.Error
For Each Erreur In updADOConnection.Errors
MsgBox "Erreur : " & Erreur.Description
Next

'Pour fermer le Recordset(rst)
If (Rst.State & adStateOpen) Then Rst.Close

'Pour fermer la connexion si elle est ouverte
If (updADOConnection.State & adStateConnecting) Then
updADOConnection.Close
End If
Set Rst = Nothing: Set updADOConnection = Nothing
Exit Sub

End Sub
'------------------------------


Salutations!




"Alain79" a écrit dans le message de news:
cun9md$6mq$

J'utilise ADO pour extraire des données d'un Classeur et cela fonctionne
fort bien mais il y a un mais...
Lorsque plusieurs utilisateurs active la fonction en même temps à partir
de

leur propre machine, Excel génère des "Catastrophic error" rien que
cela...


Aurais-je loupé quelquechose dans la façon d'établir la connexion et dans
celle de récupéper les données - genre pas bien précisé que je ne voulais
faire que de la lecture...

Ou alors est-ce tout simplement innévitable...

Le fichier attaqué est un classeur Excel (partagé) situé sur un serveur
Le code de connexion est le suivant
-> Set updADOConnection = New ADODB.Connection
-> With updADOConnection
-> .ConnectionString = _
-> "Provider=Microsoft.Jet.OLEDB.4.0;" & _
-> "Data Source=" & updRefSourceFile_path & ";" & _
-> "Extended Properties=Excel 8.0;"
-> .CursorLocation = adUseClient
-> .Open
-> End With
La récup de data se faisan avec:
- .Open Source:=SqlStringSeq, ActiveConnection:=Connection
ou SqlStringSeq est une string préparée à l'avance

Merci vous
Alain79





Avatar
MichDenis
Bonjour Alain79,

A ) L'interface ADO est rendu possible via "Plusieurs PROVIDER" différents. Ado bien qu'étant un standard reconnu par
l'industrie, aucun des PROVIDER n'est tenu de définir chacune des propriétés que le modèle objet ADO possède. En
conséquence, il y a donc des variantes d'un provider à un autre... pour le détail, il faut consulter la littérature que
l'entreprise fournit à propos de son provider.

B ) Dans ton cas, Comme tu utilises cette propriété de la connexion: CursorLocation = adUseClient, cela signifie que la
connection utilise un curseur par défaut de type adOpenStatic. Si tu utilisais CursorLocation = adUseServer, le curseur
par défaut serait adOpenForwardOnly .

C ) Comme il n'y a pas de convergence entre ce qui précède et de fait de passer en paramêtre le type de curseur
(adOpenForwardOnly) au niveau de la méthode "Open" du recordset, afin d'être sûr du type de curseur que le provider a
retenu, tu peux utliser une procédure (voir plus bas) dans le genre pour le savoir. Ce n'est pas parce que tu as demandé
un type de curseur que c'est ce que tu vas obetnir ( c'est vrai aussi pour d'autres propriétés) ...et cela ne génère pas
nécessairement une erreur, selon le provider, cela est géré à l'interne par le provider. À la lumière de que tu
observes, "l'héritage" émanant de la connexion semble avoir la préséance.

Un petit bout de code à mettre après l'ouverture du recorset.
'-----------------------
Select Case Rst.CursorType
Case Is = adOpenForwardOnly
MsgBox "le type de curseur est adOpenForwardOnly"
Case Is = adOpenKeyset:
MsgBox "le type de curseur est adOpenKeyset"
Case Is = adOpenDynamic
MsgBox "le type de curseur est adOpenDynamic"
Case Is = adOpenStatic:
MsgBox "le type de curseur est adOpenStatic"
End Select
'-----------------------

En terminant, la méthode RecordRecord ne fonctionne qu'avec un curseur de type adOpenKeyset ou adOpenStatic.


Salutations!





"Alain79" a écrit dans le message de news: cuo9va$lrh$
Merci pour les explications

J'ai tout de même un doute à propos du RecordCount
J'utilise cette variable pour tourner sur le Recordset et elle n'est pas
égale à -1 mais bien au nombre d'enregistrements récupérés
J'en viens à douté d'avoir effectivement fait CursorType = adOpenForwardOnly
?!
Non - non après verif - j'ai bien programmé la chose
Possible à ton sens ?
Aller - c'est pas une journée, le dimanche, pour travailler surtout que la
semaine va être dur...

Merci pour ton aide fort documentée
Bien cordialement
@+ j'espère
Bye

PS:

"MichDenis" wrote in message
news:etw$$
Bonjour Alain79,

Le mode .Mode = adModeWrite
Permet d'ouvrir une connexion en mode lecture seulement malgré les
apparences.


Pour obtenir toutes les constantes possibles :

Dim x As ADODB.ConnectModeEnum
x = adModeWrite

Si tu effaces le signe "=" et que tu le retype et que tu appuies après sur
la barre d'espacement, une liste déroulante

devrait apparaître avec la liste des constantes disponibles. Probablement
dans l'aide, tu auras leur signification.


Quant au type de curseur utilisé :
CursorType = adOpenForwardOnly

Effectivement, c'est le curseur le plus rapide et qui demande le moins de
ressource système. Par contre, tu ne pourras

utiliser la méthode RecordCount de ton recordset car la valeur renvoyé
sera toujours égale à -1 . De plus, comme son nom

l'indique, le curseur se déplace de l'enregistrement 1 au dernier ... le
curseur va toujours de l'avant et ne recule pas

....! Mais si l'objectif est de collé le recordset dans une feuille excel,
c'est suffisant ... enfin, encore une fois,

il doit y avoir quelque chose dans l'aide !

Je te suggère d'utiliser aussi un bidule comme ceci pour gérer le
recouvrement du recordset.


Bof = Beginning of file -> juste avant le premier enregistrement
Eof = End of file -> juste après le dernier enregistrement.

Rst = recordset
If Rst.BOF = True And Rst.EOF = True Then
MsgBox "Aucun enregistrement trouvé."
Else
'copie le recordset
With Worksheets("Feuil1") 'à déterminer
.Range("A1").CopyFromRecordset Rst
End With
End If

Enfin, les messages d'erreur permettre aiguiller les recherches lorsque
quelque chose ne tourne pas rond.


P.S. Comme je n'évolue pas dans un environnement réseau, les propositions
n'ont pas été testées !



Salutations!










"Alain79" a écrit dans le message de news:
cuo5sb$jg1$

Merci "MichDenis" - Ton intervention me semble providentielle !!! mais je
n'en saisie pas toute la portée, dommage... Un grand merci tout de même

1 - Pour remettre en évidence l'erreur avant de faire des modifications
j'ai

ouvert deux sessions Excel sur ma machine et ai lancé la même fonction sur
les deux instance d'Excel - le fichier "sondé" par l'ADO étant un seul et
même workbook excel situé sur un serveur sur le net => l'erreur se
produisait bien comme espéré

2 - J'ai dans un premier temps forcé le Recordset.CursorType à
adOpenForwardOnly cela a semble t'il eu pour effet d'accélerer
sensiblement

les opérations mais sans empécher pour autant la collision fatale lorsque
je

lançais les deux appli en même temps - En tout cas déjà un bel effort...

3 - J'ai dans un deuxième temps fait passer Connection.mode à adModeWrite.
Après avoir fait cette deuxième modif je n'arrive plus à reproduire le
fameux "Catastrophic failure" - Bravo! - le problème semble réglé mais je
ne

saisie pas vraiment cette notion de mode - Je me serais attendu à devoir
utiliser adModeRead ou encore adModeReadWrite ou encore
adModeShareDenyNone

mais pas adModeWrite - si ce n'est pas trop demandé que signifie ce mode,
la

doc ne m'inspire pas vraiment... En quoi le mode adModeWrite permet
l'accès

concurentiel de deux appli excel faisant appel a des connexions ADO sur le
même fichier?

4 - Merci également pour le code d'erreur, je n'ai pas eu le temps de le
mettre en oeuvre à la place du mien mais je le met au chaud pour le
futur...

Mon code d'erreur se résumais à On Error Resume Next encadrant l'ouverture
du recordset mais en fait ne me protégais pas du tout du "Catastrophic
Failure"

5 - Dois-je insiter sur les paramètres additionel du recordset que sont
adLockReadOnly, adCmdText - tu les mentionnes dans ton exemple.

Mon code devient: (sans mention du code d'erreur)
Set updADOConnection = New ADODB.Connection
With updADOConnection
.Mode = adModeWrite
.ConnectionString = _
"Provider=Microsoft.Jet.OLEDB.4.0;" & _
"Data Source=" & updRefSourceFile_path & ";" & _
"Extended Properties=Excel 8.0;"
.CursorLocation = adUseClient
.Open
End With
La récup de data se faisant avec:
With recordset
.CursorType = adOpenForwardOnly
.Open Source:=SqlStringSeq, ActiveConnection:=Connection
End With




"MichDenis" wrote in message
news:
Bonjour Alain79,

As-tu essayé quelque chose dans le genre :

J'ai ajouté ceci à ta connexion : Mode = adModeWrite

Et j'ai ajouté une gestion d'erreur, peut être nous donnera-t-elle plus
d'informations sur ce qui ne va pas.


Si tu résout la problématique, j'aimerais bien que tu publies la
solution.



'------------------------------------
Sub LaProcedure()

Dim Gestion_Error As String
On Error GoTo Gestion_Erreur

Set updADOConnection = New ADODB.Connection
With updADOConnection
'Users can not write data
.Mode = adModeWrite
.ConnectionString = _
"Provider=Microsoft.Jet.OLEDB.4.0;" & _
"Data Source=" & updRefSourceFile_path & ";" & _
"Extended Properties=Excel 8.0;"
.CursorLocation = adUseClient
.Open
End With

'Pour ce qui est du curseur de ton recordset
'si c'est seulement pour importer des données
'Avant d'ouvrir le recordset
'rst.CursorType = adOpenForwardOnly

'recordset(rst)
Rst.Open [Source], updADOConnection, _
adOpenForwardOnly, adLockReadOnly, adCmdText

'..../....


Rst.Close
updADOConnection.Close
Set Rst = Nothing: Set updADOConnection = Nothing

Exit Sub
Gestion_Erreur:
Dim Erreur As ADODB.Error
For Each Erreur In updADOConnection.Errors
MsgBox "Erreur : " & Erreur.Description
Next

'Pour fermer le Recordset(rst)
If (Rst.State & adStateOpen) Then Rst.Close

'Pour fermer la connexion si elle est ouverte
If (updADOConnection.State & adStateConnecting) Then
updADOConnection.Close
End If
Set Rst = Nothing: Set updADOConnection = Nothing
Exit Sub

End Sub
'------------------------------


Salutations!




"Alain79" a écrit dans le message de news:
cun9md$6mq$

J'utilise ADO pour extraire des données d'un Classeur et cela fonctionne
fort bien mais il y a un mais...
Lorsque plusieurs utilisateurs active la fonction en même temps à partir
de

leur propre machine, Excel génère des "Catastrophic error" rien que
cela...


Aurais-je loupé quelquechose dans la façon d'établir la connexion et
dans


celle de récupéper les données - genre pas bien précisé que je ne
voulais


faire que de la lecture...

Ou alors est-ce tout simplement innévitable...

Le fichier attaqué est un classeur Excel (partagé) situé sur un serveur
Le code de connexion est le suivant
-> Set updADOConnection = New ADODB.Connection
-> With updADOConnection
-> .ConnectionString = _
-> "Provider=Microsoft.Jet.OLEDB.4.0;" & _
-> "Data Source=" & updRefSourceFile_path & ";" & _
-> "Extended Properties=Excel 8.0;"
-> .CursorLocation = adUseClient
-> .Open
-> End With
La récup de data se faisan avec:
- .Open Source:=SqlStringSeq, ActiveConnection:=Connection
ou SqlStringSeq est une string préparée à l'avance

Merci vous
Alain79