更改不会永久保存到SQL Server Compact Edition中

Win*_*der 1 .net c# sql sql-server-ce

我有一个奇怪的问题.我使用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]);   
        }
    }
Run Code Online (Sandbox Code Playgroud)

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

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

Ste*_*eve 6

这是一种常见的情况.
您在项目项之间列出了数据库文件.
它的财产Copy to Output directory设置为Copy Always.

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

要打破此圈,请设置Copy to Output DirectoryCopy Never(或Copy if Newer)

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

说,请记住,您的代码有一个问题.它被称为Sql Injection

参数化查询将避免引用问题并删除Sql注入

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();
Run Code Online (Sandbox Code Playgroud)