Archivos Mensuales: enero 2013

Conectando con bases de datos SQL Server Compact

Digi3D.NET permite que almacenemos información alfanumérica en bases de datos basadas en archivo (como Access, o SQL Server Compact) o basadas en servidor, como Microsoft SQL Server, Oracle, MySQL, PostgreSQL, …

En ocasiones nos interesará crear una base de datos por cada archivo de dibujo. En este escenario, es posible que nos interese utilizar una base de datos de archivo que se asociará con cada archivo de dibujo.

Tenemos varias posibilidades, una de ellas (la opción clásica) es asociar un archivo Access a cada archivo de dibujo. Esta solución tiene dos inconvenientes:

  • Access no es gratuito, por lo tanto tendremos que adquirir una licencia de esta aplicación para poder crear la base de datos, realizar consultas, …
  • No es compatible con aplicaciones de 64 bits, por lo tanto queda descartado para Digi3D.NET si tenemos instalada la versión de 64 bits

Pero existen otras soluciones. Hoy vamos ha hablar de Microsoft SQL Server Compact.

Un archivo de base de datos Microsoft SQL Server Compact tiene la extensión .sdf.

Este tipo de bases de datos tienen muchas ventajas si las comparamos con Access, entre las que podríamos destacar (aunque hay muchas más):

  • Es compatible tanto con aplicaciones de 64 bits como de 32 bits.
  • Es gratuita.
  • Es espacial (permite almacenar geometrías y consultas espaciales).
  • Permite crear tablas de hasta 4 GB de información (frente a 4 de Access).
  • Permite almacenar cadenas de caracteres de hasta 4000 caracteres (frente a 255 de Access).

Si queremos utilizar una base de datos Microsoft SQL Server Compact tan solo tenemos que instalar un pequeño motor de base de datos en nuestro ordenador. A día de hoy existen dos versiones de este motor de bases de datos:

Si tienes instalado Digi3D.NET en tu equipo, ya tienes instalado Microsoft SQL Server Compact 3.5 SP2, pues es uno de los requisitos necesarios para instalar la aplicación.

Para crear estas bases de datos y realizar consultas SQL sobre ellas disponemos de varias herramientas en función de la versión:

Microsoft SQL Server Compact 3.5 SP2 Microsoft SQL Server Compact 4.0 SP1
SQL Server 2008 R2 Management Studio (Express) (3.5 SP2) Visual Studio 2010 (3.5 SP2)
Visual Studio 2010 (3.5 SP2)
Visual Studio 2010 SP1 + 4.0 Tools (3.5 SP2 + 4.0)
Visual Studio Express 2012 for Web
WebMatrix 2

Si te fijas hay muchas más opciones para la versión 4, pero a mi personalmente me encanta Microsoft SQL Server Management Studio para trabajar con bases de datos. Ni te molestes en intentar conectar con una base de datos Microsoft SQL Server Compact 4.0 con ninguna de las versiones Microsoft SQL Server Management Studio, ni siquiera con la versión 2012. Microsoft decidió que nunca jamás se podrán administrar estas bases de datos con este programa, y en parte tienen razón. Este programa está pensado para servidores de bases de datos completos, con Transact SQL completo, con procedimientos almacenados, con replicación, informes, y un sinfín de cosas que no admiten las bases de datos compact que son algo muy sencillo pensado inicialmente para aplicaciones de telefonía móvil.

NuevoProyectoMostrandoBotonSeleccionDataLinkProperties

Una vez que hemos creado una base de datos SQL Server Compact con cualquiera de estas herramientas (en el formato adecuado, lee el capítulo de Bases de datos del libro Digi3D en profundidad para aprender el esquema de una base de datos compatible con Digi3D.NET), lo único que nos queda es hacer que Digi3D.NET se conecte con nuestra base de datos.

La forma de conectar Digi3D.NET con una base de datos consiste en indicar en la pestaña Archivo de dibujo del cuadro de diálogo Nuevo Proyecto el tipo de Modelo de Datos (a día de hoy podemos seleccionar o CATDBS o Geographics) y en el siguiente campo, especificar la cadena de conexión a la base de datos.

La cadena de conexión es una línea de texto en un formato especial que indica por un lado el proveedor de base de datos (el motor de base de datos, runtime, o como lo queramos llamar), la ruta a la base de datos y opcionalmente una serie de parámetros.

Un ejemplo de cadena de conexión podría ser el siguiente:

Provider=SQLOLEDB.1;Integrated Security=SSPI;Persist Security Info=False;Initial Catalog=PruebaCatDBS;Data Source=.sqlexpress

Si te fijas no es trivial crear estas cadenas de conexión, por eso, existe un cuadro de diálogo común de Windows que nos va a facilitar la tarea de crear cadenas de conexiones. En Digi3D.NET podemos hacer que aparezca este cuadro de diálogo pulsando el botón de los tres puntos que aparece en la ventana en la que se nos solicita la cadena de conexión.

CuadroDialogoDataLinkProperties

Este cuadro de diálogo nos va a permitir seleccionar entre una lista de proveedores de bases de datos instalados en nuestro equipo. Esos proveedores pueden variar en función de la versión de Digi3D.NET, ya que en el caso de ejecutar la versión de 64 bits, no aparecerá el proveedor Microsoft Jet 4.0 OLE DB Provider, que es el utilizado por las bases de datos de Access, lo que significa que con las versiones de 64 bits no podríamos conectarnos con bases de datos de Access.

El único inconveniente es que no vamos a localizar aquí ningún proveedor para Microsoft SQL Server Compact 3.5 SP2 o Microsoft SQL Server Compact 4.0 SP1, de modo que no nos va a quedar más remedio que introducir manualmente la cadena de conexión, y ese es precisamente el objetivo de esta entrada en el blog.

El formato de las cadenas de conexión para estos dos proveedores es la siguiente:

Tipo de conexión Cadena de conexión
SQL Server Compact 3.5 SP2 sin contraseña Provider=Microsoft.SQLSERVER.CE.OLEDB.3.5;Data Source=rutaAlArchivonombreDelArchivo.sdf;
SQL Server Compact 3.5 SP2 con contraseña Provider=Microsoft.SQLSERVER.CE.OLEDB.3.5;Data Source=rutaAlArchivonombreDelArchivo.sdf;SSCE:Database Password=’contraseña’;
SQL Server Compact 4.0 SP1 sin contraseña Provider=Microsoft.SQLSERVER.CE.OLEDB.4.0;Data Source=rutaAlArchivonombreDelArchivo.sdf;
SQL Server Compact 4.0 SP1 con contraseña Provider=Microsoft.SQLSERVER.CE.OLEDB.4.0;Data Source=rutaAlArchivonombreDelArchivo.sdf;SSCE:Database Password=’contraseña’;

De modo que si por ejemplo nuestro archivo de dibujo está almacenado en la ruta C:Trabajos20131h1.bind podríamos tener una base de datos asociada en la ruta C:Trabajos20131h1.sdf mediante la cadena de conexión (suponiendo que la versión de la base de datos es la 3.5): Provider=Microsoft.SQLSERVER.CE.OLEDB.3.5;Data Source=C:Trabajos20131h1.sdf;

Esto tiene el inconveniente de que cada vez que cambiemos de archivo de dibujo, tendremos que cambiar la cadena de conexión para que la conexión sea con la base de datos correspondiente.

Si queremos evitar tener esto, podemos aprovecharnos de los sustituidores de Digi3D.NET para hacer que el programa seleccione automáticamente el nombre de la base de datos en función del nombre del archivo de dibujo mediante la siguiente cadena de conexión: Provider=Microsoft.SQLSERVER.CE.OLEDB.3.5;Data Source=$(RutaArchivoDibujo)$(NombreArchivoDibujoSinExtension).sdf;