Menú de navegaciónMenú
Categorías

La mejor forma de Aprender Programación online y en español www.campusmvp.es

?id=495a7c97-0c3c-4020-9d6a-5ff4fee99e19

Problema: Desde Visual Studio se pierden los datos que grabó la aplicación

visual-studio-2013-logo

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.

BaseDatos1

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”.

Propiedad-Copy

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.

Fecha de publicación:
Alberto Población Alberto es MVP de C#, y lleva varias décadas desarrollando software. Cuenta entre otras con las certificaciones MCSE, MCDBA, MCITP, MCSD, MCPD. En la actualidad trabaja como consultor independiente dedicándose también a la formación. Es instructor certificado por Microsoft. Ver todos los posts de Alberto Población
Archivado en: General | Trucos

¿Te vas a perder los mejores trucos de programación?

Únete a miles de desarrolladores que ya reciben cada mes nuestro boletí­n por email. No te pierdas los mejores trucos, noticias y frikadas.

Enviamos poco, pero bueno. Palabra de desarrollador.

Suscríbete aquí­

Sí­guenos también en:

Telegram LinkedIn YouTube
La mejor formación online para desarrolladores como tú

Comentarios (5) -

Muchas gracias por la información, era lo que necesitaba y no sabía como buscar. Muy bien explicado

Responder

Estoy programando en VS Express 2012, Basic, hice tal como dices, pero no me funciono... asi ke sigo buscando una respuesta ke funcione.

Responder

Mi querido Alberto, sigo con el mismo problema. Solo que yo estoy trabajando con visual basic.net y access.
Donde esta el problema.
Gracias

Responder

Necesito ayuda con la cadena de conexión con una base de datos creada dentro de la carpeta app_data en visual studio 2017, o sea un archivo .mdf, o como se identifica el servidor con el asistente.

Responder

José Manuel Alarcón
José Manuel Alarcón

Hola Reynaldo:

Para acceder de manera directa a una base de datos contenida en un archivo .mdf dentro de la carpeta App_Data de tu proyecto debes tener instalado SQL Server Express Edition (www.microsoft.com/.../sql-server-editions-express) que es el que tiene la capacidad de adjuntar dinámicamente las bases de datos cuando son necesarias, facilitando así su despliegue.

Si tienes SQL Server Express instalado, entonces la cadena de conexión es simplemente:

"data source=.\SQLEXPRESS;Integrated Security=SSPI;AttachDBFilename=|DataDirectory|TuArchivo.mdf;User Instance=true"

Siendo "TuArchivo.mdf" el nombre de tu archivo de datos.

Saludos!

Responder

Agregar comentario

Los datos anteriores se utilizarán exclusivamente para permitirte hacer el comentario y, si lo seleccionas, notificarte de nuevos comentarios en este artículo, pero no se procesarán ni se utilizarán para ningún otro propósito. Lee nuestra política de privacidad.