将数据库永久添加到应用程序 C#
Permanently add a database to an application C#
我正在尝试创建将计算机添加到 Active Directory 域的软件。我需要满足的一个条件是机器必须添加到正确的 OU。为了做到这一点,我有一组带有地址的站点位置列表(这是我们确定 OU 的方式)。该列表目前采用 ACCDB 文件的形式,我想将其包含在应用程序中,因为访问列表不会更改。
我看到的一切都希望将数据库文件连接到不同的位置,例如服务器或本地计算机。我的偏好是使用 DB 文件作为参考或程序的 .exe 文件本身中的某些内容。我可能遗漏了一些非常明显的东西,但这几天一直困扰着我,所以我正在寻求帮助。
澄清一下,此软件必须是独立的(无安装程序)。它还必须能够确定正确的 OU 以加入域(在 PC 加入域之前无法访问共享)。它还必须对用户足够友好以避免错误,这意味着我想避免复制分发必须转到正确位置的多个文件。这就是为什么我想将 ACCDB 文件嵌入到应用程序中以供即时使用。
事情变得容易多了,因为这是静态数据。您不必担心保留此数据、回收更改到您的程序或用户意外删除某些内容等。您将能够在您的应用程序中使用 embedded resource。在 link 中,按照示例使用图像文件。文本文件示例会损坏您的数据库。
不过,这样做还是有技巧的。问题是 Windows 附带的 Access 引擎无法将数据库作为资源打开,因此您需要将此文件保存到本地硬盘。好消息是它并不像看起来那么糟糕,因为你的程序可以根据需要做这件事,并确保它是正确的,而不是要求用户把文件放在特定的地方.
至于解压后文件放在哪里...最安全最好的地方是Application Data文件夹。您可以通过检查此调用的结果轻松获取此文件夹的路径:
Environment.GetFolderPath(Environment.SpecialFolder.ApplicationData)
这将为您提供一条路径,其中标准权限用户 具有写入权限,无论哪个用户。
总结:
- 将 ACCDB 作为资源嵌入。
- 当您的程序运行时,使用
Environment
对象获取应用程序数据路径。
- 根据#2
的路径打开一个FileStream
写入文件
- 在 C# 中将嵌入资源作为 Stream 对象打开
- 将#4 中的流复制到#3 中的流。确保使用用于二进制数据而非文本的机制。
- Close/Dispose 你的流,所以文件上没有锁。这就像将
using
块放在正确的位置一样简单。
- 使用 Web 上提供的数以千计的教程或示例中的任何一个作为指南,打开到您刚刚创建的文件的正常 Access 连接。
这样,您只需要分发最终的.exe文件,用户不需要任何特殊权限就可以使用数据库。如果用户删除了您的文件,您不必担心;它仍然嵌入在应用程序中,如果需要,它会在每次启动时重新创建它。
缺点是聪明的用户可能能够操纵数据库以结束不受欢迎的 OU。如果您需要为此担心,您应该考虑让程序检查 Web 服务,而不是使用嵌入式数据。您嵌入的任何内容最终都可能被最终用户更改。 Web 服务也很不错,因为您可以随着组织的发展更新地图数据,而无需重建或重新分发程序。
我正在尝试创建将计算机添加到 Active Directory 域的软件。我需要满足的一个条件是机器必须添加到正确的 OU。为了做到这一点,我有一组带有地址的站点位置列表(这是我们确定 OU 的方式)。该列表目前采用 ACCDB 文件的形式,我想将其包含在应用程序中,因为访问列表不会更改。
我看到的一切都希望将数据库文件连接到不同的位置,例如服务器或本地计算机。我的偏好是使用 DB 文件作为参考或程序的 .exe 文件本身中的某些内容。我可能遗漏了一些非常明显的东西,但这几天一直困扰着我,所以我正在寻求帮助。
澄清一下,此软件必须是独立的(无安装程序)。它还必须能够确定正确的 OU 以加入域(在 PC 加入域之前无法访问共享)。它还必须对用户足够友好以避免错误,这意味着我想避免复制分发必须转到正确位置的多个文件。这就是为什么我想将 ACCDB 文件嵌入到应用程序中以供即时使用。
事情变得容易多了,因为这是静态数据。您不必担心保留此数据、回收更改到您的程序或用户意外删除某些内容等。您将能够在您的应用程序中使用 embedded resource。在 link 中,按照示例使用图像文件。文本文件示例会损坏您的数据库。
不过,这样做还是有技巧的。问题是 Windows 附带的 Access 引擎无法将数据库作为资源打开,因此您需要将此文件保存到本地硬盘。好消息是它并不像看起来那么糟糕,因为你的程序可以根据需要做这件事,并确保它是正确的,而不是要求用户把文件放在特定的地方.
至于解压后文件放在哪里...最安全最好的地方是Application Data文件夹。您可以通过检查此调用的结果轻松获取此文件夹的路径:
Environment.GetFolderPath(Environment.SpecialFolder.ApplicationData)
这将为您提供一条路径,其中标准权限用户 具有写入权限,无论哪个用户。
总结:
- 将 ACCDB 作为资源嵌入。
- 当您的程序运行时,使用
Environment
对象获取应用程序数据路径。 - 根据#2 的路径打开一个
- 在 C# 中将嵌入资源作为 Stream 对象打开
- 将#4 中的流复制到#3 中的流。确保使用用于二进制数据而非文本的机制。
- Close/Dispose 你的流,所以文件上没有锁。这就像将
using
块放在正确的位置一样简单。 - 使用 Web 上提供的数以千计的教程或示例中的任何一个作为指南,打开到您刚刚创建的文件的正常 Access 连接。
FileStream
写入文件
这样,您只需要分发最终的.exe文件,用户不需要任何特殊权限就可以使用数据库。如果用户删除了您的文件,您不必担心;它仍然嵌入在应用程序中,如果需要,它会在每次启动时重新创建它。
缺点是聪明的用户可能能够操纵数据库以结束不受欢迎的 OU。如果您需要为此担心,您应该考虑让程序检查 Web 服务,而不是使用嵌入式数据。您嵌入的任何内容最终都可能被最终用户更改。 Web 服务也很不错,因为您可以随着组织的发展更新地图数据,而无需重建或重新分发程序。