我有一个奇怪的问题。我使用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关闭,之后我打开它以显示数据,数据就会消失,因为它从未保存过
当它清楚然后执行查询时,这怎么可能?
答案 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 每次构建应用程序时都有目录。任何改变 下次将覆盖输出文件夹中的数据文件 您运行该应用程序。