【问题标题】:Changes do not get saved permanently into SQL Server Compact edition更改不会永久保存到 SQL Server Compact 版本中
【发布时间】:2013-10-12 16:36:44
【问题描述】:

我遇到了一个奇怪的问题。我正在使用 vs2012 连接到 SQL Server CE 并执行一些插入查询。

public void EstablishConnection()
{
        connection = new SqlCeConnection("Data Source=DataDump.sdf;Persist Security Info=False;");
        try
        {
            connection.Open();
            Console.WriteLine("Connection Successful");
        }
        catch (Exception exception)
        {
            Console.WriteLine(exception.Message);
        }
    }

    public void AddRecord(string link,string content)
    {
        int num = 0;
        var command = new SqlCeCommand("INSERT INTO Webpages(Link,Data) VALUES('"+link+"','"+content+"');",connection);
        num = command.ExecuteNonQuery();
        Console.WriteLine("Command Successful rows affected"+num);
        var cmd2 = new SqlCeCommand("SELECT * FROM Webpages",connection);
        SqlCeDataReader reader = cmd2.ExecuteReader();
        while (reader.Read())
        {
            Console.WriteLine(reader[0]);
            Console.WriteLine(reader[1]);   
        }
    }

但是我遇到的问题是,一旦 VS 关闭,然后当我打开它以显示数据时,数据就消失了,因为它从未保存过

当它很清楚然后它执行查询时,这怎么可能?

【问题讨论】:

  • 您的项目项目之间是否列出了您的数据库文件?它的属性Copy to OutputDirectory 是否设置为Copy Always
  • 是的,数据库列在项目项之间,但是其复制到属性设置为“如果更新则复制”。这是图片s23.postimg.org/c8ghiu9x7/Capture.png

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


【解决方案1】:

这是一种常见的情况。
您的项目项目之间列出了您的数据库文件。
其属性Copy to Output directory 设置为Copy Always

现在,您使用 VS 运行调试会话。编译成功,VS 将您的 sdf 文件从项目文件夹复制到当前输出目录 (BIN\DEBUG)。
您的代码运行顺利,并将数据插入到您的数据库文件中(在输出目录上)。
您停止并重新启动调试会话以修复某些问题,但在重新启动时,VS 会将空文件从项目文件夹重新复制到输出目录。

要打破这个圈子,请将Copy to Output Directory 设置为Copy Never(或Copy if Newer

EDIT 另一个造成混淆的原因是使用 SERVER EXPLORER 来查看数据库文件的内容。如果服务器资源管理器使用指向项目文件夹中数据库文件的连接字符串,您将永远不会在输出目录中看到对数据库文件所做的更改。
您应该在服务器资源管理器中创建两个连接,一个名为 DEBUG DataDump 的连接指向 PROJECTFOLDER\BIN\DEBUG。您可以使用此连接来检查在调试期间插入的数据或其他调试任务。另一个名为DISTRIBUTION DataDump 的文件指向项目文件夹中的文件,您可以在此处进行应用程序分发所需的架构更改。

也就是说,请记住,您的代码存在BIG 问题。它被称为Sql Injection

A parameterized query 将避免引用问题并删除 Sql Injection

int num = 0;
var command = new SqlCeCommand("INSERT INTO Webpages(Link,Data) " + 
                               "VALUES(@lnk, @cnt)",connection);
command.Parameters.AddWithValue("@lnk", link);
command.Parameters.AddWithValue("@cnt", content);
num = command.ExecuteNonQuery();

【讨论】:

  • 但它设置为 Copy If Newer
  • 使用服务器资源管理器查看更改?然后看更新
  • 好的,现在我只使用查询而不是服务器资源管理器来查看数据。但是一旦我调用 connection.close() 然后再次打开,那里就没有数据了。
  • 好的,现在我使用服务器资源管理器插入数据,它似乎是唯一的持久数据。我的查询出了什么问题。
  • 那是因为你的连接字符串指向一个没有任何路径的数据库文件。对于 Server Explorer,此数据库位于您的项目文件夹中,而您正在运行的程序位于 BIN\DEBUG 文件夹中。
【解决方案2】:

为您的 sdf 文件设置 复制到输出目录 属性为 Copy if newer

现在您似乎已将其设置为 始终复制,结果:

数据库文件从项目目录复制到bin 每次构建应用程序时的目录。所做的任何更改 到输出文件夹中的数据文件下次被覆盖 运行应用程序。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2011-01-09
    • 2017-01-14
    • 2011-12-31
    • 1970-01-01
    • 2018-07-27
    • 2023-03-09
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多