Perché il salvataggio delle modifiche in un database non riesce?

Ho seguito il codice C # in un’applicazione console.

Ogni volta che eseguo il debug dell’applicazione ed eseguo la query1 (che inserisce un nuovo valore nel database) e poi eseguo query2 (che visualizza tutte le voci nel database), posso vedere chiaramente la nuova voce che ho inserito. Tuttavia, quando chiudo l’applicazione e controllo la tabella nel database (in Visual Studio), non c’è più. Non ho idea del perché non stia salvando.

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: Ho dimenticato di dire che sto usando SQL Server Compact Edition 4 e VS2012 Express.

È un problema abbastanza comune. Si utilizza | DataDirectory | stringa di sostituzione. Ciò significa che, durante il debug della tua app nell’ambiente di Visual Studio, il database utilizzato dall’applicazione si trova nella cartella BIN\DEBUG sottocartella (o nella variante x86) del tuo progetto. E questo funziona bene in quanto non si ha alcun tipo di errore nel collegarsi al database e fare operazioni di aggiornamento.

Ma poi, si esce dalla sessione di debug e si guarda il database attraverso Visual Studio Server Explorer. Questa finestra ha una stringa di connessione diversa (probabilmente che punta alla copia del tuo database nella cartella del progetto). Cerchi le tue tabelle e non vedi le modifiche.

Quindi il problema peggiora. Riavvia VS per cercare il bug nella tua app, ma il tuo file di database è elencato tra i tuoi file di progetto e la proprietà Copy to Output directory è impostata su Copy Always . A questo punto Visual Studio copia il file di database originale dalla cartella del progetto nella cartella di output (BIN \ DEBUG) e quindi le modifiche precedenti vengono perse.
Ora, l’applicazione inserisce / aggiorna nuovamente la tabella di destinazione e non è ansible trovare alcun errore nel codice. (Ora, non so se sei quel tipo di ragazzo, ma, dopo due o tre volte di questo ciclo, ho sentito varie brutte parole)

È ansible interrompere questo problema cambiando la proprietà Copy To Output Directory da Copy If Newer o Never Copy . Inoltre, puoi aggiornare la tua connessione in Server Explorer per esaminare la copia di lavoro del tuo database o creare una seconda connessione. Il primo punta ancora al database nella cartella del progetto mentre il secondo punta al database nella cartella BIN \ DEBUG. In questo modo è ansible mantenere il database originale pronto per la distribuzione e le modifiche dello schema, mentre con la seconda connessione è ansible esaminare i risultati effettivi degli sforzi di codifica.

MODIFICA Avviso speciale per utenti di database MS-Access . Il semplice atto di guardare la tua tabella cambia anche la data modificata del tuo database se non scrivi o modifichi nulla. Quindi il flag Copy if Newer interviene e il file del database viene copiato nella directory di output. Con Access usa meglio Copy Never .

L’invio di modifiche / salvataggio delle modifiche nelle sessioni di debug è un argomento familiare nei forum di SQL CE. È qualcosa che fa incazzare parecchie persone. Pubblicherò i collegamenti agli articoli sorgente di seguito, ma volevo incollare la risposta che sembra ottenere i migliori risultati per il maggior numero di persone:


Hai diverse opzioni per cambiare questo comportamento. Se il tuo file sdf è parte del contenuto del tuo progetto, ciò influenzerà il modo in cui i dati vengono mantenuti. Ricorda che quando esegui il debug, tutto l’output del tuo progetto (incluso lo sdf) se nella cartella bin / debug.

  • Puoi decidere di non includere il file sdf come parte del tuo progetto e gestire il runtime del file location.

  • Se si utilizza “copia se più recente” e le modifiche al progetto apportate al database sovrascriveranno eventuali modifiche di runtime / debug.

  • Se si utilizza “Non copiare”, sarà necessario specificare la posizione nel codice (come due livelli sopra il punto in cui è in esecuzione il programma).

  • Se hai “Copia sempre”, le eventuali modifiche apportate durante il runtime verranno sempre sovrascritte


Rispondi alla fonte

Ecco un link per ulteriori discussioni e come documentazione.