jueves, 8 de noviembre de 2012

[Visual Studio] Base de Datos integradas al proyecto

 

Vamos a analizar una situación particular que se produce al integrar las bases de datos, ya sean Ms Access, Sql Compact, Sql Server, o cualquier otra que pueda integrarse al Visual Studio

Cuando se desarrollan aplicaciones de escritorio, WinForm o WPF y a estos proyectos se le agrega una db, puede que las actualizaciones de datos no impacten sobre el archivo que se visualiza en el “Solution Explorer”.

Nota: si bien el ejemplo del articulo estará basado en Sql Compact (.sdf) la solución planteada aplicaría a otras base de datos como ser Ms Access (.mdb, .accdb), Sql Server (.mdf), etc

 

Problema


Cuando un conectionstring se define usando el nombre de la db o |DataDirectory| para especificar la localización del archivo de base de datos, en ambos casos se hace referencia a la carpeta donde se encuentra ejecutándose el .exe

string connstring = "Data Source=|DataDirectory|Contactos.sdf;Persist Security Info=False;";

Al usar este tipo de connection string es bastante común ver desarrollos en donde la db se encuentra integrada al Visual Studio.

clip_image001

Si se está ejecutando desde el Visual Studio la carpeta, por defecto, donde compila y deja los archivos resultantes será el \bin\Debug del proyecto, es allí donde la aplicación espera que se encuentre la base de datos.

No hay que engañarse, los cambios que realicen actualización a la db no serán efectuadas sobre el archivo que se visualiza integrado al VS (el que se visualiza en la imagen anterior), sino que las modificaciones se realizaran sobre la copia que crea el Visual Studio en la carpeta \bin\Debug

clip_image003

Como se observa, el Visual Studio creo una copia de la db en la carpeta donde compila, es por eso que .exe y .mdb están juntos, es más cuando se detenga la ejecución y se inicie nuevamente una nueva copia será efectuada pisando los datos previos.

Por lo tanto, si luego de ejecutar la aplicación desde el VS, la aplicación realizo actualizaciones en los datos, al detenerla y realizar doble click en el archivo de base de datos que está integrado en el “Solution Explorer” para poder trabajarlo desde el “Server Explorer”, no se visualizara ningún cambio.

clip_image004

Al usar el “Show Table Data” no habrá cambios que visualizar

clip_image005

Sera necesario usar la opción

clip_image006

Para poder acceder a al db que se copió en el \bin\Debug y al hacer bloque click en esta y verla en el Server Explorer allí si estarán las actualizaciones realizaras en la ultima ejecución.

clip_image007

Nota: recuerden que al volver a ejecutar desde el Visual Studio la db que se encuentra en la carpeta \bin\Debug será reemplazada por una nueva copia

Esta situación solo se manifiesta si se ejecuta desde el Visual Studio, cuando se lleve el .exe a la pc del usuario esta situación no se presentara, la aplicación se ejecuta directamente sin intermediarios que realice la copia de la db a una carpeta de compilación (apunto a que no esta el Visual Studio en medio creando una carpeta donde ubicar los archivos resultantes necesario para la ejecución).

 

Solución


Si se quiere evitar esta situación y hacer uso de la misma db que esta integrada al proyecto, el primer paso será deshabilitar la copia que realiza el VS, para ello se debería ir a las propiedades del archivo

clip_image008

Y allí cambiar la opción a “Do not copy”

clip_image009

Y luego se deberá modificar el string de conexión indicando la ruta completa el archivo de la db, usar solo el nombre o |DataDirectory| ya no será valido (porque no se copiara el archivo a la carpeta de compilacion)

string connstring = "Data Source=C:\...\Contactos.sdf;Persist Security Info=False;";

 

Conclusión


Si bien esta característica que aporta el Visual Studio al realizar una copia automática del archivo de base de datos a la carpeta de compilación podría ser útil en algunas situaciones, (como ser aquellas donde se espera datos inicializados para realizar pruebas), pero hay otras donde no es útil, por eso existen opciones que se pueden cambiar para deshabilitar esta acción.

Al implementar la solución mencionada logramos referenciar la db que se encuentra integrada al proyecto.

[ADO.NET] Ms Access y arquitectura 64bit

 

Cuando desarrollamos bajo una plataforma con arquitectura de 64 bits se pueden presentar problema si la db usada se trata de Ms Access

Este problema se presenta porque el motor que usa para establecer la conexión desde código no provee compatibilidad con esta arquitectura

Para efectuar el artículo se hizo uso una PC con arquitectura 64bits

 

Base de datos .mdb


Para demostrar el problema se confecciono un ejemplo simple

clip_image001

Una base de datos Access 2000 integrada en proyecto la cual lista contactos en un grid

string connstring = "Provider=Microsoft.Jet.OLEDB.4.0;Data Source=Contactos.mdb;User Id=admin;Password=;";

try
{
	using (OleDbConnection conn = new OleDbConnection(connstring))
	{
		conn.Open();

		string query = "SELECT * FROM Contactos";
		OleDbCommand cmd = new OleDbCommand(query, conn);
		OleDbDataAdapter da = new OleDbDataAdapter(cmd);
		DataTable dt = new DataTable();
		da.Fill(dt);

		dataGridView1.DataSource = dt;
	}
}
catch (Exception ex)
{
	MessageBox.Show(ex.Message);
}

El proveedor utilizado

Provider=Microsoft.Jet.OLEDB.4.0

Si se ejecuta sin realizar ningún otro cambio se obtendrá

The 'Microsoft.Jet.OLEDB.4.0' provider is not registered on the local machine.

clip_image003

Para que esto no suceda la solución es cambiar el Platform Target del proyecto, para esto solo se debe ir a la propiedades del proyecto

clip_image004

Y allí cambiar la opción mencionada a x86, con esto haremos que el .exe compile con compatibilidad a 32bits

clip_image006

Ahora si al ejecutar la aplicación funcionara sin problemas

clip_image007

 

Base de datos .accdb


Otra alternativa que podría evaluarse es la utilización de ACE.OLEDB como proveedor para trabajar con la db Ms Access, para ello seguramente se necesite instalar

Componente redistribuible del motor de base de datos de Microsoft Access 2010

Nota: si se tiene el Office 2010 (o superior) en la pc quizás no se requiera la instalación

Al cambiar de proveedor, ya no se usara Jet por lo que se define

Provider=Microsoft.ACE.OLEDB.12.0

clip_image009

Al ejecutar la aplicación funciona correctamente más allá de estar definida para compilar a 64bits

Nota: también se probó ACE.OLEDB con una base de datos .mdb (generada con Ms Access 2010 pero grabada con compatibilidad con Access 2000) pudiendo establecer la conexión correctamente sin que afectara la arquitectura 64bits

 

Conclusión


Si se quiere hacer uso de Jet como proveedor para establecer la conexión a los datos será necesario cambiar en el proyecto la plataforma a la cual se compila

Para evitar el problema se hará uso del proveedor ACE.OLEDB el cual proporciona compatibilidad con 64bit

domingo, 28 de octubre de 2012

[Visual Studio] Unir proyectos

 

Introducción


En algunas ocasiones se escribe código en proyectos separados, ya sea para probar algún concepto, se trabajo en equipos diferentes y cada uno creo su ambiente, etc

pero en todos estos casos al final se requiere unir bajo una única solución todo lo confeccionado, existen diferentes formas de lograrlo pero creo que lo que explicare es la mas simple.

Usaremos un ejemplo sencillo para demostrar como unir proyectos, además de evaluar que consideraciones hay que tener en el proceso.

Se han creado dos aplicaciones del tipo Windows Application, pero tengan en cuenta que esto mismo aplica a cualquier otro tipo de proyecto.

Por un lado tendremos un proyecto con un único form definido como MDI Container, este será la base al cual se agregara lo proveniente de otros desarrollos

image

Por el otro lado se desarrolla un forma simple que accede a una db local usando dataset tipado

image

La idea es mover el Form1, el dataset tipado y la base de datos de WinApp2 a WinApp1

 

Mover archivos entre proyecto


Lo primero que hay que conocer serán los archivos ha mover entre proyectos, esto parece ser una tarea simple pero por lo general un ítem puede estar compuesto por otros ítems que los complementan

Por ejemplo un formulario se compone de 3 archivos, el .cs (seria el formulario en si mismo), el .Designer.cs (donde se definen los controles que se agregan en tiempo diseño) y un .resx (define los textos he imágenes según la cultura). Lo mismo sucede con el dataset tipado, compuesto por el .xsd, .Designer.cs, .xsc y .xss

En proyecto escritos con C# visualizar estos archivos es simple ya que el Solución Explorer brinda la posibilidad directa de expandir los archivos relacionados

image

Pero esto no sucede en VB.NET, por defecto el Solution Explorer no los muestra

image

para poder ver los archivos relacionados a un ítem hay que habilitarlo usando la opción “Show All Items”

image

Ahora que sabemos que archivos se requieren mover de un proyecto a otro haremos uso del Windows Explorer, se podrá acceder a la carpeta de forma directa usando

SNAGHTML15b51af

Se deberán seleccionar todos los archivos implicados para cada ítem

SNAGHTML15d877e

y se moverán a la carpeta del proyecto destino, el cual ya tenia el form principal

SNAGHTML15f17f9

 

Incluir archivo al proyecto


Una vez que tenemos los archivos ubicados en la estructura de carpeta del proyecto destino volvemos al Visual Studio para incluir estos archivos, para poder lograrlo será necesario volver los archivos visibles usando la opción “Show All Items”

image

como se observa en la imagen los archivos que se han copiado a la carpeta están visibles pero con un icono de color blanco, lo que indica que están fuera del proyecto, en realidad están en la carpeta (dentro de la estructura) pero no incluidos al proyecto

Para incluirlos solo bastara usar la opción “Include In Project”

image

lo cual no solo agregara el .cs sino también los archivos relacionados, solo será cuestión de aplicar esto al resto de los archivos para concluir con la integración

 

Algunas consideraciones


Luego de incluir los archivos puede que la tarea no termine allí, sino que hay que adecuar el código

Normalmente cuando se desarrolla bajo un proyecto se definen namespaces, el formulario que se ha incluido sigue conservando el nombre que se uso en el proyecto anterior

image

es por eso que será necesario revisar el código de los ítems incluidos para adaptarlos de forma correcta al nuevo proyecto, y en algunos casos no alcanzara con ir al código del form, sino también se deberá cambiar dentro del Designer.cs o sus archivos relacionados

SNAGHTML1aedbc6

Con respecto a los dataset puede que sea necesario ejecutar la opción que vuelve a regenerar el código en base a la metadata

image

esto adecua el código generado para que se adapte de forma automática al nuevo namespace

 

Conclusión


Los pasos para unir proyecto no son difíciles de aplicar, solo es cuestión de conocer las opciones y que archivos mover de un proyecto a otro.

Si bien aquí solo tratamos algunos tipos de archivos la misma técnica se puede aplicar a cualquier otro que se este utilizando.

domingo, 21 de octubre de 2012

[ASP.NET] Web Service - Publicar en IIS Windows 7 (3/3)

 

Introducción


El uso de Win 7 o Windows Server implica contar con una versión de IIS mas robusta a la hora de exponer servicios para ser consumidos. Con Win 7 o Win 2008 contamos con IIS 7 el cual permite crear sitios web en un puerto especifico que definamos, esto no era posible de lograr en Win Xp

Este artículo es la continuación de:

[ASP.NET] Crear y Publicar - Web Service (1/3)

[ASP.NET] Web Service - Publicar en IIS Windows XP (2/3)

En esta oportunidad a diferencia de las anteriores usaremos un proyecto creado en VS 2010, básicamente es el mismo proyecto que fue convertido de versión para poder usar .net 4

 

Publicar Web Project VS 2010


Para cambiar un poco la situación de los contextos anteriores se usara el Visual Studio 2010, crear una aplicación web que exponga ya sea paginas o servicio requiere aplicar los mismos pasos expuestos en los artículos anteriores, toda la explicación anteriormente brindada es totalmente valida ya sea se use VS 2008 o 2010

VS 2010 brinda mas opciones al momento de publicar, se accede mediante un click del botón derecho del mouse

SNAGHTML30fe510

Al comparar la pantalla de publicación con la utilizada en los artículos anteriores se notaran mas completa

SNAGHTML3485763

Algo que rápidamente nos llama la atención es la creación perfiles de publicación, utilizado para definir un determinado set de opciones, en este caso hare uso de la publicación a una carpeta del disco local, y grabare el profile para poder reutilizarlo las veces que hagan falta

SNAGHTML34a9b36

El resultado será el mismo que se obtuvo en los artículos anteriores, paginas, servicios y dlls listos para ubicarlos en el IIS

SNAGHTML34e2c4e

 

Acceso a la opciones de publicación


La publicación tiene mas opciones de las esperadas, se puede acceder de forma rápida, si se habilita la toolbar

SNAGHTML34fc11e

se habilitara la opción

image

para acceder de forma rápida al profile de publicación.

Si se presto atención a la pantalla “Publish Web” se habrá notado una leyenda donde se hace mención a opciones avanzadas de publicación, se accede a esta por medio de las propiedades del proyecto web

SNAGHTML3536c79 

 

Creación Sitio IIS 7


Al igual que sucedía con IIS 5 de Win Xp al acceder al administrador se cuenta con un sitio creado por defecto residente en el puerto 80

SNAGHTML3ba0b39

pero como diferencia ahora si se podrán crear sitio web que estén en el puerto que uno desea, el primer paso por supuesto será crear el sitio

SNAGHTML7691d5

Solo es cuestión de definir un nombre para el sitio, la ruta física donde se realizara el deploy y el puerto

SNAGHTMLcabdf5

recordemos que el Default Web Site es quien utiliza el puerto 80, por eso en este caso he usado el 8080, pero puede ser cualquier otro que uno decida usar

Seleccionando el sitio creado se podría acceder a opciones básicas y avanzadas

SNAGHTML1446628

SNAGHTML1456d97

Con estos simples pasos se ha creado un sitio, solo resta copiar los archivos publicados del paso anterior

 

Application Pool


Es importante notar como de forma automática al crear el sitio se define un Application Pool con el nombre del sitio

SNAGHTML147be65

este puede cambiarse por uno existente, pero es buena idea que cada sitio tenga su propio App Pool

En este se podrá configurar la versión del framework de .net que será usada, el usuario con el cual se ejecuta el sitio, si se dispone de una pc con arquitectura de 64 bits podrá habilitarse o no la compatibilidad con 32bit

Existe opciones básicas

SNAGHTMLd15055

Para configurar principalmente la versión del framework utilizado

SNAGHTMLcf988b

y opciones avanzadas

SNAGHTMLd3519c

en donde además de poder cambiar la versión del framework se puede definir el identity, el usuario que definan será con el cual se ejecuten los procesos, si quiere lanzar un .exe, una aplicación, acceder a una carpeta que esta por fuera del sitio, o a una shared folder, deben asegurarse que ese usuario tenga permiso

Igualmente el identity del App Pool no es el único lugar donde definir el usuario, se puede recurrir a la configuración del sitio, el web.config

<system.web>
    
    <identity impersonate="true" userName="dominio\nombreusuario" password="password"/>
.
.
</system.web>

Deploy del desarrollo


Al copiar el contenido del código a la carpeta del sitio se podrá acceder al contenido, así como visualizarlo en el explorador

image

si en los pasos anteriores no modificaron ninguna opción puede que obtengan el siguiente mensaje de error

image

especialmente si usas una base de datos que se encuentra en el App_Data, la cual se adjunta de forma dinámica al servicio de sql server, para solucionarlo solo será necesario cambiar el usuario definido en el App Pool

SNAGHTML1acd4a5

Se podría cambiar a NetworkService

image

Ahora si al acceder a la pagina podremos ver que resuelve correctamente

SNAGHTML1afda9e

Una vez publicado el sitio se podría modificar de forma visual la configuración con la ayuda del IDE del IIS, por ejemplo, opciones como ser el connection string

SNAGHTML1d78c60

SNAGHTML1d64237

cambiar el valor desde el IIS impacta directo en el web.config del sitio

Código


Se ha usado Visual Studio 2010 y Sql Server Express 2008 R2

[C#]