Bonjour,

J'ai un souci avec une requête que je passe à un serveur Oracle via ODBC.
Le souci, c'est que j'ai toujours l'erreur suivante :
"Erreur générale ODBC"


Le code de ma fonction est le suivant :

Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
 
 
 
Public Function FctExecOracle1( _
        ByVal StrUsr1 As String, _
        ByVal StrPwd1 As String, _
        ByVal StrNomBase As String, _
        ByVal StrRequete As String, _
        ByVal WbkActif1 As Workbook, _
        ByVal StrFeuilleDestination As String, _
        Optional ByVal StrCelluleDestination As String = "A1") As Boolean
 
    Dim SheetActif      As Worksheet
    Dim StrBaseConnexion As String
 
    Dim BoolResult      As Boolean
    Dim StrNomProcApp   As String   'Stockage de la procédure appelante
 
On Error GoTo Erreur
 
    StrNomProcApp = NomProc
    NomProc = "FctExecOracle1"  'Gestion des erreurs (procédure en cours)
    BoolResult = False
 
    Set SheetActif = WbkActif1.Worksheets(StrFeuilleDestination)
 
    SheetActif.Visible = True
    SheetActif.Activate
    Selection.ClearContents
 
    StrBaseConnexion = "ODBC;DRIVER={Microsoft ODBC pour Oracle}" & _
            ";UID=" & StrUsr1 & _
            ";PWD=" & StrPwd1 & _
            ";SERVER=" & StrNomBase
 
    With ActiveSheet.QueryTables.Add(Connection:=StrBaseConnexion, _
          Destination:=Range(StrCelluleDestination), Sql:=StrRequete)
        .FieldNames = True
        .AdjustColumnWidth = True
        .Refresh (False) 'attend le résultat avant de continuer la procédure
    End With
 
 
    BoolResult = True
 
Sortie:
    Set SheetActif = Nothing
 
    FctExecOracle1 = BoolResult
    Exit Function
 
Erreur:
Resume
    MsgBox Err.Number & " - " & Err.Description, vbCritical, "Import de données"
    GoTo Sortie
 
End Function
Un autre essai impliquant un autre driver ODBC m'a donné le même résultat (c'est sans doute une grosse boulette sans doute plus grosse que moi, mais je ne la vois pas).

Le deuxième essai a été réalisé en remplaçant le contenu de la fonction ci-dessus par le bout de code suivant (trouvé ailleur sur le Net).

Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
 
 
    INSTANCE = StrNomBase '"Exemple"
    User = StrUsr1 'scott"
    MDP = StrPwd1 '"tiger"
    PL_SQL = StrRequete '"select * from all_all_tables"
    DRV_ODBC = "Oracle ODBC Driver"
 
'Connexion
 
    With ActiveSheet.QueryTables.Add(Connection:=Array(Array( _
        "ODBC;DRIVER={" & DRV_ODBC & "};SERVER=" & INSTANCE & ";UID=" & User & ";PWD=" & MDP & ";DBQ=" & INSTANCE & ";DBA=W;APA=T;FEN=T;QTO=T;FRC=10;FDL=10;LOB=T;RST= T;FRL=F" _
        ), Array(";MTS=F;CSR=F;PFC=10;TLO=O;")), Destination:=ActiveCell)
        .CommandText = PL_SQL
        .Refresh BackgroundQuery:=False
    End With
En fait il plante sur le "refresh".

Est-ce que vous pourriez m'aider à voir ce qui cloche, car là j'avoue que je m'arrache un peut le cheveux.

Par avance merci.

Marco.