【问题标题】:All data from database is deleted when closing the application关闭应用程序时删除数据库中的所有数据
【发布时间】:2018-03-06 08:27:08
【问题描述】:

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

知道我要做的是:项目->添加新项目->基于服务的数据库,然后创建一个,然后转到数据->添加新数据源,添加创建的数据库并获取连接字符串.

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

例如这段代码:

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();

我第一次运行它来创建表并向其中添加一个项目,然后,如果我第二次运行它而不使用 sql 命令来创建表 people,它告诉我没有 Persons 对象,但是如果我第二次使用相同的代码运行该项目,它告诉我已经有一个 Persons 对象...

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

【问题讨论】:

  • 您是否通过单击“开始调试”来运行您的程序,并且您的 .mdf 是否在 Bin 文件夹中?如果是,可能是每次构建/运行程序时都会覆盖您的 .mdf。
  • marc_s answer 是完全正确的。另外我建议使用using statement自动处理你的连接和命令,最好使用Add方法指定参数类型和它的大小而不是AddWithValue,因为it might generate unexpected results sometimes

标签: c# database sql-server-express


【解决方案1】:

整个 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 habits to kick: using AttachDbFileName

【讨论】:

  • 我喜欢你给我的解决方案,但不幸的是,除了 Visual Studio 之外我什么都不能使用(我正在准备比赛,除了 Visual Studio 之外我不能安装任何其他东西)。有没有办法我可以创建一个 mdf 文件,将它放在项目文件夹中的某个位置,然后通过知道项目文件夹中的位置连接到它?那将是完美的
  • @CatalinHoha:如果您使用的是 .mdf 文件,那么您也必须安装 SQL Server - 单独的 Visual Studio 无法处理 .mdf 文件。
【解决方案2】:

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

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

【讨论】:

    【解决方案3】:

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

    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 文件,而且更简单。

    【讨论】:

      猜你喜欢
      • 2023-03-10
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-08-04
      • 1970-01-01
      • 1970-01-01
      • 2019-09-16
      相关资源
      最近更新 更多