Crear origenes de datos o DSN con Delphi

Al usar proveedores ODBC en nuestros desarrollos, nos enfrentamos al problema de crear los DSN en los equipos donde se intalarán nuestras aplicaciones.  En aquellas situaciones donde el sistema se instalará en un solo equipo esto se resuelve de manera muy sencilla pues el DSN generalmente es creado por el usuario usando el panel de control. Pero, ¿Qué sucede en aquellos equipos donde el usuario hace uso de un instalador que ejecuta las tareas de instalación y configuración de manera automática?.  Es para esa situación en específico que he creado este artículo.

Microsoft nos proporciona en el siguiente enlace: “Installer DLL API Reference Function” información detallada sobre las funciones que podemos usar para generar DSN (orígenes de datos) desde nuestras aplicaciones, sin la intervención del usuario permitiéndonos con ello distribuir nuestras aplicaciones que hacen uso de proveedores ODBC de manera automática.

Del listado de funciones que nos aparecen en la documentación, usaremos únicamente dos:  SQLConfigDataSource, SQLInstallerError.  SQLConfigDataSource nos permite agregar o eliminar un DSN y SQLInstallerError nos ayuda a controlar el error obtenido en caso de fallar la creación del DSN.

Un ejemplo de estas funciones puedes encontrarlo en este enlace:  How To Create and Remove a DSN in Visual Basic. El ejemplo, a pesar de estar en VB es bastante esclarecedor sobre el uso de la función así que vamos a crear nuestra propia implementación de creación de DSN con Delphi.

Crear un DSN con Delphi para SQLite.

***Importante. Aunque este ejemplo está destinado a crear un DSN para SQLite, el código aplica para cualquier controlador ODBC que se tenga instalado en el equipo.

Considerando el reciente artículo sobre como conectarnos a SQLite desde delphi, aprovecharemos lo visto allí para crear un DSN desde delphi que permita conectarnos a nuestra base de datos sin tener que hacer configuración adicional a la instalación del controlador ODBC. El primer paso a realizar será como vimos en el artículo, la instalación de SQLiteODBC. Si ya lo has instalado esto no será necesario.

Una vez instalador el controlador ODBC ejecutaremos Delphi y crearemos una nueva aplicación VCL Forms. Aclaro que este ejemplo aplica a cualquier versión superior a Delphi 6. En la nueva aplicación colocaremos 5 EditBox y un botón configurados de la siguiente manera:

FormDesign

Una vez creada nuestra interfaz. Iremos al editor de código de la unidad y agregaremos al encabezado lo siguiente:

type
  SQLHWnd = LongWord;
  SQLChar = Char;
  PSQLChar = ^SQLChar;
  SQLBOOL = WordBool;
  UDword = LongInt;
  PUDword = ^UDword;
  SQLReturn = Smallint;

const
  ODBC_ADD_DSN     = 1;         // Add data source
  ODBC_CONFIG_DSN  = 2;         // Configure (edit) data source
  ODBC_REMOVE_DSN  = 3;         // Remove data source
  SQL_MAX_MESSAGE_LENGTH = 5000; //Tamaño del buffer donde se almacenará el mensaje de error

function SQLConfigDataSource (hwndParent: SQLHWnd; fRequest: WORD;
                  lpszDriver: PChar; lpszAttributes: PChar): SQLBOOL; stdcall;
         external 'odbccp32.dll' name 'SQLConfigDataSourceW';

function SQLInstallerError (iError: WORD; pfErrorCode: PUDword; lpszErrorMsg: PChar;
                   cbErrorMsgMax: WORD; pcbErrorMsg: PWORD): SQLReturn; stdcall;
         external 'odbccp32.dll' name 'SQLInstallerErrorW';

 

Declaradas las funciones y los tipos de datos  que les corresponden, editaremos el evento OnClick del botón “Crear DSN”. y agregaremos el siguiente código:

procedure TForm1.BitBtn1Click(Sender: TObject);
var
  strAttributes: string;
  pfErrorCode: UDword;
  errMsg: PChar;
begin
  strAttributes := 'DSN=' + EdtDsnName.Text + Chr(0);
  strAttributes := strAttributes + 'DESCRIPTION=' + EdtDesc.Text + Chr(0);
  strAttributes := strAttributes + 'Timeout=' + EdtTimeOut.Text + Chr(0);
  strAttributes := strAttributes + 'DATABASE=' + edtDatabase.text + Chr(0);
  strAttributes := strAttributes + 'SyncPragma=' + 'NORMAL' + Chr(0);

  if not SqlConfigDataSource(0, ODBC_ADD_DSN, Pchar(Edtcontrolador.Text), PChar(strAttributes)) then begin
    errMsg := AllocMem(SQL_MAX_MESSAGE_LENGTH);
    SQLInstallerError(1, @pfErrorCode, errMsg, SQL_MAX_MESSAGE_LENGTH, nil);
    MessageBox(0, errMsg, PChar('Ocurrió un error al crear el DSN' + IntToStr(pfErrorCode)), 0);
    FreeMem(errMsg);
  end
 Else Application.MessageBox('El DSN fué creado con éxito','Crear DSN',MB_OK + MB_ICONINFORMATION)
end;

Con esto ya tendremos listo nuestro programa que creará de manera dinámica un DSN que nos permita conectarnos vía ODBC a SQLite. Ejecutamos el programa y presionamos el botón “Crear DSN”

msgconfirmation

Una vez creado el DSN abrimos el administrador de orígenes para verificar que efectivamente haya sido creado:

 

DSNAdministrator

Como puede verse, la creación dinámica de orígenes DSN con Delphi puede resultar una tarea muy sencilla de realizar.

Si lo consideras necesario, en este enlace puedes descargar el código del programa muestra.

8 Comments

  1. Muy interesante. Yo utilizo algo parecido para generar la cadena de conexión.

    ConnStr:= PromptDataSource(Handle,ConnStr);

    Siendo ConnStr la cadena de conexión. Esto nos muestra el típico dialogo “Propiedades de vinculo de datos” donde podemos configurar a nuestro gusto la conexión, y devuelve la cadena de conexión para que la utilicemos en un TADOQuery por ejemplo, o para guardarla en .ini y usarla mas tarde.

    Por otro lado veo algo de “Whats APP” y SQLite ¿estas haciendo un programilla para ver los mensajes del Whatsapp? jejeje … solo por curiosidad

    • Claro, la mayoría de programas de instalación te permiten lanzar procesos durante la instalación y aún si el instalador no lo permitiese, puedes añadir una rutina de validación en tu aplicación donde si no encuentra el DSN lanzaría un asistente hecho en delphi para su creación.

      Saludos

Deja un comentario