1

我有一个奇怪的问题。我正在使用 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,然后当我打开它以显示数据时,数据就消失了,因为它从未保存过

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

4

2 回答 2

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 注入

参数化查询将避免引用问题并删除 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();
于 2013-10-12T16:43:13.800 回答
0

如果您的sdf文件较新,请将Copy to Output Directory属性设置为 Copy

现在看来,您始终将其设置为副本,结果如​​下:

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

于 2013-10-12T16:41:20.350 回答