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

时间:2013-10-12 16:36:44

标签: c# .net 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]);   
        }
    }

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

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

2 个答案:

答案 0 :(得分:6)

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

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

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

编辑另一个混乱的原因是使用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();

答案 1 :(得分:0)

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

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

  

将数据库文件从项目目录复制到bin   每次构建应用程序时都有目录。任何改变   下次将覆盖输出文件夹中的数据文件   您运行该应用程序。