** NORMAS DEL FORO **
Inicio del foro Inicio del foro > Access y VBA > Access y Otros sistemas
  Mensajes nuevos Mensajes nuevos RSS - Crear conexión ODBC con MySQL
  Preguntas frecuentes Preguntas frecuentes  Buscar en el foro   Eventos   Registro Registro  Iniciar sesion Iniciar sesion

Tema cerradoCrear conexión ODBC con MySQL

 Responder Responder
Autor
Mensaje
Vangiogh Ver desplegable
Habitual
Habitual
Avatar

Unido: 24/Marzo/2005
Localización: España
Estado: Sin conexión
Puntos: 196
Enlace directo a este mensaje Tema: Crear conexión ODBC con MySQL
    Enviado: 15/Noviembre/2013 a las 21:08
Hola buenas noches,
Estoy intentando realizar una conexión para poder vincular tablas desde vba. He visto que hay un hilo donde aparece dicha información y tras pelearme 3 días he llegado a la conclusión de que soy medio... Así pues, ¿alguien podría decirme en que me equivoco?

Según el enlace anteriormente mencionado y que es: http://www.mvp-access.com/foro/vba-access-mysql-revincular_topic77383.html?KW=mysql+odbc
te propone que en un formulario en la parte de form_load pongas la siguiente línea:
Private Sub Form_Load()
    InitConnect "user", "password"
End Sub

Hasta aquí todo correcto.

Luego te dice que en command del formulario escribas el siguiente código:
Private Sub Comando0_Click()
  ' NOTA:  Este código trabaja con la librería DAO.
   ' Probado conectando MySQL con Access 2010 x64.
  
   ' Variables
   Dim dbs As DAO.Database
   Dim tdf As DAO.TableDef
   Dim qdf As DAO.QueryDef
   Dim rst As DAO.Recordset
   Dim strCN As String
   Dim strRT As String 'Nombre de la tabla en el servidor remoto
   Dim strLT As String 'Nombre de la tabla local a crear
  
   ' Driver.
   Const strDriver = "{MySQL ODBC 5.2 Unicode Driver}"
   ' Base de datos.
   Const strDB = "mtto"
   ' Servidor.
   Const strServer = "{web01.centromedicodelfos.es}"
  
' Establezco la base de datos actual
Set dbs = CurrentDb
' Verifico si la consulta temporal de paso a través existe y si es así la borro
For Each qdf In dbs.QueryDefs
   If qdf.Name = "qsptTemp" Then
       If Not IsNull(dbs.QueryDefs("qsptTemp").sql) Then
           dbs.QueryDefs.Delete "qsptTemp"
       End If
   End If
Next

' Establezco la consulta de paso a través
Set qdf = dbs.CreateQueryDef("qsptTemp")

' Establezco la cadena de conexión
       strCN = _
       "ODBC;DRIVER=" & strDriver & ";" & _
       "DATABASE=" & strDB & ";" & _
       "SERVER=" & strServer
' Conecto al servidor remoto
qdf.Connect = strCN
' Consulta de paso a través
qdf.sql = "SELECT usuario FROM tblpersonal"
' Establezco el recordset a partir de los resultados de la consulta de paso a través
Set rst = dbs.OpenRecordset("qsptTemp")

If Not rst.EOF And Not rst.BOF Then
       Do Until rst.EOF ' Recorro los nombres de las tablas remotas
       strRT = rst.Fields(0)
       strLT = rst.Fields(0)
      
       strRT = "tblPersonal"
       strLT = "tblPersonal"
       ' Cadena completa de conexión.
           strCN = _
           "ODBC;DRIVER=" & strDriver & ";" & _
           "DATABASE=" & strDB & ";" & _
           "SERVER=" & strServer & ";" & _
           "TABLE=" & strRT
       
           ' Crea la tabla vinculada y la añade a la base de datos
           Set tdf = dbs.CreateTableDef(strLT, 0, strRT, strCN)
           dbs.TableDefs.Append tdf

           rst.MoveNext
       Loop
       qdf.Close
       rst.Close
   End If
   dbs.TableDefs.Refresh 'Refresco la colección TableDefs
   Application.RefreshDatabaseWindow 'Refresco la ventana de tablas
   ' Limpieza
   Set tdf = Nothing
   Set qdf = Nothing
   Set dbs = Nothing
End Sub

Y por último te dice que incorpores en un módulo lo siguiente:
Public Function InitConnect(UserName As String, Password As String) As Boolean
' Description: Should be called in the application's startup
'              to ensure that Access has a cached connection
'              for all other ODBC objects' use.
On Error GoTo ErrHandler

   Dim dbCurrent As DAO.Database
   Dim qdf As DAO.QueryDef
   Dim rst As DAO.Recordset
   Dim strConnection As String
     
   '

   strConnection = "ODBC;DRIVER={MySQL ODBC 5.2 Unicode Driver};" & _
                    "Server=" & "{web01.centromedicodelfos.es}" & ";" & _
                    "Port=" & 3306 & ";" & _
                    "Option=" & 3 & ";" & _
                    "Stmt=;" & _
                    "Database=" & "mtto" & ";"
 
   Set dbCurrent = DBEngine(0)(0)
   Set qdf = dbCurrent.CreateQueryDef("")
 
   With qdf
       .Connect = strConnection & _
                    "Uid=" & UserName & ";" & _
                    "Pwd=" & Password
       .sql = "SELECT CURRENT_USER();"
       Set rst = .OpenRecordset(dbOpenSnapshot, dbSQLPassThrough)
   End With
   InitConnect = True

ExitProcedure:
   On Error Resume Next
       Set rst = Nothing
       Set qdf = Nothing
       Set dbCurrent = Nothing
   Exit Function
ErrHandler:
   InitConnect = False
   MsgBox Err.Description & " (" & Err.Number & ") encountered", _
       vbOKOnly + vbCritical, "InitConnect"
   Resume ExitProcedure
   Resume
End Function


Hasta aquí yo creo que he conseguido hacerlo. Igual que he cambiado las variables que el decía (servidor, puerto, base de datos, nombre de la tabla). Haciendo un debug al código que introducí en command, parece funcionar todo pero acaba petando en la línea:
dbs.TableDefs.Append tdf
Y el error que da es el siguiente:
Se ha producido el error '3146' en el tiempo de ejecución:
ODBC: falló la llamada.

Gracias y disculpad el rollo.

Un saludo.
Arriba
genoma111 Ver desplegable
Administrador
Administrador
Avatar

Unido: 28/Marzo/2011
Localización: ...
Estado: Sin conexión
Puntos: 3248
Enlace directo a este mensaje Enviado: 15/Noviembre/2013 a las 21:14
Parece un problema con el driver. Qué versión utilizas?

También vale la pena que implementes este manejador de errores, así puedes tener más información acerca del verdadero problema:
http://support.microsoft.com/kb/161288

Edito: Me refiero a qué versión de MySql utilizas... quedó como si te estuviera preguntando la versión del driver...


Editado por genoma111 - 15/Noviembre/2013 a las 21:45
"To VBA or not to VBA... that's the question" DFP
Arriba
guarracuco Ver desplegable
Moderador
Moderador


Unido: 24/Abril/2004
Localización: EEUU
Estado: Sin conexión
Puntos: 3239
Enlace directo a este mensaje Enviado: 15/Noviembre/2013 a las 21:27
Primero debes informarte con el hosting si se permite la administración remota de MySQL. Si se permite, por lo general en el panel debes indicar la(s) IP(s) que pueden conectarse.
Arriba
Vangiogh Ver desplegable
Habitual
Habitual
Avatar

Unido: 24/Marzo/2005
Localización: España
Estado: Sin conexión
Puntos: 196
Enlace directo a este mensaje Enviado: 16/Noviembre/2013 a las 15:27
Hola a los 2,
      Vamos a ver, respondiendo a Genoma111 he probado a utilizar la versión 5.2 y la 5.1 pero no hay ninguna diferencia (el error es el mismo).
 
      He intentado implementar lo que me comentas de los errores, pero no se bien donde implementar ese código.

      Contestando a Guarracuco, he intentado crear la conexión manualmente y si que funciona, así que entiendo que el hosting si que te permite la administración remota de MySql. Respecto a lo de indicar una o varias IP's es cierto, pero también tienes que poder hacerlo sin ella especificando el redireccionamiento sobre el DNS.
Arriba
genoma111 Ver desplegable
Administrador
Administrador
Avatar

Unido: 28/Marzo/2011
Localización: ...
Estado: Sin conexión
Puntos: 3248
Enlace directo a este mensaje Enviado: 16/Noviembre/2013 a las 19:31
Para probar los conectores de MySQL, existe una herramienta denominada MySql workbench.
Si dicha herramienta funciona bien, en general, el conector se puede decir que debe funcionar con Access.
Dicha herramienta vale la pena tenerla a mano cuando trabajas contra MySql.

El error '3146' es un error derivado del ODBC que puede significar muchas cosas diferentes, por eso es necesario que implementes el manejador de errores como lo muestran en el ejemplo, para obtener detalles del error.

No veo qué te confunde de la implementación... valdría la pena que detallaras lo que has tratado.

También, si es la primera vez que trabajas contra MySql, intenta primero cosas simples como obtener la estructura de la base de datos por medio de una consulta de paso a través, vincular una tabla manualmente, etc.

Finalmente, como bien digo en el ejemplo, trabajar con tablas vinculadas no es lo más recomendable...

"To VBA or not to VBA... that's the question" DFP
Arriba
Vangiogh Ver desplegable
Habitual
Habitual
Avatar

Unido: 24/Marzo/2005
Localización: España
Estado: Sin conexión
Puntos: 196
Enlace directo a este mensaje Enviado: 16/Noviembre/2013 a las 19:48
Hola Genoma111,
        Se que no es recomendable trabajar con tablas vinculadas. De todas formas, realicé un programa con access con tablas vinculadas (manualmente) y funcionaba perfectamente. Tras ello colgue el access resultante en un servidor e hice una copia de dicho access y vincule todas las tablas contra la del servidor.
        Hasta aquí funcionó todo perfectamente, el problema fué cuando puse la base de datos resultante en otro ordenador, en donde me petaba la conexión con MySQL, y me dí cuenta que tenía que realizar manualmente la conexión con el ODBC en cada uno de los ordenadores donde pusiera dicha base de datos. Si fuesen 2 o 3 ordenadores, lo haría manualmente pero pensé que si lo integrara en el programa, me evitaría problemas futuros.
        De todas formas, esta tarde me he dado cuenta que las conexiones ODBC se guardan en el registro de windows, así que exportando las líneas que codica el ODBC que necesito y ejecutando dicho archivo con un script desde el servidor de dominio, solucionaba el problema y no tengo necesidad de integrarlo en access. (básicamente, me he rendido porque ya he perdido muchas horas intentando realizar la conexión y no ha habido forma.)
        Por la cual cosa, te agradezco todo el tiempo que has perdido intentándome ayudar, pero creo que este hilo se puede cerrar. (entiendo que mi forma de resolverlo es una "chapuza" pero quizás, cuando tenga más tiempo intentaré resolver el motivo por el cual no me funciona.)

Gracias.
Un saludo.
    
Arriba
genoma111 Ver desplegable
Administrador
Administrador
Avatar

Unido: 28/Marzo/2011
Localización: ...
Estado: Sin conexión
Puntos: 3248
Enlace directo a este mensaje Enviado: 16/Noviembre/2013 a las 19:55
No es chapuza.
Revisa cómo crear conexiones DSN-less... Doug Steele tiene un ejemplo de ello, si no estoy mal revisado por Ben Clothier y otros.
Otra manera en que yo abordo el tema, cuando quiero trabajar con DSNs en varias máquinas, es creándolos al vuelo durante la ejecución.
Finalmente un archivo DSN es simplemente un archivo de texto.

"To VBA or not to VBA... that's the question" DFP
Arriba
 Responder Responder
  Compartir tema   

Ir al foro Permisos de foro Ver desplegable