【问题标题】:Why saving changes to a database fails?为什么将更改保存到数据库失败?
【发布时间】:2013-06-17 12:14:11
【问题描述】:

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

编辑:忘了说我使用的是 SQL Server Compact Edition 4 和 VS2012 Express。

【问题讨论】:

  • 你是在做设备调试还是模拟器?
  • 视觉工作室中的调试按钮(一个看起来像播放按钮)@kostasch。
  • 对不起,我以为你在调试移动应用程序。我想我记得调试按钮的样子:)。
  • 您的插入在数据库中,您的选择在产品上。是复制粘贴错误吗?
  • 复制粘贴错误。固定的。谢谢提及。

标签: c# .net sql-server-ce


【解决方案1】:

这是一个很常见的问题。您使用 |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 Directory 更改为Copy If NewerNever Copy 来停止此问题。您还可以在服务器资源管理器中更新连接字符串以查看数据库的工作副本或创建第二个连接。第一个仍然指向项目文件夹中的数据库,而第二个指向 BIN\DEBUG 文件夹中的数据库。通过这种方式,您可以保持原始数据库为部署目的和架构更改做好准备,同时通过第二个连接,您可以查看编码工作的有效结果。

EDITMS-Access 数据库用户的特别警告。如果您不编写或更改任何内容,则查看表的简单行为也会更改数据库的修改日期。所以标志Copy if Newer 启动,数据库文件被复制到输出目录。使用 Access 更好地使用 Copy Never

【讨论】:

  • 嘿史蒂夫,我怎样才能拥有像 OP 错误这样的功能?在我首先“构建”项目之后,我只想对 bin 文件夹中的数据库进行更改,并且我希望项目中的原始 .mdf 文件保持不变。这可以实现吗?
  • @ZeeshanAdil 我建议您发布一个新问题,最终链接此答案以提供上下文。您可以让更多人以这种方式查看您的问题
  • 我发布了一个将其链接到您的答案的问题,如果您有兴趣看看,您可以在这里找到它:stackoverflow.com/questions/58350817/…
  • Steve 的解决方案在 VS 19 版本 16.11.6 中也帮助了我。没有更新生效的原始问题的开始源于将数据库复制到项目。用户应为“您选择的连接使用不在当前项目中的本地数据文件。是否要将文件复制到您的项目并修改连接?”选择“否”。对话框。这将确保应用程序连接到外部位置的数据库,而不是 bin/debug 文件夹。
【解决方案2】:

跨调试会话提交更改/保存更改是 SQL CE 论坛中的一个熟悉主题。这是一个绊倒不少人的事情。我将在下面发布源文章的链接,但我想将似乎能获得最佳结果的答案粘贴给大多数人:


您有多种选择来改变这种行为。如果您的 sdf 文件是项目内容的一部分,这将影响数据的持久化方式。请记住,当您调试时,项目的所有输出(包括 sdf)如果在 bin/debug 文件夹中。

  • 您可以决定不将 sdf 文件作为项目的一部分并管理文件位置运行时。

  • 如果您使用“如果更新则复制”,并且您对数据库所做的项目更改将覆盖任何运行时/调试更改。

  • 如果您使用“请勿复制”,则必须在代码中指定位置(在程序运行的位置上方两层)。

  • 如果您有“始终复制”,则在运行时所做的任何更改都会被覆盖


Answer Source

Here is a link 进行进一步讨论以及如何记录文档。

【讨论】:

  • 如何只修改bin文件夹中的数据库,同时保持原数据库不变?
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多