关闭应用程序时,将删除数据库中的所有数据

创建本地数据库文件然后将应用程序连接到它的正确方法是什么? 即使您更改项目文件夹的位置,我希望它能够工作。

知道我做的是:项目 – >添加新项目 – >基于服务的数据库,我创建一个,然后我去数据 – >添加新数据源,我添加创建的数据库,我得到连接字符串。

好的,一切都很好,我可以按照我的意愿连接到它但是当我关闭应用程序时(并非总是),我的所有数据都会从数据库中删除。

例如,这段代码:

SqlConnection c = new SqlConnection(@"DataSource=.\SQLEXPRESS;AttachDbFilename=|DataDirectory|\DB.mdf;Integrated Security=True;User Instance=True"); c.Open(); SqlCommand cmd; cmd = new SqlCommand("CREATE TABLE Persons (id int primary key, nume char(20), age int)"); cmd.ExecuteNonQuery(); cmd = new SqlCommand("INSERT INTO Persons VALUES (@id, @name, @age)", c); cmd.Parameters.AddWithValue("@id", 1); cmd.Parameters.AddWithValue("@name", "Catalin"); cmd.Parameters.AddWithValue("@age", 20); cmd.ExecuteNonQuery(); 

我第一次运行它来创建表并向其添加一个项目,然后,如果我第二次运行它而没有sqlcommand来创建表人员,它告诉我没有Persons对象,但是如果我运行第二次使用相同代码的项目,它告诉我已经有一个Persons对象…

我正在使用Visual C#Express Edition 2010。

整个User Instance和AttachDbFileName =方法存在缺陷 – 充其量! 在Visual Studio中运行应用程序时,它将复制.mdf文件(从App_Data目录到输出目录 – 通常是.\bin\debug – 应用程序运行的地方)并且很可能 ,你的INSERT运行正常 – 但是你最后只是看错了.mdf文件

如果你想坚持这种方法,那么尝试在myConnection.Close()调用上设置一个断点 – 然后用SQL Server Mgmt Studio Express检查.mdf文件 – 我几乎可以肯定你的数据在那里。

我认为真正的解决方案

  1. 安装SQL Server Express(你已经完成了)

  2. 安装SQL Server Management Studio Express

  3. SSMS Express中创建数据库,给它一个逻辑名称(例如MyDatabase

  4. 使用其逻辑数据库名称 (在服务器上创建时给定)连接到它 – 并且不要乱用物理数据库文件和用户实例。 在这种情况下,您的连接字符串将是这样的:

     Data Source=.\\SQLEXPRESS;Database=MyDatabase;Integrated Security=True 

    其他一切都和以前完全一样……

另请参阅Aaron Bertrand的优秀博客文章Bad bad to kick:使用AttachDbFileName获取更多背景信息。

在数据库文件的属性页中,将复制到输出目录设置从复制始终更改为复制(如果更新) 。 每次运行应用程序时,新数据库文件都会从项目复制到bin文件夹,因此将删除上一次运行的所有数据。

更多: https : //msdn.microsoft.com/en-us/library/ms246989.aspx

我想出了一个非常简单的答案,但也许这样做不是最好的用法。 无论如何,我将数据库添加到项目中,然后通过这样做直接连接到它:

 string path = Path.GetDirectoryName(Path.GetDirectoryName(Directory.GetCurrentDirectory))); SqlConnection c = new SqlConnection(@"Data Source=.\SQLEXPRESS;AttachDbFilename=""" + path + @"Database1.mdf"";Integrated Security=True;User Instance=True"); 

这样,如果您在多台PC之间移动项目,连接仍然有效(我最需要它)。 这也适用于.SDF文件,它也更容易。