Esta es una pregunta que aparece con frecuencia en los foros de programación relacionados con Visual Studio:
Estoy creando una aplicación en Visual Studio usando C# y la edición Express de Visual Studio. Utilizo la siguiente cadena de conexión:
connectionString="Data Source=.\SQLEXPRESS;
AttachDbFilename=|DataDirectory|\App_Data\miBase.mdf;
Integrated Security=True; User Instance=True"
El programa aparentemente funciona bien y lee y graba los datos correctamente. Pero cada vez que lo vuelvo a ejecutar, me encuentro con que todos los datos se han perdido.
¿Por qué sucede esto, y cómo puedo evitarlo?
Lo primero que necesitas comprender es que tu proyecto no tiene una sino dos bases de datos. Una es la que has añadido en tiempo de diseño en el código fuente. Y la otra se genera automáticamente en el |Datadirectory|. Esta última es la que realmente utiliza el programa en tiempo de ejecución.
En la anterior imagen del Explorador de Soluciones hemos hecho clic en el botón de “Mostrar todos los archivos” para que se vea el contenido de la carpeta bin, que normalmente permanece oculta. Nótese que contiene una segunda copia de la misma base de datos que habíamos creado a nivel de proyecto en tiempo de desarrollo.
El comportamiento predeterminado de Visual Studio es el de copiar automáticamente la base de datos de la carpeta de los fuentes a la carpeta del ejecutable cada vez que se ejecuta la aplicación. Por lo tanto, los cambios que el programa había hecho en la base de datos de la carpeta ejecutable se pierden cuando el programa se vuelve a ejecutar y dicha base de datos se sobrescribe con la que había en la carpeta fuente, que no contiene dichos cambios.
El motivo por el que existe ese comportamiento es que permite ejecutar el programa varias veces mientras se está depurando, y que su comportamiento sea siempre el mismo ya que parte de los mismos datos, en lugar de depender de los resultados de la última ejecución. Por lo tanto, facilita las pruebas y depuración.
Pero si el comportamiento que deseamos no es ese, puede cambiarse haciendo clic sobre la base de datos fuente en el Explorador de Soluciones, y modificando la propiedad “Copy to Output Directory”.
De forma predeterminada está seleccionada la opción “copiar siempre”, que da lugar al comportamiento que hemos indicado más arriba. Se puede cambiar a “Do not copy”, en cuyo caso se deshabilita por completo la copia, o a “Copy if newer” , que hace que se copie únicamente si hemos introducido algún cambio en la versión de la base de datos que hay en los fuentes, y en consecuencia es “más nueva” que la que hay en el directorio del ejecutable.
Con esto se resuelve un problema relativamente trivial, pero que ocasiona sorpresa en muchos desarrolladores que comienzan a usar Visual Studio y todavía no conocen esta característica.