将数据库永久添加到应用程序C#

将数据库永久添加到应用程序C#,c#,ms-access,embedded-resource,C#,Ms Access,Embedded Resource,我正在尝试创建将计算机添加到Active Directory域的软件。我需要满足的一个标准是必须将机器添加到适当的OU。为了做到这一点,我有一个带有地址的站点位置列表(这是我们确定OU的方式)。此列表当前以ACCDB文件的形式存在,我希望将其包含在应用程序中,因为访问列表不会更改 我看到的所有内容都希望将DB文件连接到不同的位置,例如服务器或本地计算机上。我的首选是将DB文件用作引用或程序的.exe文件本身中的某些内容。我可能错过了一些非常明显的东西,但这已经困扰了我好几天了,所以我正在寻求帮助

我正在尝试创建将计算机添加到Active Directory域的软件。我需要满足的一个标准是必须将机器添加到适当的OU。为了做到这一点,我有一个带有地址的站点位置列表(这是我们确定OU的方式)。此列表当前以ACCDB文件的形式存在,我希望将其包含在应用程序中,因为访问列表不会更改

我看到的所有内容都希望将DB文件连接到不同的位置,例如服务器或本地计算机上。我的首选是将DB文件用作引用或程序的.exe文件本身中的某些内容。我可能错过了一些非常明显的东西,但这已经困扰了我好几天了,所以我正在寻求帮助


为了澄清,此软件必须是独立的(无安装程序)。它还必须能够确定加入域的适当OU(在PC加入域之前,无法访问共享)。它还必须具有足够的用户友好性,以避免出现错误,这意味着我希望避免复制和分发多个必须放在正确位置的文件。这就是为什么我想将ACCDB文件嵌入到应用程序中以供动态使用。

因为这是静态数据,所以事情变得容易多了。您不必担心持久化此数据、回收对程序的更改或用户意外删除某些内容等问题。您只需在应用程序中使用。在链接中,按照使用图像文件的示例进行操作。文本文件示例将损坏您的数据库

然而,这样做仍然有一个诀窍。问题是Windows附带的Access引擎无法将数据库作为资源打开,因此您需要将此文件保存到本地硬盘。好消息是它并没有看起来那么糟糕,因为您的程序可以根据需要执行此操作,并确保它是正确的,而不是要求用户将文件放在特定的位置

至于在提取文件时将其放在何处。。。最安全和最好的地方是应用程序数据文件夹。通过检查此调用的结果,可以轻松获取此文件夹的路径:

Environment.GetFolderPath(Environment.SpecialFolder.ApplicationData)
这将为您提供一个路径,在该路径中,标准特权用户确实具有写访问权限,而不管是哪个用户

总之:

  • 将ACCDB作为资源嵌入
  • 程序运行时,使用
    环境
    对象获取应用程序数据路径
  • 打开
    FileStream
    ,根据#2的路径写入文件
  • 在C中以流对象的形式打开嵌入式资源#
  • 将流从#4复制到流从#3。确保使用用于二进制数据的机制,而不是文本
  • 关闭/处置流,使文件上不再保留锁。这就像在正确的位置放置
    和使用
    块一样简单
  • 使用web上提供的数千个教程或示例中的任意一个作为指南,打开到您刚创建的文件的普通访问连接
  • 这样,您只需要分发最终的.exe文件,用户不需要任何特殊权限即可使用数据库。如果用户删除了您的文件,您不必担心;它仍然嵌入到应用程序中,如果每次启动时需要,应用程序将重新创建它


    缺点是聪明的用户可能会操纵数据库,最终导致不希望的OU。如果你需要担心这个问题,你应该考虑让程序检查一个Web服务,而不是使用嵌入式数据。您嵌入的任何内容最终都可以由最终用户更改。web服务也很好,因为您可以随着组织的发展更新映射数据,而无需重建或重新分发程序。

    您的问题不清楚。如果您只是编写一个供自己使用的应用程序,请将数据库放在一个文件夹中,并从软件中引用它。如果您正在向其他人部署(分发)应用程序,请将DB放入安装程序中,并与应用程序一起安装。在这两种情况下,由于您声明访问列表不会更改,因此您的问题就解决了。如果这两个都不能回答你的问题,那就把你的问题说得更清楚。这是一个很好的想法,我没有想到。谢谢你让我注意到它。我完全同意聪明的用户。这就是为什么DB文件中只包含位置信息(地理位置)。确定OU的实际逻辑将在软件中,因为我需要在命令中将该信息用作变量,以将系统添加到AD。非常感谢您抽出时间回答此问题,谢谢!