** NORMAS DEL FORO **
Inicio del foro Inicio del foro > Access y VBA > Access y VBA
  Mensajes nuevos Mensajes nuevos RSS - Modificar DSN de una conexion ODBC
  Preguntas frecuentes Preguntas frecuentes  Buscar en el foro   Eventos   Registro Registro  Iniciar sesion Iniciar sesion

Tema cerradoModificar DSN de una conexion ODBC

 Responder Responder
Autor
Mensaje
rokoko1 Ver desplegable
Nuevo
Nuevo


Unido: 20/Marzo/2017
Localización: Pamplona
Estado: Sin conexión
Puntos: 28
Enlace directo a este mensaje Tema: Modificar DSN de una conexion ODBC
    Enviado: 05/Agosto/2017 a las 19:16
Hola

LLevo muchos intentos y no consigo hacer carrera, estoy bastante perdido en este tema.
He encontrado informacion, pero no consigo hacerlo funcionar.
Tengo una base de datos conectada a un servidor SQl Server mediante OCDB hasta hay todo bien.
Lo que quiero es cambiar el DSN mediante vba lo ultimo que he probado es esto.

Dim tdf As TableDef
    Set db = CurrentDb
        For Each tdf In CurrentDb.TableDefs
            If tdf.Connect <> vbNullString Then
                tdf.Connect = "ODBC;DSN=1;APP=Microsoft Office 2013;UID=sa;PWD=xxxxxx;DATABASE=Fichar;TABLE=" & tdf.Name
                tdf.RefreshLink
            End If
        Next

Me dice error al conectar con 1, 1 es el nombre del archivo DSN    1.dsn

A ver si me podeis orientar un poco....
Esto tambien lo he probado  http://www.ajpdsoft.com/modules.php?name=News&file=article&sid=717  y otras tantas lineas de codigo, pero nada.........
Saludos y gracias
Arriba
Emilio Ver desplegable
Administrador
Administrador

Santander

Unido: 08/Agosto/2004
Localización: España
Estado: Sin conexión
Puntos: 18788
Enlace directo a este mensaje Enviado: 05/Agosto/2017 a las 19:31
Hola!

no hace falta ir muy lejos




Editado por Emilio - 05/Agosto/2017 a las 19:44
Saludos a todos desde Huelva

http://www.mvp-access.es/emilio/
Arriba
rokoko1 Ver desplegable
Nuevo
Nuevo


Unido: 20/Marzo/2017
Localización: Pamplona
Estado: Sin conexión
Puntos: 28
Enlace directo a este mensaje Enviado: 05/Agosto/2017 a las 19:53
Publicado originalmente por Emilio Emilio escribió:

Hola!

no hace falta ir muy lejos



Por estas paginas ya he andado, pero se me hace muy complicado la verdad.......
No acabo de entenderla bien y no tengo claro si es lo que busco
Mi idea era modificar un OCDB ya creado, por si se cambia de servidor, ip, usuario, pass, etc.....



Saludos
Arriba
rokoko1 Ver desplegable
Nuevo
Nuevo


Unido: 20/Marzo/2017
Localización: Pamplona
Estado: Sin conexión
Puntos: 28
Enlace directo a este mensaje Enviado: 09/Agosto/2017 a las 13:57
Buenas. Aqui sigo intentandolo pero sin mucho exito....
No se donde esta el fallo, pongo los datos pero al final me dice que no encuentra 1, que en este caso es el nombre de un dsn. Tambien he probado a poner hay nombre servidor, ip, etc...pero nada..
Este es el error  https://www.dropbox.com/s/phg8nupi8o2ekmc/Captura.JPG?dl=0

A ver si alguno me da alguna pista de porque falla en el apartado del dsn, esto son los parametros que hay que meter  en el formulario
ODBC;DSN=XXX;UID=XXX;PWD=XXX;DBQ=XXX

Saludos


Arriba
OmniPresente Ver desplegable
Colaborador
Colaborador
Avatar

Unido: 10/Febrero/2009
Localización: España
Estado: Sin conexión
Puntos: 1832
Enlace directo a este mensaje Enviado: 10/Agosto/2017 a las 08:45
Prueba a hacer una vinculación manual y después consulta la propiedad Connect de cualquiera de las tablas, a ver qué valor tiene.

Saludos.
Arriba
rokoko1 Ver desplegable
Nuevo
Nuevo


Unido: 20/Marzo/2017
Localización: Pamplona
Estado: Sin conexión
Puntos: 28
Enlace directo a este mensaje Enviado: 10/Agosto/2017 a las 12:10
Buenas...
Estoy utilizando la informacion de la pagina que me facilito Emilio, estas dos


Algun progreso he hecho, por lo menos ya no me da errores, pero no me crea el DSN.. me salen los msgbox de que no se han podido crear
Estoy probando estos dos codigos, uno en cada base de datos para hacer pruebas, en rojo los datos que yo indroduzco.

No consigo ver que estoy haciendo mal ........

El primero.

#If Win32 Then
    Dim intRet As Long
#Else
    Dim intRet As Integer
#End If
Dim strDriver As String
Dim strAttributes As String

'usamos el driver de SQL Server porque es el mas comun
strDriver = "SQL Server"
'Asignamos los parametros separados por null.
strAttributes = "SERVER=MONSTRUO-PC\SQLEXPRESS" & Chr$(0)
strAttributes = strAttributes & "DESCRIPTION=Temp DSN" & Chr$(0)
strAttributes = strAttributes & "DSN=DSN_TEMP" & Chr$(0)
strAttributes = strAttributes & "DATABASE=Fichar" & Chr$(0)
strAttributes = strAttributes & "UID=monstr" & Chr$(0)
strAttributes = strAttributes & "PWD=noma" & Chr$(0)
'Para mostrar el diálogo usar Form1.Hwnd en vez de vbAPINull.
intRet = SQLConfigDataSource(vbAPINull, ODBC_ADD_DSN, strDriver, strAttributes)
If intRet Then
    MsgBox "DSN Creado"
Else
    MsgBox "Fallo en la creación"
End If


El segundo

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

Const ODBC_ADD_SYS_DSN As Long = 4      ' Se creará un DSN de sistema
Const vbAPINull As Long = 0&            ' Puntero NULL

' Establecemos los atributos necesarios
sDsnName = "Ejemplo_DSN_Sistema"
sDescription = "Nuevo DSN de sistema para SQL Server"
sDriver = "SQL Server"

' Los pares de cadenas acabarán en valor Null
sAttributes = "DSN=" & sDsnName & Chr(0)
sAttributes = sAttributes & "Server=MONSTRUO-PC\SQLEXPRESS" & Chr$(0)
sAttributes = sAttributes & "Description=" & sDescription & Chr(0)
sAttributes = sAttributes & "Database=Fichar" & 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)   'Esta o creo que debe estar en true ya que es un servidor local, instalado en el pc que hago las pruebas.

' 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 (dl) Then
    MsgBox "Se ha creado el DSN de sistema."
Else
    MsgBox "No se ha podido crear el DSN de sistema."
End If


Arriba
rokoko1 Ver desplegable
Nuevo
Nuevo


Unido: 20/Marzo/2017
Localización: Pamplona
Estado: Sin conexión
Puntos: 28
Enlace directo a este mensaje Enviado: 10/Agosto/2017 a las 20:09
Sigo probando

Me salta error 3170 en tiempo de ejecucion, no se puede encontrar el archivo ISAM instalable
En los dos pc

en la linea en rojo

Public Sub CreateLinkedTable()

    ' NOTE:  This code requires the DAO object library to work.
    ' If you are using the SampleACCDB.accdb sample file, then this
    ' reference should already be present.  When unsure, check the
    ' VBA project references under Tools -> References menu option
    ' in the VBA editor and make sure a reference is set to:
    '   1. Access 2007: Microsoft Office 2007 Access database engine Object Library
    '   2. Access 2003 and older: Microsoft DAO 3.6 Object library
   
    ' Define Variables
    Dim strConnection As String
    Dim daoTableDef As DAO.TableDef
   
    ' This must reference an existing DSN
    Const strDSNName = "TestDSN"
   
    ' The application name can be used for tracing and
    ' troubleshooting the source of problems on the server.
    ' This can be anything, but usually the more specific the better.
    Const strAppName = "Microsoft Office Access 2013"
 
    ' The database where the table resides on SQL Server
    Const strDatabase = "Fichar"
 
    ' User name for logging into the database server. This could be
    ' captured by a logon form and stored in a global variable.
    Const strUserName = "sa"
 
    ' Password for logging in to the database server. This could
    ' be captured by a logon form and stored in a global variable.
    Const strPassword = "alvirau"
 
    ' Then name of the table on the remote server
    Const strRemoteTableName = "tbFicha"
 
    ' The name of the table we want create in the local file
    ' that links to the Remote Table
    Const strLocalTableName = "dbo_tbFicha"

    ' This will build the ODBC connection string for our new table
    strConnection = _
        "ODBC:" & _
        "DSN=" & strDSNName & ";" & _
        "APP=" & strAppName & ";" & _
        "DATABASE=" & strDatabase & ";" & _
        "UID=" & strUserName & ";" & _
        "PWD=" & strPassword & ";" & _
        "TABLE=" & strRemoteTableName
        
    ' This creates a new table object and adds it to the local
    ' database.   If your tables already exist, then you would
    ' skip this code and use code to refresh the links, instead
    Set daoTableDef = CurrentDb.CreateTableDef( _
                                    strLocalTableName, _
                                    dbAttachSavePWD, _
                                    strRemoteTableName, _
                                    strConnection)
    CurrentDb.TableDefs.Append daoTableDef
 
    ' Clean up
    Set daoTableDef = Nothing

End Sub
Arriba
rokoko1 Ver desplegable
Nuevo
Nuevo


Unido: 20/Marzo/2017
Localización: Pamplona
Estado: Sin conexión
Puntos: 28
Enlace directo a este mensaje Enviado: 11/Agosto/2017 a las 13:30
Ya se porque no me funcionaba este ejemplo    http://www.ajpdsoft.com/modules.php?name=News&file=article&sid=717
Tenia que ser DSN de usuario para funcionar.....
No me valdria para lo que yo quiero.....

Lo que yo quiero es que me cree un DSN de sistema.....estoy mas perdido que una aguja en un pajar...

Mi odjetivo seria imaginemonos una persona que controla unos datos de unas serie de empresas, esa empresas tienen digamos servidores locales donde estan alojados los datos. todas las empresas tienen las mismas tablas.. La persona que controla esas empresas tiene que conectarse con una misma base de datos access a ellas. En un formulario habria una serie de botones que actualizarian el DSN(cadena de conexion) dependiento a que empresas se conecte.
No solo seria para consulta de datos tambien para editarloso crearlos..  lo podria hacer de pc diferentes no siempre del mismo, de hay lo que no me vale lo de ODBC de usuario.....

A ver si me podeis orientar algo......

Saludos




Arriba
rokoko Ver desplegable
Colaborador
Colaborador
Avatar

Unido: 16/Febrero/2008
Localización: Pamplona
Estado: Sin conexión
Puntos: 914
Enlace directo a este mensaje Enviado: 22/Agosto/2017 a las 20:13
Hola.

No hago carrera con esto, algun dia quizas lo vuelva a intentar.....creo que se puede cerrar, a no ser que alguien me ilumine..jaja

Saludos

PD:Soy el que ha abierto el hilo, he recuperado mi antiguo usuario.
Arriba
buho Ver desplegable
Administrador
Administrador
Avatar

Unido: 10/Abril/2004
Localización: Lejos,por favor
Estado: Sin conexión
Puntos: 11207
Enlace directo a este mensaje Enviado: 01/Septiembre/2017 a las 00:16
...reabierto el hilo por petición del usuario
Foro Offline GRATIS:BAJAR.
Página WEB:Web

Saludos desde Valladolid
Arriba
rokoko Ver desplegable
Colaborador
Colaborador
Avatar

Unido: 16/Febrero/2008
Localización: Pamplona
Estado: Sin conexión
Puntos: 914
Enlace directo a este mensaje Enviado: 01/Septiembre/2017 a las 01:00
Muchas gracias Buho por abrime el hilo.

Pues ya lo he conseguido!!! Me conectaba correctamente pero no podia editar los registros, pero la solucion era "simple" las tablas del servidor SQL server no tenian campo clave, ponerlo y ha funcionado.
Lo he resuelto con esto, que era justo lo que buscaba, conexion ODBC sin DSN
En este enlace hay dos formas de hacerlo yo lo he hecho con el codigo de abajo.
https://support.microsoft.com/es-es/help/892490/how-to-create-a-dsn-less-connection-to-sql-server-for-linked-tables-in

La idea era conectarme a diferentes servidores sql, con la misma estructura de tablas, desde access con solo darle a un boton en un formulario.

Dos tablas locales, una con el nombre de las tablas+Id y la otra con los datos de conexion ODBC.
La funcion se nutre de esas tablas.
Este es el codigo de la web que he puesto arriba

INTRODUCCIÓN

Este artículo describe cómo crear una conexión a Microsoft SQL Server para las tablas vinculadas en Microsoft Access que no utiliza un nombre de origen de datos (DSN). Esto también es conocido como conexión sin DSN. Los ejemplos que contiene este artículo se aplican a Microsoft Office Access 2007, Microsoft Office Access 2003 y Microsoft Access 2002.

Más información

Puede utilizar un DSN para crear tablas vinculadas de SQL Server en Microsoft Access. Pero cuando la base de datos se mueve a otro equipo, debe volver a crear el DSN en el equipo. Este procedimiento puede ser problemático cuando haya que realizarla en más de un equipo. Cuando este procedimiento no se realiza correctamente, es podrán que las tablas vinculadas no pueda localizar el DSN. Por lo tanto, es podrán que las tablas vinculadas no pueda conectarse a SQL Server.

Cuando desee crear un vínculo a una tabla de SQL Server, pero no desea codificar un DSN en el cuadro de diálogo Orígenes de datos , utilice uno de los métodos siguientes para crear una conexión sin DSN a SQL Server.

Método 1: Utilice el método CreateTableDef

El método CreateTableDef le permite crear una tabla vinculada. Para utilizar este método, cree un nuevo módulo y, a continuación, agregue la siguiente función AttachDSNLessTable al nuevo módulo.
'//Name     :   AttachDSNLessTable'//Purpose  :   Create a linked table to SQL Server without using a DSN
'//Parameters
'// stLocalTableName: Name of the table that you are creating in the current database
'// stRemoteTableName: Name of the table that you are linking to on the SQL Server database
'// stServer: Name of the SQL Server that you are linking to
'// stDatabase: Name of the SQL Server database that you are linking to
'// stUsername: Name of the SQL Server user who can connect to SQL Server, leave blank to use a Trusted Connection
'// stPassword: SQL Server user password
Function AttachDSNLessTable(stLocalTableName As String, stRemoteTableName As String, stServer As String, stDatabase As String, Optional stUsername As String, Optional stPassword As String)
On Error GoTo AttachDSNLessTable_Err
Dim td As TableDef
Dim stConnect As String

For Each td In CurrentDb.TableDefs
If td.Name = stLocalTableName Then
CurrentDb.TableDefs.Delete stLocalTableName
End If
Next

If Len(stUsername) = 0 Then
'//Use trusted authentication if stUsername is not supplied.
stConnect = "ODBC;DRIVER=SQL Server;SERVER=" & stServer & ";DATABASE=" & stDatabase & ";Trusted_Connection=Yes"
Else
'//WARNING: This will save the username and the password with the linked table information.
stConnect = "ODBC;DRIVER=SQL Server;SERVER=" & stServer & ";DATABASE=" & stDatabase & ";UID=" & stUsername & ";PWD=" & stPassword
End If
Set td = CurrentDb.CreateTableDef(stLocalTableName, dbAttachSavePWD, stRemoteTableName, stConnect)
CurrentDb.TableDefs.Append td
AttachDSNLessTable = True
Exit Function

AttachDSNLessTable_Err:

AttachDSNLessTable = False
MsgBox "AttachDSNLessTable encountered an unexpected error: " & Err.Description

End Function

Para llamar a la función AttachDSNLessTable , agregue código que es similar a uno de los siguientes ejemplos de código en la macro AutoExec o en el evento Form_Open de formulario de inicio:
  • Cuando se utiliza la macro AutoExec , llamar a la función AttachDSNLessTable y, a continuación, pasar parámetros que son similares a la siguiente de la acción RunCode (EjecutarCódigo).
        AttachDSNLessTable ("authors", "authors", "(local)", "pubs", "", "")
  • Cuando se utiliza el formulario de inicio, agregue código similar al siguiente para el evento Form_Open .
  • Este es el codigo que yo he adaptado para mi proposito, va en el boton del formulario frmVinculacionSinDSN
    Private Sub Form_Open(Cancel As Integer)    If AttachDSNLessTable("authors", "authors", "(local)", "pubs", "", "") Then
    '// All is okay.
    Else
    '// Not okay.
    End If
    End Sub
    Nota: Debe ajustar su lógica de programación cuando se agrega más de una tabla vinculada a la base de datos de Access.


Ejemplo  descargar

https://www.dropbox.com/s/82h2ta5yfx26zoo/Crar%20DSN%20archivo%20formulario.mdb?dl=0

https://mega.nz/#!nghVnJzD!wH3YYBFr5lMk6o74GCOK-RJiZyhccNjedVbyrv1zJCc

  
Tambien hay un formulario que crea un DSN de archivo......
Si el proceso termina si errores, las tablas se han vinculado bien y ya estan operativas. Hasta que no cierras y abres access de nuevo no se muestran en el explorador de objetos, no se por que pero asi es.

Saludos, por mi se puede cerrar.





Editado por rokoko - 01/Septiembre/2017 a las 01:02
Arriba
 Responder Responder
  Compartir tema   

Ir al foro Permisos de foro Ver desplegable