我有一个C#winform应用程序,可以访问MS Access数据库中的数据。这意味着我的应用程序至少需要2个文件,.exe文件和.accdb文件。是否可以将数据库包含在.exe文件中,因此我的解决方案由单个文件组成(与在项目资源中包含图像的方式相同)?如果可能的话,它们是否有任何主要原因导致不应该这样做以及如何从代码中访问数据?该项目仅供个人使用,因此如果表现受到影响则无关紧要。
提前致谢
答案 0 :(得分:4)
可以完成。只需将其添加到项目中,就像添加任何其他文件一样(右键单击项目 - >添加 - >现有项目),然后取消将弹出的所有对话框,为您提供处理,然后右键单击您的数据库您的项目资源管理器,转到属性并选择Build Action
:Embedded 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
将是您的嵌入式数据库名称)。然后在连接字符串中使用临时文件名。确保在完成后删除临时文件。另外,正如其他人所说,您将无法修改和保存任何数据。
答案 1 :(得分:2)
不,不应该这样做。如果没有他们丢失数据,你会如何发送某人并更新到.exe文件?保持分开。
您需要有一种方法来管理应用程序的安装方式以及连接字符串中的文件位置。您的app文件夹中可能有一个\ Data子文件夹,其中包含.accdb文件。
答案 2 :(得分:1)
您可能无法通过访问数据库作为嵌入式资源实现所需,但通过将所有文件包装在另一个可执行应用程序中,您可以有效地获得相同的结果。
当您运行包装器应用程序时,它会将“主”C#应用程序,数据库文件和更新程序应用程序(下面有更多内容)提取到临时文件文件夹并运行主应用程序。
当主应用程序关闭时,它会运行更新程序应用程序,将路径传递给数据库文件和原始包装应用程序。 updater应用程序使用更改的数据库文件更新包装器应用程序文件。然后它最终从临时文件夹中删除数据库主应用程序和数据库文件。不幸的是,更新程序应用程序无法自行删除,但您可以通过向注册表的runonce部分添加命令以在下次重新启动时删除更新程序应用程序来解决此问题。
不要弄清楚如何提取和插入嵌入式资源,而应考虑将包装器应用程序作为压缩的自解压缩可执行文件(如自解压zip或rar文件)。这是一个codeproject article,它描述了如何将.Net应用程序转换为压缩的自解压exe文件。
答案 3 :(得分:-2)
Access需要能够读取和写入文件。操作系统将在运行时锁定exe,以便在使用时无法更改。这将导致它不起作用,更不用说Access simple将无法读取exe,因为它期望不同的文件格式。