Почему сохранение изменений в базе данных не удается?

У меня есть код C # в консольном приложении.

Всякий раз, когда я отлаживаю приложение и запускаю query1 (который вставляет новое значение в базу данных), а затем запускает query2 (который отображает все записи в базе данных), я могу видеть новую запись, которую я вставил четко. Однако, когда я закрываю приложение и проверяю таблицу в базе данных (в Visual Studio), она исчезла. Я понятия не имею, почему это не спасает.

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: Забыл упомянуть, что я использую SQL Server Compact Edition 4 и VS2012 Express.

Это довольно распространенная проблема. Вы используете | DataDirectory | строка подстановки. Это означает, что при отладке вашего приложения в среде Visual Studio firebase database, используемая вашим приложением, находится в папке BIN\DEBUG (или варианте x86) вашего проекта. И это хорошо работает, так как у вас нет какой-либо ошибки, связанной с базой данных и выполняющей операции обновления.

Но затем вы выходите из сеанса отладки и просматриваете свою базу данных через Visual Studio Server Explorer. Это окно имеет другую строку подключения (возможно, указывая на копию вашей базы данных в папке проекта). Вы просматриваете свои таблицы, и вы не видите изменений.

Тогда проблема ухудшается. Вы перезапускаете VS, чтобы искать ошибку в своем приложении, но у вас есть файл базы данных, указанный между вашими проектными файлами, а в папке « Copy to Output directory установлено значение « Copy Always . На этом этапе Visual Studio копирует исходный файл базы данных из папки проекта в выходную папку (BIN \ DEBUG), и поэтому ваши предыдущие изменения теряются.
Теперь ваше приложение снова вставляет / обновляет целевую таблицу и вы не можете найти никаких ошибок в коде. (Теперь, я не знаю, если вы такой парень, но после двух или трех раз этого цикла я слышал разные уродливые слова)

Вы можете остановить эту проблему, изменив свойство Copy To Output Directory для Copy If Newer или Never Copy . Также вы можете обновить строку соединения в проводнике сервера, чтобы посмотреть на рабочую копию базы данных или создать второе соединение. Первый по-прежнему указывает на базу данных в папке проекта, а второй указывает на базу данных в папке BIN \ DEBUG. Таким образом, вы можете сохранить исходную базу данных в целях развертывания и изменения схемы, тогда как со вторым соединением вы можете посмотреть на эффективные результаты ваших усилий по кодированию.

EDIT Специальное предупреждение для пользователей базы данных MS-Access . Простой взгляд на таблицу изменяет дату изменения базы данных ТАКЖЕ, если вы ничего не пишете и не меняете. Таким образом, копируется флаг « Copy if Newer запускается, и файл базы данных копируется в выходной каталог. С Access лучше использовать « Copy Never .

Внесение изменений / сохранение изменений в сеансах отладки является знакомой темой на форумах SQL CE. Это то, что вытаскивает немало людей. Я опубликую ссылки на исходные статьи ниже, но я хотел вставить ответ, который, как представляется, дает наилучшие результаты большинству людей:


У вас есть несколько вариантов для изменения этого поведения. Если ваш файл sdf является частью содержимого вашего проекта, это повлияет на сохранение данных. Помните, что при отладке все выходные данные вашего проекта (включая sdf), если они находятся в папке bin / debug.

  • Вы можете не включать файл sdf как часть своего проекта и управлять временем выполнения файла.

  • Если вы используете «copy if newer», а изменения проекта, которые вы делаете в базе данных, перезаписывают любые изменения времени выполнения / отладки.

  • Если вы используете «Не копировать», вам нужно будет указать местоположение в коде (как два уровня выше, где работает ваша программа).

  • Если у вас есть «Копировать всегда», любые изменения, сделанные во время выполнения, всегда будут перезаписаны


Источник ответа

Вот ссылка на дальнейшее обсуждение и документацию.

Давайте будем гением компьютера.