jeudi 23 juillet 2015

Créer automatiquement un DSN ODBC vers PostgreSQL avec Access

Notre besoin : nous avons une base de données Access avec des tables liées vers PostgreSQL et nous ne voulons pas devoir déployer un script de création de DSN ODBC sur les machines des utilisateurs avant de déployer cette BD.

Solution :  intégrer la fonctionnalité de création automatique de DSN dans vos base de données.

Comment :

  • Créer le DSN
Étape 1 : Ajoutez un module à votre BD Access.

Étape 2: Ajouter les constantes nécessaires.

1. Constante avec le nom de la BD :

Const nom_base_donnees = "ma_base"

2. Constantes techniques du serveur
Const nom_serveur = "nom_du_serveur_postgresql" 'ou IP !
Const port_serveur = "5432" 'Valeur par défaut

3. Constante du nom du DSN qui sera créé.
Const nom_dsn = "nom_du_dsn_odbc"

4. Constantes concaténant les autres 
Const chaine_connexion_ODBC = _
"Description=" & nom_dsn & vbCr & _
"DATABASE=" & nom_base_donnees & vbCr & _
"SERVER=" & nom_serveur & vbCr & _
"PORT=" & port_serveur

5. Constante avec le nom du pilote OBDC PostgreSQL.
Vu que la version 32bits d'office n'utilise pas le même pilote que la version 64bits, nous devons en tenir compte

#If Win64 Then
Const nom_pilote_odbc = "PostgreSQL Unicode(x64)"
#Else
Const nom_pilote_odbc = "PostgreSQL Unicode"
#End If

6. Ajouter la méthode de création du DSN
Public Sub CreerLeDSNPostgreSQL()

    Dim modeSilencieux
    modeSilencieux = true   

    DBEngine.RegisterDatabase nom_dsn , _ 
        nom_pilote_odbc, _ 
        modeSilencieux , _ 
        chaine_connexion_ODBC 

End Sub

Étape 3 : planifier l'exécution de la méthode CreerLeDSNPostgreSQL à l'ouverture de la BD.
Solution la plus simple, ajouter une macro dont la première étape est ExécuterCode avec le paramètre CreerLeDSNPostgreSQL().
Cette macro doit être enregistrée sous le nom AutoExec.

Parfait !
Mais maintenant, il faut s'assurer que toutes les tables liées soient bien connectées à ce nouveau DSN

  • Remplacer les informations de connexion de toutes les tables liées

Étape 1 : ajouter les autres constantes
Pour une raison mystique, la chaine d'une connexion d'une table est différente d'une chaine de connexion utilisée pour la création d'un ODBC... nous devons donc redéfinir une constante pour la nouvelle chaine.
Attention, cette constante doit être ajoutée avant la méthode CreerLeDSNPostgreSQL.


Const chaine_connexion_table = "ODBC" & _
";DSN=" & nom_dsn & _
";DATABASE=" & nom_base_donnees & _
";SERVER=" & nom_serveur & _
";PORT=" & port_serveur & ";" & _
"MaxVarcharSize=255;TextAsLongVarchar=0;" 'voir Access et 'Text' 


Étape 2 : Ajouter les méthodes suivantes dans votre module


Public Sub MettreDSNAjourDansTablesLiees()
    Dim indiceTable As Integer
    
    For indiceTable = 0 To CurrentDb.TableDefs.Count - 1
    
        If Not EstUneTableSysteme(CurrentDb.TableDefs(indiceTable).Name) Then
        
            MettreChaineConnexionAJour CurrentDb.TableDefs(indiceTable)
        
        End If
        
    Next
End Sub

Private Sub MettreChaineConnexionAJour(objetTableDefinition As Variant)

    Dim chaineConnexion As String
        
    chaineConnexion = objetTableDefinition.Connect
    
    If ChaineRepresenteTableLieeODBC(chaineConnexion) Then
        
        chaineConnexion = chaine_connexion_table
        
        objetTableDefinition.Connect = chaineConnexion
        
        objetTableDefinition.RefreshLink
           
    End If
End Sub

Private Function ChaineRepresenteTableLieeODBC(chaineConnexion As String)
    ChaineRepresenteTableLieeODBC = (Left(chaineConnexion, 4) = "ODBC")
End Function

Private Function EstUneTableSysteme(nomTable As Variant)
    EstUneTableSysteme = (Left(nomTable, 4) = "MSys") Or InStr(nomTable, "~") <> 0
End Function

Étape 3 : ajouter une étape ExécuterCode avec le paramètre MettreDSNAjourDansTablesLiees dans la macro AutoExec.





Aucun commentaire:

Publier un commentaire

Ce commentaire sera validé par notre modérateur.