我有一个奇怪的问题。我正在使用 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 Output directory
设置为 Copy Always
。
现在,您使用 VS 运行调试 session 。编译成功,VS 将您的 sdf
文件从项目文件夹复制到当前输出目录 (BIN\DEBUG)。
您的代码运行顺利,并将数据插入数据库文件(在输出目录中)。
您停止并重新启动调试 session 以修复某些问题,但在重新启动时,VS 将空文件从项目文件夹重新复制到输出目录。
要打破这个循环,将Copy to Output Directory
设置为Copy Never
(或Copy if Newer
)
编辑 另一个混淆来源是由于使用 SERVER EXPLORER 查看数据库文件的内容。如果服务器资源管理器使用指向项目文件夹中的数据库文件的连接字符串,您将永远看不到对输出目录中的数据库文件所做的更改。
您应该在服务器资源管理器中创建两个连接,一个名为 DEBUG DataDump
的连接指向 PROJECTFOLDER\BIN\DEBUG
。您可以使用此连接来检查调试期间插入的数据或用于其他调试任务。另一个名为 DISTRIBUTION DataDump
的文件指向项目文件夹中的文件,您可以在此处进行应用程序分发所需的架构更改。
也就是说,请记住您的代码有一个大问题。它叫做Sql Injection
A parameterized query将避免引用问题并删除 Sql 注入(inject)
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();
关于c# - 更改不会永久保存到 SQL Server Compact 版本中,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19336622/