sql-server - 为什么 DSN(存储在网络上)只能在我的 PC 上工作,而对我们网络上的其他人不起作用?
问题描述
我在服务器上创建了一个 Access DB,它通过 DSN 访问 SQL Server 2014 (Express) 中的数据。这可以在我的 PC 上完美运行,但是当其他人尝试打开 Access DB 时,它无法找到文件。
我对使用连接字符串进行了大量研究,但我似乎也无法做到这一点。
我尝试了 2 种途径,DSN 和连接字符串。我将描述两者。将不胜感激任何一个解决方案。
DSN:我将位于 mydocuments\mydatasources 中的 DSN 文件夹复制到 Access DB 所在服务器上的同一位置(在 F: 驱动器上)。网络上的每个人都可以访问此位置。然后我进入 Access DB 中的链接表管理器并使用该 DSN 设置位置。我还进入了 F: 驱动器上 DSN 文件夹的属性,并确保所有人都具有对该文件夹的安全访问权限。但是,当其他任何人尝试打开 Access DB 时,它会给出错误,即它无法找到应该显示在初始屏幕上的表之一。
连接字符串:我找到了这个站点,它有很多关于连接字符串的信息。 https://www.connectionstrings.com/sql-server-2014/ 该站点提供了连接字符串,但我无法获得正确的 VBA 来使用它。我目前的尝试将在下一节中展示。我得到的(运行时 3265)错误是这样的......“在与请求的名称或序号相对应的集合中找不到项目”调试显示它在 Properties(“Data Provider”)行上停止。
Dim Cn As ADODB.Connection
Dim Server_Name As String
Dim Database_Name As String
Dim sConnString As String
Dim rs As ADODB.Recordset
Set rs = New ADODB.Recordset
Server_Name = "FS01\PRACTICECS\PRACTICECS"
Database_Name = "CSP_507483_Merlinos"
Set Cn = New ADODB.Connection
With Cn
.Properties("Data Provider").Value = "SQLOLEDB"
.Properties("Data Source").Value = "FS01\PRACTICECS\PRATICECS"
.Properties("Integrated Security").Value = True
.Properties("Initial Catalog").Value = "CSP_507483_Merlinos"
.CommandTimeout = 120
.ConnectionTimeout = 120
.Open
End With
结果如上。在这一点上,我不在乎我使用哪种方法,因此将不胜感激。
解决方案
好吧,首先您发布的代码将什么都不做,因为您创建了一个连接对象,但只有在您在代码中创建 ADODB reocrdset 时才能使用此类连接对象 - 与链接表的关系为零。
下一步:不要使用系统 DSN 或 USER DSN。这两者实际上都依赖于编辑注册表,因此应该避免使用它们。
始终,但始终使用 FILE DSN。
但是,请记住,Access 总是默认将 FILE DSN 连接转换为我们所说的 DSN-LESS。
这种效果非常好,也非常糟糕。
非常好的部分:一旦您使用 FILE DSN 链接表,Access 就会将 FILE DSN 转换为更少的 DSN。
这很好,因为从 THEN ONWARDS 开始,不使用 FILE DSN。文件 DSN 设置被忽略。事实上,您可以删除您创建的 DSN,Access 仍然可以正常工作。
所以,请记住,文件 dsn 仅在链接时使用一次,并且在链接表之后,您就不需要文件 dsn,实际上它们 100% 被忽略且未使用!!!!
那么,这意味着什么?
使用 FILE dsn 链接数据库,并确保链接表正常工作。如果在使用 FILE dsn 链接之后,您应该能够关闭并退出应用程序。当您重新启动应用程序时,您的链接表应该可以正常工作。
因此,上述内容意味着现在任何打开数据库的用户都应该发现链接表可以正常工作。此时,您可以将这个前端复制并分发到每个工作站。正如我所说,DSN 被 100% 忽略并且不被 Access 使用(假设您在这里创建了一个 FILE dsn - 不要使用系统或用户 - 他们需要在注册表中进行注册表和设置和输入)。
但是,不清楚您的连接是使用 SQL 登录还是 Windows 身份验证?一个令人震惊的大问题和您遗漏的细节。
如果您使用 Windows 身份验证,那么当然每个用户都必须由您的系统管理员授予权限,而这些权限是通过使用“活动目录”或我们所说的“域服务器”来授予的。这意味着您没有使用 SQL Server 登录,也没有使用 SQL Server 来管理用户权限。
但是,如果您使用 SQL 登录,并且所有用户的常见做法是对 Access 链接表使用相同的用户 + 登录,那么上述“DSN-LESS”方法再次通过始终但始终使用和链接表来实现带有文件 DSN。
因此,只需确保您使用 Access 启动控制面板,并 100% 确保您以这种方式创建新的 DSN。因此,一旦你链接了你的表,那么事实上 FILE 被 100% 忽略,可以被删除,并且不是必需的。
请记住,您创建的连接类型可能需要您在每个工作站上安装 ODBC 驱动程序。您不必在每个工作站上复制、设置、使用或拥有 DSN。
因此,如果您使用本机 11(或 12 或 13)驱动程序进行链接,则必须在每个工作站上安装此类驱动程序。
您当然可以使用标准的“SQL 服务器驱动程序”,并且这个“旧版”驱动程序将安装在每个工作站上。
而且,如前所述,您应该在每个工作站上放置一份前端副本。
推荐阅读
- javascript - 反转时简单滑块正确添加类
- c# - UWP 从 TemplateSelector 更改为用户控件不再显示绑定
- java - Minecraft Player On World 加入活动
- django - 在Django中创建实例时使用类方法修改模型?
- python - 我的脚本或 XML 文件有问题吗?我正在使用 ElementTree 试图获取子属性
- python - python 与 python:alpine docker 镜像的兼容性如何?
- statistics - 比率校正
- blockchain - InternalCompilerError:堆栈太深,尝试使用更少的变量
- android - 如何将此库添加到我的 android studio 项目中
- sql - PostgreSQL - 将两个表合并成一个新表,但总计一个整数列