Autor Tema: ODBC  (Leído 2779 veces)

0 Usuarios y 1 Visitante están viendo este tema.

cobein

  • Moderador Global
  • Gigabyte
  • *****
  • Mensajes: 348
  • Reputación: +63/-0
  • Más Argentino que el morcipan
    • Ver Perfil
ODBC
« en: Junio 05, 2012, 03:12:18 pm »
Buenas, hace unos dias que estoy programando algo y como lo hago en varios lugares me tope con el problema de que hay varias versiones del conector de MySQL en los distintos lugares lo cual me obliga a modificar la cadena de coneccion,  de "Driver={mySQL ODBC 3.51 Driver} a "Driver={mySQL ODBC 5.1 Driver} y la verdad me canse, hice un modulito que por ahora me parecio lo mejor como para solucionar este problema, lo dejo aca por si a alguno le sirve.

El modulo enumera los drivers disponibles basicamente como cuando abren "Origenes de Datos ODBC" del panel de control.

Código: [Seleccionar]
Option Explicit

'Based on Randy Birch's code
'http://vbnet.mvps.org/index.html?code/system/sqldatasources.htm
'VBnet/Randy Birch

Private Const SQL_MAX_DSN_LENGTH    As Long = 32
Private Const SQL_MAX_DESC_LENGTH   As Long = 128
Private Const SQL_SUCCESS           As Long = 0
Private Const SQL_FETCH_NEXT        As Long = 1
Private Const SQL_NULL_HANDLE       As Long = 0
Private Const SQL_HANDLE_ENV        As Long = 1
Private Const SQL_ATTR_ODBC_VERSION As Long = 200
Private Const SQL_OV_ODBC3          As Long = 3
Private Const SQL_IS_INTEGER        As Long = (-6)

Private Declare Function SQLDataSources Lib "odbc32.dll" (ByVal hEnv As Long, ByVal fDirection As Integer, ByVal szDSN As String, ByVal cbDSNMax As Integer, pcbDSN As Integer, ByVal szDescription As String, ByVal cbDescriptionMax As Integer, pcbDescription As Integer) As Long
Private Declare Function SQLAllocHandle Lib "odbc32.dll" (ByVal HandleType As Integer, ByVal InputHandle As Long, OutputHandlePtr As Long) As Long
Private Declare Function SQLSetEnvAttr Lib "odbc32.dll" (ByVal EnvironmentHandle As Long, ByVal dwAttribute As Long, ByVal ValuePtr As Long, ByVal StringLen As Long) As Long
Private Declare Function SQLFreeHandle Lib "odbc32.dll" (ByVal HandleType As Integer, ByVal Handle As Long) As Long
                         
Public Type tODBC
    sServer     As String
    sDriver     As String
End Type

'Example: Retrieve MySQL connection string
'Private Sub Form_Load()
'    Debug.Print GetDriverConnection("mysql")
'End Sub

Public Function IsDriverAvailable(ByVal sHint As String) As Boolean
    IsDriverAvailable = Not (GetDriverConnection(sHint) = vbNullString)
End Function

Public Function GetDriverConnection(ByVal sHint As String) As String
    Dim tODBC() As tODBC
    Dim i       As Long
   
    tODBC = GetUserSystemDSN
   
    For i = 0 To UBound(tODBC)
        If InStr(1, tODBC(i).sDriver, sHint, vbTextCompare) Then
            GetDriverConnection = "{" & tODBC(i).sDriver & "}"
            Exit Function
        End If
    Next
End Function

Public Function GetUserSystemDSN() As tODBC()
    Dim hEnv    As Long
    Dim sServer As String
    Dim sDriver As String
    Dim nSvrLen As Integer
    Dim nDvrLen As Integer
    Dim lCount  As Long
    Dim tODBC() As tODBC
   
    ReDim Preserve tODBC(0)
   
    If SQLAllocHandle(SQL_HANDLE_ENV, SQL_NULL_HANDLE, hEnv) <> 0 Then

        If Not SQLSetEnvAttr(hEnv, SQL_ATTR_ODBC_VERSION, SQL_OV_ODBC3, SQL_IS_INTEGER) = 0 Then
            Do
                sServer = Space$(SQL_MAX_DSN_LENGTH)
                sDriver = Space$(SQL_MAX_DESC_LENGTH)
               
                If SQLDataSources(hEnv, SQL_FETCH_NEXT, sServer, SQL_MAX_DSN_LENGTH, nSvrLen, _
                   sDriver, SQL_MAX_DESC_LENGTH, nDvrLen) = SQL_SUCCESS Then
                   
                    lCount = lCount + 1
                    ReDim Preserve tODBC(lCount)
                    With tODBC(lCount)
                        .sServer = Left$(sServer, nSvrLen)
                        .sDriver = Left$(sDriver, nDvrLen)
                    End With
                Else
                    Exit Do
                End If
            Loop
        End If
        Call SQLFreeHandle(SQL_HANDLE_ENV, hEnv)
    End If
    GetUserSystemDSN = tODBC
End Function


seba123neo

  • Terabyte
  • *****
  • Mensajes: 763
  • Reputación: +88/-5
    • Ver Perfil
Re:ODBC
« Respuesta #1 en: Junio 05, 2012, 06:18:07 pm »
Hola, que yo sepa se pueden tener las 2 versiones instaladas al mismo tiempo, por lo tanto no se deberia modificar la cadena, con instalar el odbc que necesites listo.

raul338

  • Terabyte
  • *****
  • Mensajes: 894
  • Reputación: +62/-8
  • xD fan!!!!! xD
    • Ver Perfil
    • Raul's Weblog
Re:ODBC
« Respuesta #2 en: Junio 05, 2012, 10:32:34 pm »
Creo que se pueden tener instalados las dos versiones. Pero yo recomendaría que obligues a usar una versión en especifico.

Aunque de igual manera pinta bien. Yo pensaba que era tipo algo para usar ODBC por apí y dejar los recordset :P

cobein

  • Moderador Global
  • Gigabyte
  • *****
  • Mensajes: 348
  • Reputación: +63/-0
  • Más Argentino que el morcipan
    • Ver Perfil
Re:ODBC
« Respuesta #3 en: Junio 06, 2012, 09:06:24 am »
Si, el tema es que si la version del conector es diferente a la del programa, el mismo deja de funcionar... y esto no me parece logico, lo mismo si tenes que instalar una version en particular, digo seria bueno que el usuario pueda tener la ultima y mas actualizada sin que esto impida el uso del programa.

Saludos