为什么保存对数据库的更改失败?

Joe*_*ter 11 .net c# sql-server-ce

我在控制台应用程序中有以下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();
            }
        } 
    }
Run Code Online (Sandbox Code Playgroud)

编辑:忘了提到我使用的是SQL Server Compact Edition 4和VS2012 Express.

Ste*_*eve 26

这是一个很常见的问题.您使用| DataDirectory | 替换字符串.这意味着,在Visual Studio环境中调试应用程序时,应用程序使用的数据库位于项目的子BIN\DEBUG文件夹文件夹(或x86变体)中.这很好用,因为您没有任何错误连接到数据库并进行更新操作.

但是,您退出调试会话并通过Visual Studio Server Explorer查看数据库.此窗口具有不同的连接字符串(可能指向项目文件夹中的数据库副本).您搜索表格,但没有看到更改.

然后问题变得更糟.您重新启动VS以寻找应用程序中的错误,但是您的项目文件之间列出了数据库文件,并且属性Copy to Output directory设置为Copy Always.此时,Visual Studio将原始数据库文件从项目文件夹强制并复制到输出文件夹(BIN\DEBUG),因此您之前的更改将丢失.
现在,您的应用程序再次插入/更新目标表,您再次无法在代码中找到任何错误并重新启动所有内容,直到您决定发布或搜索StackOverflow.

您可以停止此问题将属性更改Copy To Output DirectoryCopy If NewerNever Copy.您还可以在服务器资源管理器中更新您的连接字符串,以查看数据库的工作副本或创建第二个连接.第一个仍然指向项目文件夹中的数据库,而第二个指向BIN\DEBUG文件夹中的数据库.通过这种方式,您可以保留原始数据库以进行部署和架构更改,而使用第二个连接可以查看编码工作的有效结果.

编辑MS-Access数据库用户的 特殊警告.如果您不编写或更改任何内容,查看表的简单操作也会更改数据库的修改日期.因此标志Copy if Newer启动并将数据库文件复制到输出目录.随着Access更好地使用Copy Never.