【问题标题】:Embed MS Access Database in C# WinForm app在 C# WinForm 应用程序中嵌入 MS Access 数据库
【发布时间】:2011-05-05 15:01:51
【问题描述】:

我有一个从 MS Access 数据库访问数据的 C# winform 应用程序。这意味着我的应用程序至少需要 2 个文件,即 .exe 文件和 .accdb 文件。是否可以在 .exe 文件中包含数据库,因此我的解决方案由单个文件组成(与在项目资源中包含图像的方式相同)?如果可能的话,它们是否是不应该这样做的任何主要原因以及您将如何从代码中访问数据?该项目只是一个供个人使用的小项目,所以如果性能受到影响,也没有太大关系。

提前致谢

【问题讨论】:

  • 我假设你的意思是你想要一个单一的 EXE 设置文件,而不是你的最终应用程序是一个嵌入了 MDB 的单一 EXE。后者太荒谬了,无法考虑,并且在任何情况下都是完全不可能的(可能根本没有任何数据库引擎)。

标签: c# database winforms ms-access embedded-resource


【解决方案1】:

不,不应该这样做。您将如何发送某人并更新到 .exe 文件而不丢失他们的数据?保持分开。

您需要有一种方法来管理应用程序的安装方式以及连接字符串中的文件位置。您的 app 文件夹中可能有一个 \Data 子文件夹,其中包含 .accdb 文件。

【讨论】:

  • 感谢您如此迅速的反应。虽然我同意你所说的一切,但这个应用程序只会被我使用。我接受不应该这样做,我只是想知道这是否可能
  • 不可能完成,因为Jet/ACE必须更新文件,所以不能将它嵌入EXE本身。这个建议很荒谬。
【解决方案2】:

访问需要能够读取和写入文件。操作系统将在运行时锁定 exe,使其在使用时无法更改。这将导致它无法工作,更不用说 Access simple 将无法读取 exe,因为它需要不同的文件格式。

【讨论】:

    【解决方案3】:

    您可能无法将访问数据库作为嵌入式资源来实现您想要的,但您可以通过将所有文件包装在另一个可执行应用程序中来有效地获得相同的结果。

    当您运行 wrapper 应用程序时,它会将“主”C# 应用程序、数据库文件和更新程序应用程序(下文详细介绍)提取到临时文件夹并运行主应用程序。

    当主应用程序关闭时,它会运行更新程序应用程序,传递数据库文件和原始包装应用程序的路径。更新程序应用程序使用更改的数据库文件更新包装应用程序文件。然后它最终从临时文件夹中删除数据库主应用程序和数据库文件。不幸的是,更新程序应用无法自行删除,但您可以通过向注册表的 runonce 部分添加一个命令来解决此问题,以便在下次重新启动时删除更新程序应用程序。


    与其弄清楚如何提取和插入嵌入式资源,不如考虑将包装应用程序作为一个压缩的自解压可执行文件(如自解压 zip 或 rar 文件)。这是一个codeproject article,描述了如何将 .Net 应用程序转换为压缩的、自解压的 exe。

    【讨论】:

      【解决方案4】:

      可以完成。只需将其添加到您的项目中,就像添加任何其他文件一样(右键单击项目 -> 添加 -> 现有项目),然后取消所有弹出的对话框,让您为您处理它,然后从您的项目中右键单击您的数据库资源管理器,转到属性并选择Build ActionEmbedded Resource

      然后使用下面的方法将你的数据库转储到一个临时文件中,你可以通过调用Path.GetTempFileName来创建它。

      internal void CreateBlankDatabase(string destFile)
      {
          using (Stream source = new MemoryStream(Properties.Resources.MyEmbeddedDatabase))
          using (Stream target = File.Open(destFile, FileMode.Truncate))
          {
              source.CopyTo(target);
          }
      }
      

      (请注意,MyEmbeddedDatabase 将是您的嵌入式数据库名称)。然后在连接字符串中使用您的临时文件名。确保在完成后删除临时文件。另外,正如其他人所说,您将无法修改和保存任何数据。

      【讨论】:

      • @nawfal 为什么不呢?它不是展示了如何像嵌入图片一样在项目中嵌入数据库吗?
      • 在上面的问题中,如果用户无法编辑和保存它,仅仅嵌入一个像资源这样的数据库并转储它有什么意义。数据库的全部目的是保存数据。我的意思是你的回答只是部分回答了它,但没有用,因为你只能转储,不能修改
      • @nawfal:嗯,我们不确定他是否想修改他的数据(他没有在问题中说出来)。数据库的全部目的不是保存数据,而只是其中的一半,另一半是读取数据。我确信在某些情况下您不需要修改数据库中的现有数据。如果您还想保存数据,那么不,它不能像其他人所说的那样嵌入。
      • 它理解为数据库这个词,数据库就是保存我们自己的数据然后读取。部署数据库仅用于读取的目的是什么?他可以通过将它们写入代码本身来获得更快的方法。数据库与自定义数据 AFAIK 关联
      • 好吧,我实际上使用这种方法嵌入了一个空白 Access 数据库,因此我可以将其转储出来,在运行时对其进行修改,然后将其保存为文件(因为我的应用程序包含一个轻型数据库编辑器,它让您创建 Access 数据库,因此这就是您“创建”空白数据库的方式)。例如,他可以购买一个预制的邮政编码数据库及其相应的状态,除非他决定明年购买更新的数据库,否则他不需要编辑,等等。
      猜你喜欢
      • 2013-12-30
      • 2015-08-23
      • 1970-01-01
      • 2011-12-19
      • 1970-01-01
      • 2016-03-31
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多