C# 在WinC窗体应用程序中嵌入MS Access数据库

C# 在WinC窗体应用程序中嵌入MS Access数据库,c#,database,winforms,ms-access,embedded-resource,C#,Database,Winforms,Ms Access,Embedded Resource,我有一个C winform应用程序,可以访问MS Access数据库中的数据。这意味着我的应用程序至少需要2个文件,即.exe文件和.accdb文件。是否可以将数据库包含在.exe文件中,从而使我的解决方案由单个文件组成,与在项目资源中包含图像的方式相同?如果可能的话,它们是否是不应该这样做的主要原因,以及您将如何从代码中访问数据?该项目只是一个供个人使用的小项目,因此,如果性能受到影响,这并不重要 提前谢谢不,不应该这样做。如何在不丢失数据的情况下向某人发送并更新.exe文件?把它分开 您需要

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


提前谢谢

不,不应该这样做。如何在不丢失数据的情况下向某人发送并更新.exe文件?把它分开


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

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

如果将Access数据库作为嵌入式资源,您可能无法实现所需的功能,但如果将所有文件包装到另一个可执行应用程序中,则可以有效地获得相同的结果

运行包装器应用程序时,它会将主C应用程序、数据库文件和更新程序应用程序提取到临时文件文件夹,并运行主应用程序

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

<> >而不是找出如何提取和插入嵌入资源,考虑将包装器应用程序作为压缩的、自解压缩的可执行文件,如自解压缩的ZIP或RAR文件。下面是一个示例,介绍如何将.Net应用程序转换为压缩的自解压exe。

这是可以完成的。只需将其添加到您的项目中,就像添加任何其他文件一样,右键单击“项目->添加->现有项”,然后取消所有弹出的对话框,为您处理它,然后右键单击project explorer中的数据库,转到“属性”并选择“生成操作:嵌入资源”

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


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

感谢您的快速响应。虽然我同意你所说的一切,但这个应用程序将只供我使用。我承认不应该这样做,我只是想知道这是否可能。这不可能,因为Jet/ACE必须更新文件,所以不能将其嵌入EXE本身。这个建议是荒谬的。我想你的意思是你想要一个单一的EXE安装文件,而不是你的最终应用程序是一个嵌入MDB的单一EXE。后者太荒谬了,不值得考虑,而且在任何情况下都是完全不可能的,可能在任何数据库引擎中都是如此。@nawfal为什么不呢?这难道没有说明如何像嵌入图片一样在项目中嵌入数据库吗?在上面的问题中,如果用户无法编辑和保存数据库,那么仅仅嵌入数据库这样的资源并将其转储有什么意义。数据库的全部用途是保存数据。我的意思是,你的答案只回答了一部分,但没有用,因为你只能倾倒,不能modify@nawfal当前位置我们不确定他是否想修改数据,但问题中没有说明。数据库的全部目的不是保存数据,而是保存数据的一半,另一半是读取数据。我确信在某些情况下,您不需要修改数据库中的现有数据。如果您还想保存数据,那么不,它不能像其他人已经说过的那样嵌入。它被术语数据库所理解,数据库是保存我们自己的数据,然后读取。部署一个只用于读取的数据库的目的是什么?他可以通过在代码本身中编写它们来获得更快的方法。数据库与自定义数据关联AFAIKWell我实际上使用这种方法嵌入一个空白Access数据库,这样我就可以将其转储,在运行时修改它,然后将其保存为文件,因为我的应用程序包括一个轻型数据库编辑器,允许您创建Access数据库,所以这就是您创建数据库的方式 空白数据库。例如,他可以购买一个预先制作的邮政编码及其对应州的数据库,除非他决定明年购买一个更新的数据库,否则他不需要编辑该数据库,等等。
internal void CreateBlankDatabase(string destFile)
{
    using (Stream source = new MemoryStream(Properties.Resources.MyEmbeddedDatabase))
    using (Stream target = File.Open(destFile, FileMode.Truncate))
    {
        source.CopyTo(target);
    }
}