2010-01-12 16 views
7

Usando Visual Basic para Aplicaciones, ¿cómo puedo averiguar qué versión del controlador ODBC de MySQL está instalado en Windows en la máquina de un usuario?Con VBA, busque la versión del controlador ODBC de MySQL instalado en Windows

Tengo una aplicación de Microsoft Access que utiliza el controlador ODBC de MySQL para hacer una conexión. La cadena de conexión es el siguiente:

ODBC;DATABASE=mydatabase;DRIVER={MySQL ODBC 3.51 Driver}; 
    OPTION=3;PWD=password;PORT=3306;SERVER=server-db;UID=db-user; 

Este hallazgo fue a trabajar hasta que el administrador de TI instalada la versión 5.1 del controlador ODBC de MySQL en la PC de un usuario, que rompió la cadena de conexión.

Si conocía la versión del controlador instalado en la instalación de Windows XP del usuario, podría insertar eso en la cadena de conexión en tiempo de ejecución. ¿Cómo puedo averiguar qué versión del controlador ODBC de MySQL está instalado en Windows en la máquina de un usuario que usa VBA?

Respuesta

13

Se puede encontrar en el registro bajo

HKEY_LOCAL_MACHINE\SOFTWARE\ 
    ODBC\ODBCINST.INI\ 
    ODBC Drivers\MySQL ODBC 3.51 Driver 


HKEY_LOCAL_MACHINE\SOFTWARE\ 
    ODBC\ODBCINST.INI\ 
    ODBC Drivers\MySQL ODBC 5.1 Driver 

Uso de la información encontrada here, se puede llegar a ella utilizando el código de abajo (he probado en Access 97)

Private Sub Command0_Click()  
    If RegKeyExists("HKEY_LOCAL_MACHINE\SOFTWARE\ODBC\ODBCINST.INI\ 
           ODBC Drivers\MySQL ODBC 3.51 Driver") Then 
     MsgBox "3.51" 
    ElseIf RegKeyExists("HKEY_LOCAL_MACHINE\SOFTWARE\ODBC\ODBCINST.INI\ 
           ODBC Drivers\MySQL ODBC 5.1 Driver") Then 
     MsgBox "5.1" 
    Else 
     MsgBox "None" 
    End If 
End Sub 


'returns True if the registry key i_RegKey was found 
'and False if not 
Function RegKeyExists(i_RegKey As String) As Boolean 
    Dim myWS As Object 

    On Error GoTo ErrorHandler 
    'access Windows scripting 
    Set myWS = CreateObject("WScript.Shell") 
    'try to read the registry key 
    myWS.RegRead i_RegKey 
    'key was found 
    RegKeyExists = True 
    Exit Function 

ErrorHandler: 
    'key was not found 
    RegKeyExists = False 
End Function 
+0

¿Cómo puedo usar VBA para mirar el registro en la ubicación que ha especificado? –

+0

Encontrará el script aquí http://stackoverflow.com/questions/2020181/find-version-of-access/2020919#2020919 para comprobar el registro que funcionará en Access. – Fionnuala

+0

Ese script usa VB.NET, que no siempre se traduce a VBA. ¿Cómo funcionará? –

4

Aquí hay algunas ideas posibles:

1 Puede verificar el registro y buscar claves específicas, como por ejemplo: [HKEY_LOCAL_MACHINE \ SOFTWAR Controlador E \ ODBC \ ODBCINST.INI \ MySQL ODBC 3.51]

2.Puede verificar su carpeta c: \ windows \ system32 para myodbc.dll y luego verificar la información de la versión. Aquí hay un enlace sobre cómo comprobar la versión: http://www.vb-helper.com/howto_file_version_info.html

1

Si se quiere evitar el manejo de las versiones sobre una base de caso por caso, puede iterar a través de los valores clave, por ejemplo ..

Esta función está diseñada para enumerar a través de los regkeys para controladores ODBC y simplemente verifique la existencia de mysql en alguna parte, si no lo hará advertirá al usuario que los lleve a la página de descarga y les recordará que obtengan la versión correcta para su arquitectura (32/64)

Public Function CheckMySQL() 

    Dim arrEntryNames() 
    Dim arrValueTypes() 
    Dim rPath As String 
    rPath = "SOFTWARE\ODBC\ODBCINST.INI\ODBC Drivers" 

    Call EnumerateRegEntries(rPath, arrEntryNames, arrValueTypes) 

    If Not IsEmpty(arrEntryNames) Then 
     For Each strAsk In arrEntryNames 
      If (InStr(strAsk, "MySQL")) Then 
       strFound = strFound & strAsk & ", " 
      End If 
     Next 
    End If 

    If (Len(strFound) = 0) Then 
     #If Win64 Then 
      MsgBox "You need MySQL Driver *64 bit* - Press OK to get it!" 
     #Else 
      MsgBox "You need MySQL Driver *32 bit* - Press OK to get it!" 
     #End If 

     ActiveWorkbook.FollowHyperlink Address:="http://goo.gl/vbm6g", NewWindow:=True 

     CheckMySQL = False 
    Else 
     CheckMySQL = True 
    End If 

End Function 

Y lo necesitará para enumerar las claves de registro (para obtener más información sobre esto, consulte http://technet.microsoft.com/en-us/library/ee176771.aspx):

Public Sub EnumerateRegEntries(strKeyPath, arrEntryNames, arrValueTypes) 
    Const HKEY_CLASSES_ROOT = &H80000000& 
    Const HKEY_CURRENT_USER = &H80000001& 
    Const HKEY_LOCAL_MACHINE = &H80000002& 
    Const HKEY_USERS = &H80000003& 
    Const HKEY_CURRENT_CONFIG = &H80000005& 

    Dim objReg As Object 
    Dim strComputer As String 

    strComputer = "." 
    Set objReg = GetObject("winmgmts:{impersonationLevel=impersonate}!\\" & _ 
    strComputer & "\root\default:StdRegProv") 

    objReg.EnumValues HKEY_LOCAL_MACHINE, strKeyPath, arrEntryNames, arrValueTypes 


End Sub 
+1

Nota: 'ActiveWorkbook.FollowHyperlink' es para Excel. 'FollowHyperlink' funciona bien en Access. Consejo: Actualice el código para devolver la cadena correcta encontrada, por ejemplo: 'If (InStr (strAsk," MySQL ")> 0 e InStr (strAsk," Unicode ")> 0) Entonces strFound = strAsk modLog.Log LOGNAME, "resultados que coinciden con MySQL conductor:" y strFound, LOG_INFO Fin If' y 'Else CheckMySQL = strFound End If ' – rangoy

Cuestiones relacionadas