visual studio net los llenar ejemplo compila cambios actualiza c# .net sql-server-ce

c# - studio - ¿Por qué falla el guardar los cambios en una base de datos?



visual studio no actualiza los cambios (2)

Cometer cambios / guardar cambios a través de sesiones de depuración es un tema familiar en los foros de SQL CE. Es algo que los viajes de un buen número de personas. Voy a publicar enlaces a los artículos de fuente a continuación, pero quería pegar la respuesta que parece obtener los mejores resultados a la mayoría de las personas:

Tiene varias opciones para cambiar este comportamiento. Si su archivo sdf forma parte del contenido de su proyecto, esto afectará a cómo se conservan los datos. Recuerde que cuando depura, toda la salida de su proyecto (incluido el sdf) si está en la carpeta bin / debug.

  • Puede decidir no incluir el archivo sdf como parte de su proyecto y administrar el tiempo de ejecución de la ubicación del archivo.

  • Si está utilizando "copiar si es más reciente", y los cambios de proyecto que realice en la base de datos sobrescribirán cualquier cambio de tiempo de ejecución / depuración.

  • Si está utilizando "No copiar", tendrá que especificar la ubicación en el código (como dos niveles por encima de donde se ejecuta el programa).

  • Si tiene "Copiar siempre", los cambios realizados durante el tiempo de ejecución siempre se sobrescribirán

Fuente de la respuesta

Aquí hay un enlace a más discusión y cómo documentación.

Tengo código siguiente de C # en una aplicación de la consola.

Cada vez que depurar la aplicación y ejecutar la consulta1 (que inserta un nuevo valor en la base de datos) y luego ejecutar query2 (que muestra todas las entradas en la base de datos), puedo ver la nueva entrada que inserta claramente. Sin embargo, cuando cierro la aplicación y compruebo la tabla en la base de datos (en Visual Studio), se ha ido. No tengo ni idea de por qué no es el ahorro.

using System; using System.Collections.Generic; using System.Data.Entity; using System.Linq; using System.Text; using System.Threading.Tasks; using System.Data.SqlServerCe; using System.Data; namespace ConsoleApplication1 { class Program { static void Main(string[] args) { try { string fileName = "FlowerShop.sdf"; string fileLocation = "|DataDirectory|//"; DatabaseAccess dbAccess = new DatabaseAccess(); dbAccess.Connect(fileName, fileLocation); Console.WriteLine("Connected to the following database:/n"+fileLocation + fileName+"/n"); string query = "Insert into Products(Name, UnitPrice, UnitsInStock) values(''NewItem'', 500, 90)"; string res = dbAccess.ExecuteQuery(query); Console.WriteLine(res); string query2 = "Select * from Products"; string res2 = dbAccess.QueryData(query2); Console.WriteLine(res2); Console.ReadLine(); } catch (Exception e) { Console.WriteLine(e); Console.ReadLine(); } } } class DatabaseAccess { private SqlCeConnection _connection; public void Connect(string fileName, string fileLocation) { Connect(@"Data Source=" + fileLocation + fileName); } public void Connect(string connectionString) { _connection = new SqlCeConnection(connectionString); } public string QueryData(string query) { _connection.Open(); using (SqlCeDataAdapter da = new SqlCeDataAdapter(query, _connection)) using (DataSet ds = new DataSet("Data Set")) { da.Fill(ds); _connection.Close(); return ds.Tables[0].ToReadableString(); // a extension method I created } } public string ExecuteQuery(string query) { _connection.Open(); using (SqlCeCommand c = new SqlCeCommand(query, _connection)) { int r = c.ExecuteNonQuery(); _connection.Close(); return r.ToString(); } } }

EDIT: Olvidé mencionar que estoy usando SQL Server Compact Edition 4 y VS2012 Express.


Es un problema bastante común. Utilice el directorio | DataDirectory | cadena de sustitución. Esto significa que, al depurar la aplicación en el entorno de Visual Studio, la base de datos utilizada por la aplicación se encuentra en la carpeta BIN/DEBUG (o variante x86) de su proyecto. Y esto funciona bien ya que no tiene ningún tipo de error de conexión a la base de datos y hacer las operaciones de actualización.

Pero, a continuación, salir de la sesión de depuración y buscar en su base de datos a través del Explorador de Visual Studio Server. Esta ventana tiene una cadena de conexión diferente (probablemente apuntando a la copia de su base de datos en la carpeta del proyecto). Busca tus tablas y no ves los cambios.

Entonces el problema empeora. Si tiene el archivo de base de datos enumerado entre los archivos de proyecto y la propiedad Copy to Output directory se establece en Copy Always , cada vez que reinicie una sesión de depuración, se copia el archivo de base de datos original de la carpeta del proyecto a la carpeta de salida / DEBUG) y así se pierden los cambios anteriores. Ahora, también su aplicación no ve los cambios realizados antes.

Puede detener este problema al cambiar la propiedad Copy To Output Directory para Copy If Newer o Never Copy . También puede actualizar su cadena de conexiones en el Explorador de servidores para ver la copia de trabajo de su base de datos o crear una segunda conexión. El primero sigue apuntando a la base de datos en la carpeta del proyecto mientras que el segundo apunta a la base de datos en la carpeta BIN / DEBUG. De esta manera usted podría mantener la base de datos original lista para propósitos de despliegue y cambios de esquema, mientras que, con la segunda conexión podría mirar los resultados efectivos de sus esfuerzos de codificación.

EDIT Advertencia especial para usuarios de base de datos MS-Access . El simple hecho de mirar a tu tabla cambia la fecha modificada de tu base de datos TAMBIÉN si no escribes o cambias nada. Por lo tanto, la bandera Copy if Newer Retroceso entra en acción y el archivo de base de datos se copia en el directorio de salida. Con Access use mejor Copy Never .