Cómo crear, modificar y eliminar un DSN mediante programación
Por Enrique Martínez Montejo
Última revisión: 14/08/2003
 

El siguiente artículo explica la manera de configurar un origen de datos con nombre mediante programación, lo que proporcionará una flexibilidad mayor a la hora de tener acceso a los datos, ya que el usuario no necesitará explícitamente utilizar el Adminitrador de orígenes de datos ODBC para crear, configurar, modificar y eliminar un DSN. Para ello utilizaremos la función API SQLConfigDataSource incluída en la biblioteca de vínculos dinámicos ODBC32.DLL, cuya declaración es la siguiente:

Private Declare Function SQLConfigDataSource Lib "ODBCCP32.DLL" ( _
    ByVal hwndParent As Long, ByVal fRequest As Long, _
    ByVal lpszDriver As String, ByVal lpszAttributes As String) As Long

Argumentos de la función

hwndParent

Manipulador de la ventana padre. Si el manipulador es nulo, no se visualizará ningún cuadro de diálogo de configuración. Si por el contrario le indicamos el valor de la propiedad hWnd de un formulario, se mostrará el correspondiente cuadro de diálogo de configuración para validar que todos los datos sean correctos. Si el orígen de datos con nombre ya existe, el cuado de diálogo nos preguntará si deseamos sobreescribir el DSN ya existente.

fRequest

Tipo de petición. Éste argumento puede contener uno de los siguientes valores:

Constante Valor Descripción
ODBC_ADD_DSN 1 Añade un nuevo DSN de usuario.
ODBC_CONFIG_DSN 2 Condigura (modifica) un DSN de usuario ya existente.
ODBC_REMOVE_DSN 3 Elimina un DSN de usuario existente.
ODBC_ADD_SYS_DSN 4 Añade un nuevo DSN de sistema.
ODBC_CONFIG_SYS_DSN 5 Modifica un DSN de sistema ya existente
ODBC_REMOVE_SYS_DSN 6 Elimina un DSN de sistema existente.

lpszDriver

La descripción del controlador que se utilizará. Éste es el nombre presentado a los usuarios en lugar del nombre del controlador físico (archivo DLL). Entre otros muchos, algunos valores pueden ser:

Microsoft Access Driver (*.mdb) Para bases de datos Microsoft Access.
Microsoft Excel Driver (*.xls) Para archivos de libros de trabajo de Microsoft Excel.
Microsoft Text Driver (*.txt; *.csv) Para archivos de texto con formato de tabla.
SQL Server Para bases de datos Microsoft SQL Server.
Microsoft dBASE Driver (*.dbf) Para archivos de base de datos dBASE.

Para conocer la descripción de los controladores que puede utilizar en su sistema, revise las subclaves especificadas en la siguiente clave del Registro de Windows:

HKEY_LOCAL_MACHINE\SOFTWARE\ODBC\ODBCINST.INI

lpszAttributes

Lista de los atributos en forma de "nombre de clave=valor". Estas cadenas deberán estar separadas por terminaciones Null. Los atributos especificados son generalmente entradas predeterminadas específicas del controlador, y que se incluyen en el Registro de Windows. No es necesario proporcionar todas las entradas, ya que el controlador puede solicitárselas al usuario mediante un cuadro de diálogo, siempre y cuando que en el parámetro hwndParent se haya establecido en Null.

Valor de retorno

La función devolverá 1 si ésta ha terminado correctamente, y 0 en caso de error. Si al llamar a la función no existe ninguna entrada en el Registro de Windows, la función devolverá 0.

Crear un DSN de usuario para Microsoft Access

Un origen de datos de usuario ODBC almacena la información de conexión al proveedor de datos indicado, y sólo es visible y utilizable en el equipo actual por el usuario indicado. Por cada nuevo orígen de datos de usuario, se creará una subclave en la siguiente clave del Registro de Windows:

HKEY_CURRENT_USER\Software\ODBC\ODBC.INI

A continuación vamos a crear un nuevo DSN de usuario, que utilizará el driver de Microsoft Access para conectarse con el origen de datos:

Dim dl As Long               ' Valor devuelto por la función API
Dim sPath As String          ' Ruta de la base de datos
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_DSN As Long = 1         ' Se creará un DSN de usuario

' Establecemos los atributos necesarios
sDsnName = "Ejemplo_DSN_Usuario"
sDescription = "Nuevo DSN de usuario para Access"
sPath = "C:\Mis documentos\Bd1.mdb"
sDriver = "Microsoft Access Driver (*.mdb)"

' Los pares de cadenas acabarán en valor Null
sAttributes = "DSN=" & sDsnName & Chr(0)
sAttributes = sAttributes & "Description=" & sDescription & Chr(0)
sAttributes = sAttributes & "DBQ=" & sPath & Chr(0)

' Indicamos la ruta del archivo de información de grupos de trabajo
sAttributes = sAttributes & "SystemDB=C:\Windows\System\System.mdw" & Chr(0)

' El usuario que inicia sesión por defecto
sAttributes = sAttributes & "UID=Admin" & Chr(0)

' La contraseña del usuario por defecto
sAttributes = sAttributes & "PWD=123456" & Chr(0)

' Creamos el nuevo origen de datos de usuario especificado
dl = SQLConfigDataSource(0&, ODBC_ADD_DSN, sDriver, sAttributes)

If (dl = 1) Then
    MsgBox "El DSN de usuario se ha creado correctamente."
Else
    MsgBox "No se ha podido crear el DSN de usuario especificado."
End If

Crear un DSN de sistema para Microsoft SQL Server

Un origen de datos de sistema ODBC almacena información acerca de cómo conectarse al proveedor de datos indicado. Un origen de datos de sistema es visible para todos los usuarios de un equipo, incluidos los servicios de NT. A diferencia del lugar donde se almacena la información del DSN de usuario, por cada nuevo orígen de datos de sistema se creará una subclave en la siguiente clave del Registro de Windows:

HKEY_LOCAL_MACHINE\SOFTWARE\ODBC\ODBC.INI

A continuación vamos a crear un nuevo DSN de sistema, que utilizará el driver de Microsoft SQL Server para conectarse con el origen de datos:

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=(Local)" & Chr$(0)
sAttributes = sAttributes & "Description=" & sDescription & Chr(0)
sAttributes = sAttributes & "Database=pubs" & 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 (dl) Then
    MsgBox "Se ha creado el DSN de sistema."
Else
    MsgBox "No se ha podido crear el DSN de sistema."
End If

Modificar un DSN de usuario para Microsoft dBASE Driver

Para que la función API modifique los valores que deseemos, necesariamente tendremos que indicar el nombre del origen de datos de usuario (o de sistema) así como el nombre del driver ODBC utilizado. Igualmente, el parámetro fRequest deberá de tener el valor de la constante ODBC_CONFIG_DSN (para modificar un DSN de usuario) o ODBC_CONFIG_SYS_DSN (para modificar un DSN de sistema).

A continuación vamos a modificar la ruta del directorio por defecto que tenemos especificado en un DSN de usuario, el cual utiliza el driver ODBC de Microsoft dBASE:

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_DSN As Long = 2  ' Se modificará un DSN de usuario

' Establecemos los atributos necesarios
sDsnName = "dBASE Files"
sDriver = "Microsoft dBASE Driver (*.dbf)"

' Los pares de cadenas acabarán en valor Null
sAttributes = "DSN=" & sDsnName & Chr(0)
sAttributes = sAttributes & "DefaultDir= C:\Mis documentos\" & Chr(0)

' Modificamos el origen de datos de usuario especificado
dl = SQLConfigDataSource(0&, ODBC_CONFIG_DSN, sDriver, sAttributes)

If (dl = 1) Then
    MsgBox "El DSN de usuario se ha modificado correctamente."
Else
    MsgBox "No se ha podido modificar el DSN de usuario especificado."
End If

Si no se especifica el parámetro DefaultDir, el driver ODBC para dBASE utilizará el directorio actual del sistema, salvo que en la cadena de conexión especifiquemos explícitamente dicho parámetro.

Eliminar un DSN de sistema

Para eliminar un nombre de origen con nombre, simplemente deberemos de especificar el nombre del DSN así como el driver ODBC utilizado. El parámetro fRequest deberá de tener el valor de la constante ODBC_REMOVE_DSN (para eliminar un DSN de usuario) o ODBC_REMOVE_SYS_DSN (para eliminar un DSN de sistema).

El siguiente ejemplo eliminará definitivamente un DSN de sistema:

Dim dl As Long                 ' Valor devuelto por la función API
Dim sDriver As String          ' Nombre del controlador
Dim sDsnName As String         ' Nombre del DSN

Const ODBC_REMOVE_SYS_DSN As Long = 6    ' Se eliminará un DSN de sistema

' Establecemos los atributos necesarios

' CUIDADO: no dejar espacios en blanco entre el parámetro
' «DSN», el signo igual y el nombre del DSN (DSN=Nombre DSN)
sDsnName = "DSN=Ejemplo_DSN_Sistema"
sDriver = "SQL Server"

' Modificamos el origen de datos de usuario especificado
dl = SQLConfigDataSource(0&, ODBC_REMOVE_SYS_DSN, sDriver, sDsnName)

If (dl = 1) Then
    MsgBox "El DSN de sistema se ha eliminado correctamente."
Else
    MsgBox "No se ha podido eliminar el DSN de sistema especificado."
End If

 

Otros enlaces de interés:

Cómo leer los orígenes de datos con nombre instalados en nuestro sistema

Indice de ejemplos de ODBC

Enrique Martínez Montejo - 2003

NOTA: La información contenida en este artículo, así como el código fuente incluido en el mismo, se proporciona COMO ESTÁ, sin garantías de ninguna clase, y no otorga derecho alguno. Usted asume cualquier riesgo al poner en práctica, utilizar o ejecutar lo explicado, recomendado o sugerido en el presente artículo.

NOTE: The information contained in this article and source code included therein, is provided AS IS without warranty of any kind, and confers no rights. You assume any risk to implement, use or run it explained, recommended or suggested in this article.