Bueno, primero espero estar a la altura en cuanto a mi redacción, no vaya a ser que MAX me eche a los leones
Creo un DSN de sistema por código para conectarme a una base de datos MySQL que está en otro pc.
Código:
Sub crearDSN()
Dim dl As Long ' Valor devuelto por la función API
Dim sAttributes As String ' Aributos
Dim sDriver As String ' Nombre del controlador
Dim sDescription As String ' Descripción del DSN
Dim sDsnName As String ' Nombre del DSN
On Error GoTo errorDSN
' Establecemos los atributos necesarios
sDsnName = "HDPU"
sDescription = "DSN de sistema para MySQL y HDPU"
sDriver = "MySQL ODBC 3.51 Driver"
' Los pares de cadenas acabarán en valor Null
sAttributes = "DSN=" & sDsnName & Chr(0)
sAttributes = sAttributes & "Server=" & strNombreServidor & Chr$(0)
sAttributes = sAttributes & "User=" & strUsuario & Chr$(0)
sAttributes = sAttributes & "Password=" & strPassword & Chr$(0)
sAttributes = sAttributes & "Description=" & sDescription & Chr(0)
sAttributes = sAttributes & "Database=" & nombreBDInformacion & Chr(0)
' Si deseamos utilizar la autenticación de Windows NT, deberemos de
' especificarlo en la cadena de atributos
sAttributes = sAttributes & "Trusted_Connection=True" & Chr(0)
' Creamos el nuevo origen de datos de usuario especificado.
' Si deseamos que aparezca el cuadro de diálogo, tendremos que
' especificar la propiedad «hWnd» del formulario donde se realiza
' la llamada a la función API.
dl = SQLConfigDataSource(vbAPINull, ODBC_ADD_SYS_DSN, sDriver, sAttributes)
If not dl Then
MsgBox "Ha ocurrido un error mientras se creaba el DSN de Sistema para MySQL. Posiblemente necesite tener permisos de Aministrador en su máquina." & vbCrLf & "Consulte con el Aministrador de su equipo", vbCritical, "Error"
End
End If
Exit Sub
'ERROR
errorDSN:
MsgBox "Ha ocurrido un error mientras se creaba el DSN de Sistema para MySQL. Posiblemente necesite tener permisos de Aministrador en su máquina." & vbCrLf & "Consulte con el Aministrador de su equipo", vbCritical, "Error"
End
End Sub
y luego hago la conexión
Código:
oConexionInformacion.CursorLocation = adUseClient
oConexionInformacion.Open "DSN=HDPU"
esto funciona
El problema es cuando quiero cambiar de base de datos, ya que según a mi entender, lo único que hay que hacer sería cerrar la conexión, modificar el DSN y volver a abrir la conexión, pero no funciona como debería por algún problema de refresco.
Haciendo debug con F8, veo como modifica el DSN con los atributos nuevos (otra base de datos) y lo crea bien porque lo compruebo entrando en panel de control.... etc
Código:
Sub modificarDSN()
Dim dl As Long ' Valor devuelto por la función API
Dim sAttributes As String ' Aributos
Dim sDriver As String ' Nombre del controlador
Dim sDsnName As String ' Nombre del DSN
Const ODBC_CONFIG_SYS_DSN As Long = 5 ' Se modificará un DSN de sistema
' Establecemos los atributos necesarios
sDsnName = "HDPU"
sDriver = "MySQL ODBC 3.51 Driver"
' Los pares de cadenas acabarán en valor Null
sAttributes = "DSN=" & sDsnName & Chr(0)
sAttributes = sAttributes & "Server=" & strNombreServidor & Chr$(0)
sAttributes = sAttributes & "User=" & strUsuario & Chr$(0)
sAttributes = sAttributes & "Password=" & strPassword & Chr$(0)
sAttributes = sAttributes & "Database=" & nombreBDInformacion & Chr(0)
' Modificamos el origen de datos de usuario especificado
dl = SQLConfigDataSource(0&, ODBC_CONFIG_SYS_DSN, sDriver, sAttributes)
If not dl Then
MsgBox "Ha ocurrido un error mientras se creaba el DSN de Sistema para MySQL. Posiblemente necesite tener permisos de Aministrador en su máquina." & vbCrLf & "Consulte con el Aministrador de su equipo", vbCritical, "Error"
End
End If
End Sub
pero cuando vuelvo a abrir la conexión
Código:
If oConexionInformacion.State = adStateOpen Then
oConexionInformacion.Close
End If
oConexionInformacion.CursorLocation = adUseClient
oConexionInformacion.Open "DSN=HDPU"
sigue manteniedo alguna referencia antigua al DSN porque no actualiza los atributos que he modificado.
¿Le ha pasado esto a alguien?
salu2 y gracias