Créer une dsn odbc (vba/vb6)

Soyez le premier à donner votre avis sur cette source.

Snippet vu 27 204 fois - Téléchargée 29 fois

Contenu du snippet

Plutôt que de passer par le gestionnaire des sources de données (ODBC Data Sources Administrator) pour créer une nouvelle DSN, voilà une fonction qui permet de le faire par le biais d'un code.

Cette fonction est écrite pour être utilisée en VBA/VB6 (utilisation de déclarations API) . J'ai posté une autre source pour VBScript.

Exemple:
--------
Function SetDSN()
Call Set_ODBC_DSN(True, "NomDeLaDsn", "NomDeLaBaseDeDonnées", "", "SQLSRV32.dll", "SQL Server", "NomDuServeur")
End Function

UserDSN prend la valeur TRUE pour créer une DSN utilisateur, et FALSE pour une DSN système.

Source / Exemple :


Private Const REG_SZ = 1
Private Const HKEY_LOCAL_MACHINE = &H80000002
Private Const HKEY_CURRENT_USER = &H80000001
Private Const REG_ODBCINI       As String = "SOFTWARE\ODBC\ODBC.INI\"
Private Const REG_ODBCINI_DS    As String = "SOFTWARE\ODBC\ODBC.INI\ODBC Data Sources"
Private Declare Function RegCreateKey Lib "advapi32.dll" Alias "RegCreateKeyA" (ByVal hKey As Long, ByVal lpSubKey As String, phkResult As Long) As Long
Private Declare Function RegOpenKey Lib "advapi32.dll" Alias "RegOpenKeyA" (ByVal hKey As Long, ByVal lpSubKey As String, phkResult As Long) As Long
Private Declare Function RegSetValueEx Lib "advapi32.dll" Alias "RegSetValueExA" (ByVal hKey As Long, ByVal lpValueName As String, ByVal Reserved As Long, ByVal dwType As Long, lpData As Any, ByVal cbData As Long) As Long
Private Declare Function RegCloseKey Lib "advapi32.dll" (ByVal hKey As Long) As Long

Private Sub Set_ODBC_DSN(UserDSN As Boolean, _
                 DataSourceName As String, DatabaseName As String, _
                 Description As String, DriverPath As String, _
                 DriverName As String, Server As String)
    Dim lResult    As Long
    Dim hKeyHandle As Long
    Dim HKEY_XX    As Long
    HKEY_XX = IIf(UserDSN, HKEY_CURRENT_USER, HKEY_LOCAL_MACHINE)
    'Création d'une nuvelle clé dans la base de registre.
    lResult = RegCreateKey(HKEY_XX, REG_ODBCINI & DataSourceName, hKeyHandle)
    'Valeurs de la clé.
    lResult = RegSetValueEx(hKeyHandle, "Database", 0&, REG_SZ, ByVal DatabaseName, Len(DatabaseName))
    lResult = RegSetValueEx(hKeyHandle, "Description", 0&, REG_SZ, ByVal Description, Len(Description))
    lResult = RegSetValueEx(hKeyHandle, "Driver", 0&, REG_SZ, ByVal DriverPath, Len(DriverPath))
    lResult = RegSetValueEx(hKeyHandle, "LastUser", 0&, REG_SZ, ByVal "user", Len("user"))
    lResult = RegSetValueEx(hKeyHandle, "Server", 0&, REG_SZ, ByVal Server, Len(Server))
    'On ferme la clé.
    lResult = RegCloseKey(hKeyHandle)
    'On ouvre la clé "ODBC Data Sources" qui gères les entrées affichées dans le gestionnaire ODBC.
    'On ajoute une valeur.
    'On ferme la clé.
    lResult = RegCreateKey(HKEY_XX, REG_ODBCINI_DS, hKeyHandle)
    lResult = RegSetValueEx(hKeyHandle, DataSourceName, 0&, REG_SZ, ByVal DriverName, Len(DriverName))
    lResult = RegCloseKey(hKeyHandle)
End Sub

Conclusion :


Attention: ce code écrit dans votre base de registre.

A voir également

Ajouter un commentaire

Commentaires

Messages postés
117
Date d'inscription
mercredi 3 décembre 2003
Statut
Membre
Dernière intervention
11 octobre 2007
1
tu bosses au boulot ou à la maison ?

dans un réseau d'entreprise, il arrive souvent que l'admin restreigne le droit d'écriture dans HKEY_LOCAL_MACHINE.
En général, je conseille de toute facon les DSN utilisateur qui se définissent de la manière décrite en haut, à la différence que l'on utilise HKEY_CURRENT_USER (qui n'est pas protégé).
Messages postés
27
Date d'inscription
vendredi 1 février 2002
Statut
Membre
Dernière intervention
14 décembre 2007

Source intéressante même si elle est présente sur le site de Microsoft... http://support.microsoft.com/kb/184608

Par contre, je me fais insulter lors de l'exécution au niveau de "lResult = RegCreateKey(HKEY_XX, REG_ODBCINI & DataSourceName, hKeyHandle)"
VB me sort une AccessViolationException : "Tentative de lecture ou d'écriture de mémoire protégée. Cela indique souvent qu'une autre mémoire est endommagée."

Avez-vous une idée du problème ???
Messages postés
18
Date d'inscription
jeudi 3 juin 2004
Statut
Membre
Dernière intervention
4 janvier 2012

Salut,
super intéressant !! merci !
Messages postés
39
Date d'inscription
vendredi 21 mars 2003
Statut
Membre
Dernière intervention
21 mai 2015

Salut,
Ton code est intéressant et les commentaires également.
Il va me résoudre un problème sur la main-basse sur ODBC par des utilisateurs, ce que je ne veux pas. En créant au début de mon prog mes ODBC et en les supprimant avec RegDeleteKey, je n'ai plus à me soucier du lien ODBC mal créé.
Merci tout plein...
Messages postés
584
Date d'inscription
jeudi 28 décembre 2006
Statut
Membre
Dernière intervention
29 avril 2010
1
comment faire pour lister toutes les proprietes dun ODBC system ?
Afficher les 10 commentaires

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.