为什么将更改保存到数据库失败?

6uxekuva  于 2021-06-21  发布在  Mysql
关注(0)|答案(2)|浏览(449)

我在控制台应用程序中有以下c代码。
每当我调试应用程序并运行query1(向数据库中插入一个新值)然后运行query2(显示数据库中的所有条目)时,我都可以清楚地看到我插入的新条目。但是,当我关闭应用程序并检查数据库中的表(在visualstudio中)时,它就消失了。我不知道为什么这不是储蓄。

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

编辑:忘了提到我正在使用sql server compact edition 4和vs2012 express。

xfb7svmp

xfb7svmp1#

在SQLCE论坛中,跨调试会话提交更改/保存更改是一个熟悉的主题。这件事让不少人都大吃一惊。我将在下面发布到源文章的链接,但我想粘贴的答案似乎能给大多数人带来最好的结果:
您有几个选项可以更改此行为。如果sdf文件是项目内容的一部分,这将影响数据的持久化方式。请记住,调试时,项目的所有输出(包括sdf)都在bin/debug文件夹中。
您可以决定不将sdf文件作为项目的一部分,并在运行时管理文件位置。
如果使用“copy if newer”,并且对数据库所做的项目更改将覆盖任何运行时/调试更改。
如果您使用的是“请勿复制”,则必须在代码中指定位置(在程序运行的两级以上)。
如果您有“copy always”,那么在运行时所做的任何更改都将被覆盖
答案来源
下面是一些进一步讨论和如何使用文档的链接。

4dc9hkyq

4dc9hkyq2#

这是一个很常见的问题。使用| datadirectory |替换字符串。这意味着,在visualstudio环境中调试应用程序时,应用程序使用的数据库位于子文件夹中 BIN\DEBUG 项目的文件夹(或x86变体)。这样做很好,因为连接到数据库和执行更新操作时不会出现任何错误。
然后,退出调试会话,并通过visualstudio服务器资源管理器(或任何其他合适的工具)查看数据库。此窗口具有不同的连接字符串(可能指向项目文件夹中数据库的副本)。你搜索你的表,却看不到变化。
然后问题变得更糟。重新启动vs以查找应用程序中的错误,但在项目文件和属性之间列出了数据库文件 Copy to Output directory 设置为 Copy Always . 此时,VisualStudio强制并将原始数据库文件从项目文件夹复制到输出文件夹(bin\debug),因此先前的更改将丢失。
现在,应用程序再次插入/更新目标表,在决定发布或搜索stackoverflow之前,您仍然无法在代码中找到任何错误并重新启动循环。
你可以通过改变财产来解决这个问题 Copy To Output DirectoryCopy If Newer 或者 Never Copy . 您还可以在服务器资源管理器中更新connectionstring以查看数据库的工作副本或创建第二个连接。第一个仍然指向项目文件夹中的数据库,而第二个指向bin\debug文件夹中的数据库。通过这种方式,您可以使原始数据库为部署目的和模式更改做好准备,同时,通过第二个连接,您可以查看编码工作的有效结果。
为ms access数据库用户编辑特殊警告。如果您不编写或更改任何内容,查看表的简单操作也会更改数据库的修改日期。所以国旗 Copy if Newer 启动并将数据库文件复制到输出目录。有了更好的使用 Copy Never .

相关问题