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 (7) -

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

hola Reynaldo soy Claudio abate estoy en 2°año de desarrollo de software y tengo un problema que seguro para vos es muy tonto pero a mi me esta volviendo loco tengo un proyecto en visual studio 2017 y tengo un modulo de conexión y tengo dos bases de datos de access como puedo hacer para cuando conecte lo hagan las dos y algo mas tengo dos formularios hechos y tiene botones de : agregar, buscar, salir, modificar y cancelar la cosa que cuando hago andar conectando una sola base de datos que ahi si anda el botón modificar no me remplaza los datos del id que pongo sino que me lo guarda generando otro id no te imaginas como me estoy volviendo re loco no te imaginas como agradecería tu ayuda te cargo la línea de código de conexión del modulo y la línea de el botón modificar.
Module Module1
    Public coneccion As New OleDb.OleDbConnection("provider=microsoft.ace.oledb.12.0;data source=c:\tp\datos\escuela_abba1.accdb;persist security info=false")
    Public comando As OleDb.OleDbCommand
    Public lectordedatos As OleDb.OleDbDataReader
End Module
y
Private Sub modificar_Click(sender As Object, e As EventArgs) Handles modificar.Click
        Try
            Dim modificar As String
            modificar = ""
            modificar = "update escuela set apellido '" & apellido.Text & "', nombre '" & nombre.Text & "', direccion '" & direccion.Text & "', localidad '" & localidad.Text & "', dni '" & dni.Text & "' where id = " & Val(id.Text) & ""
            comando.Connection = coneccion
            comando.CommandType = CommandType.Text
            comando.CommandText = modificar
            MsgBox("DATOS MODIFICADOS")
        Catch ex As Exception
            MsgBox(ex.ToString)
        End Try
    End Sub
End Class
muchas gracias......seguro vos si vas a ver donde esta la falla.

Responder

abate:  revisa que en el diseño de tu tabla (en access) no tengas el campo Id como Autonumeración y cambialo a Número (Entero).

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.