Code VBA pour effectuer une requête sur une base Oracle [Résolu]

ajor 90 Messages postés mercredi 22 décembre 2004Date d'inscription 3 décembre 2017 Dernière intervention - 14 juin 2010 à 15:13 - Dernière réponse : ajor 90 Messages postés mercredi 22 décembre 2004Date d'inscription 3 décembre 2017 Dernière intervention
- 17 juin 2010 à 13:46
Bonjour à tous,

Parmi tous les post que je viens de lire à ce sujet , il y a apparemment plusieurs solutions, le problème, c'est que je comprends pas tout là dedans, je suis parti de ce code, qui apparemment ressemblait un peu à ce que je voulais.

Private Sub Form_Load()
Dim Cnn1 As ADODB.Connection, Cmd1 As ADODB.Command, MonRs As ADODB.Recordset
 
Set Cnn1 = New ADODB.Connection
With Cnn1
    .Provider = "Microsoft.Jet.OLEDB.4.0;"
    .ConnectionTimeout = 30
    .Mode = adModeShareExclusive
    .Open "Data Source=P:\Projet\Liaison_oracle.mdb ;User Id=azeaeaze; Password=azeaeaze"
End With

'par Connection.Execute

'Set MonRs Cnn1.Execute("SELECT INDLIG1 From G_INDIVIDU where nom'MARTINOT'", , adCmdText)
'MonRs.Close

'par command.execute

'Set Cmd1 = New ADODB.Command
'With Cmd1
'    .ActiveConnection = Cnn1
'    .CommandType = adCmdText
'    .CommandText "SELECT INDLIG1 From G_INDIVIDU where nom'MARTINOT'"
'End With
'Set MonRs = Cmd1.Execute
'MonRs.Close

'par recordset.open

Set MonRs = New ADODB.Recordset
MonRs.Open "SELECT INDLIG1 From G_INDIVIDU where nom ='MARTINOT'", Cnn1, , , adCmdText
End Sub


Quand j'exécute, j'obtiens l'erreur suivante :
'Erreur d'exécution 2147217843 (80010108)'
Erreur automation


Et là, je sèche. Auriez-vous une idée du problème ?

Petite question : lorsque je me connecte manuellement (par le menu d'Excel) je rentre le nom d'utilisateur, le mot de passe ainsi que le nom du serveur. Or je vois que dans ma fonction VBA, je ne renseigne pas ce nom de serveur. Je suppose qu'il faudrait le renseigner quelque part, mais où ?

PS : J'ai déjà eu un début de discussion ici mais qui n'a pas donné de suite : http://www.developpez.net/forums/d936137/bases-donnees/oracle/connexions-aux-bases-donnees/dexcel-se-connecter-oracle-passe-via-access-connecte-oracle/
Afficher la suite 

11 réponses

Répondre au sujet
ajor 90 Messages postés mercredi 22 décembre 2004Date d'inscription 3 décembre 2017 Dernière intervention - 17 juin 2010 à 13:46
+3
Utile
Pacadebord m'a fournit en message privé le code qui fonctionne bien dans mon cas, je le mets ici :

(le code est situé dans ThisWorkbook)

Option Explicit

Public cN As ADODB.Connection
Public rs As ADODB.Recordset

Public Function conNect() As Boolean
    
    On Error GoTo conNect_Err
    Set cN = New ADODB.Connection
    cN.ConnectionString = "Provider=msdaora;Data Source=OIUO;User Id=xxxxx;Password=xxxxxx;"
    cN.Open
    conNect = True
    Exit Function
    
conNect_Err:

    MsgBox Err.Number & vbCr & Err.Description
    conNect = True
    
End Function

Public Function DeconNect() As Boolean

    On Error Resume Next
    cN.Close
    Set cN = Nothing
    
End Function

Private Sub Workbook_Open()
Dim strSQL As String
Dim i As Integer
Dim j As Integer

    On Error GoTo Workbook_Open_Err
    
    If conNect() = True Then
    
        Set rs = New ADODB.Recordset
        rs.CursorLocation = adUseClient
        
         
        
        
       strSQL "select email, prenom from g_individu where nom'JORANDO'"
                
        rs.Open strSQL, cN, adOpenForwardOnly, adLockOptimistic
        
        If rs.RecordCount > 0 Then
        
            j = 1
            i = 0
            
          Do While Not rs.EOF And Not rs.BOF
                
    i = i + 1
    Feuil1.Cells(i, j) = rs("email")
    Feuil1.Cells(i, j + 1) = rs("prenom")
    rs.MoveNext
                
Loop
            
        End If
        
        DeconNect
        
    Else
    
        'blablabla
        
    End If
    
    Exit Sub

Workbook_Open_Err:
MsgBox Err.Number & vbCr & Err.Description

End Sub
Cette réponse vous a-t-elle aidé ?  
Commenter la réponse de ajor
lolokun 1241 Messages postés mardi 10 octobre 2006Date d'inscription 27 août 2013 Dernière intervention - 14 juin 2010 à 15:39
0
Utile
Bonjour,

voici un lien qui t'aidera concernant la chaîne de connexion à une base Oracle


L'expérience, c'est une connerie par jour, mais jamais la même..
Commenter la réponse de lolokun
cs_pacadebord 113 Messages postés lundi 31 mars 2003Date d'inscription 19 décembre 2011 Dernière intervention - 14 juin 2010 à 17:31
0
Utile
Bonjour,

On va commencer par le début.
Quelle est donc la version d'Oracle chez vous ?

Pac
Commenter la réponse de cs_pacadebord
ajor 90 Messages postés mercredi 22 décembre 2004Date d'inscription 3 décembre 2017 Dernière intervention - 14 juin 2010 à 18:11
0
Utile
C'est une Base Oracle 10g qui est située sur un serveur distant.

J'ai l'habitude d'accéder à cette base avec une liaison Oracle (ODBC sur Access 2003), ou parfois avec le client Oracle SQL Plus.

Cette fois-ci j'aimerais créer un outil pour que des utilisateurs puisse obtenir une liste (un simple select) dans un fichier Excel.
Commenter la réponse de ajor
cs_pacadebord 113 Messages postés lundi 31 mars 2003Date d'inscription 19 décembre 2011 Dernière intervention - 15 juin 2010 à 09:24
0
Utile
J'utilise en général l'OLEDB Microsoft. Sur une base Oracle 9i j'ai comme chaîne :
ConnectionString = "Provider=msdaora;Data Source=XXXXX;User Id=XXXXX;Password=XXXXX;"

Bien sur, ca fonctionne si vous créez une référence à "Microsoft ActiveX Data Objects 2.X Library" dans le vba Excel...
Avec OLEDB Oracle, vous devez faire comme indiqué dans le site :
ConnectionString = "Provider=OraOLEDB.Oracle;Data Source=XXXXX;User Id=XXXXX;Password=XXXXX;"
Commenter la réponse de cs_pacadebord
cs_pacadebord 113 Messages postés lundi 31 mars 2003Date d'inscription 19 décembre 2011 Dernière intervention - 15 juin 2010 à 11:46
0
Utile
ajor,

Vous devez choisir entre vous connecter à Oracle directement et vous connecter à une liaison de table Oracle dans une base Access. Mon précédant post concernait la première solution.
Dans votre code, il y a un mélange des deux...


Pac
Commenter la réponse de cs_pacadebord
cs_pacadebord 113 Messages postés lundi 31 mars 2003Date d'inscription 19 décembre 2011 Dernière intervention - 15 juin 2010 à 11:48
0
Utile
oups, désolé... mon dernier post n'est pas pour vous...

Pac
Commenter la réponse de cs_pacadebord
ajor 90 Messages postés mercredi 22 décembre 2004Date d'inscription 3 décembre 2017 Dernière intervention - 15 juin 2010 à 12:55
0
Utile
Bon, il y a eu erreur de suppression d'un de mes messages.

En tout cas, j'essaie de faire une connexion directe à Oracle, sans passer par ma liaison Access :

Alors j'ai essayé celui-ci : Oracle Data Provider for .NET / ODP.NET
Using ODP.NET without tnsnames.ora

Public cN AS ADODB.Connection
Public rs AS ADODB.Recordset
Public Sub conNect()
    SET cN = New ADODB.Connection
    dbPath = Path
    cN.ConnectionString = "Data Source=(DESCRIPTION=(ADDRESS_LIST=(ADDRESS=(PROTOCOL=TCP)(HOST=202.123.177.25)(PORT=17711)))(CONNECT_DATA=(SERVER=DEDICATED)(SERVICE_NAME=IMXXP)));User Id=aeazeaz;Password=azeaze;"
    cN.Open
End Sub


En exécutant, j'obtiens ce message d'erreur :

[Microsoft][Gestionnaire de pilotesODBC] Nom de source de données trop long


et en essayant Oracle Provider for OLE DB
Oracle XE, VB6 ADO

Code Visual Basic :

Public cN AS ADODB.Connection
Public rs AS ADODB.Recordset
Public Sub conNect()
    SET cN = New ADODB.Connection
    dbPath = Path
    cN.ConnectionString = "Provider=OraOLEDB.Oracle;dbq=212.413.141.144:15211/XE;Database=Mabase;User Id=zerztze;Password=zeztzz;"
    cN.Open
End Sub


J'obtiens l'erreur suivante :

ORA-12560: TNS: Erreur d'adaptateur de protocole


Il doit y avoir quelque chose qui cloche dans mon code, mais où ?
Commenter la réponse de ajor
cs_pacadebord 113 Messages postés lundi 31 mars 2003Date d'inscription 19 décembre 2011 Dernière intervention - 15 juin 2010 à 16:04
0
Utile
Si vous développez et souhaitez vous connecter à une base distante Oracle XE, il me semble qu'il faut installer "Oracle database XE client" sur votre poste de développement et utiliser la chaîne suivante :

Driver=(Oracle in XEClient);dbq=adresse_serveur:1521/XE;Uid=votreId;Pwd=votrePwd;

Ne connaissant pas cette version, cela reste à confirmer

Pac
Commenter la réponse de cs_pacadebord
cs_pacadebord 113 Messages postés lundi 31 mars 2003Date d'inscription 19 décembre 2011 Dernière intervention - 15 juin 2010 à 17:04
0
Utile
Si vous développez et souhaitez vous connecter à une base distante Oracle 10g à l'aide d'OLE DB Microsoft, la chaîne de connexion est :

ConnectionString = "Provider=msdaora;Data Source=XXXXX;User Id=XXXXX;Password=XXXXX;"

ou
Provider=msdaora;Data Source=XXXXX;Persist Security Info=False;Integrated Security=Yes;


La chaîne dépend de l'installation Oracle.
La valeur de "Data Source" est la valeur "SERVICE_NAME" du fichier TNSNAMES.ORA

Enfin assurez vous de désactiver un éventuel firewall.
J'attends des nouvelles...

Pac
Commenter la réponse de cs_pacadebord
ajor 90 Messages postés mercredi 22 décembre 2004Date d'inscription 3 décembre 2017 Dernière intervention - 16 juin 2010 à 16:03
0
Utile
Apparemment la connexion s'est fait de cette manière. Enfin, je ne suis pas encore sûr, mais l'exécution ne fait plus d'erreur sur Feuil1.

Par contre il y a une erreur sur le ThisworkBook.

'Erreur d'exécution '424'
Objet Requis.


Pour rappel, voici ce que contient Feuil1 :

Public cN As ADODB.Connection
Public rs As ADODB.Recordset
Public Sub conNect()
    Set cN = New ADODB.Connection
    dbPath = Path
    cN.ConnectionString = "Provider=msdaora;Data Source=OIUO;User Id=XXXXX;Password=XXXXX;"
    cN.Open
End Sub


et voici ce que contient ThisWorkBook :

Private Sub Workbook_Open()
Module1.conNect
Set rs = New ADODB.Recordset
rs.Open ("select indlig1 from g_individu where nom ='JORANDO'"), cN
i = 1
While Not rs.EOF
        For j = 1 To rs.Fields.Count - 1
            Feuil1.Cells(i, j) = rs(j - 1)
        Next
i = i + 1
rs.MoveNext
Wend
End Sub 


A votre avis, qu'est-ce qui cloche ?
Commenter la réponse de ajor

Vous n'êtes pas encore membre ?

inscrivez-vous, c'est gratuit et ça prend moins d'une minute !

Les membres obtiennent plus de réponses que les utilisateurs anonymes.

Le fait d'être membre vous permet d'avoir un suivi détaillé de vos demandes et codes sources.

Le fait d'être membre vous permet d'avoir des options supplémentaires.