MS Access 在打开数据库时处理 ODBC 错误

MS Access handle ODBC fault at opening database

我有一个 MS Access 前端,它使用 SQL 数据库作为后端。要连接,我使用 ODBC 连接并在“ODBC 数据源(32 位)”

中创建了所需的条目

当我将数据库交给其他人时,他们将需要创建此数据源。我有一个批处理文件,所以他们可以 运行 它。

如果他们不 运行 它,他们将收到类似“与 XY 的 ODBC 连接失败”之类的错误。我怎么能改变这个错误或者至少在之后写第二个消息框,我可以告诉他们“运行 要连接的批处理文件 XY”?

When I will give the database to others, they will need to create this data source.

这是你的第一个严重错误和假设。您 MOST 当然不希望以这种方式部署您的应用程序。

你的部署方式?

您将您的 accDB 文件和 link table 发送到 sql 服务器。而您 link 使用所谓的 DSN-less 连接。这种连接不需要在每个工作站上设置任何数据源。

那么,好的,现在您 link 将 table 编辑到 sql 服务器(生产服务器 - 您可能在您的开发人员 PC 上进行本地开发并使用本地副本sql 服务器快捷版。

所以,现在您 link 将 tables 连接到他们的服务器,然后您现在将 accDB 编译为已编译的 Access executable 版本 - aacDE。

您现在可以自由地将此“应用程序”部署到该公司的任何和所有工作站 - 他们不必 re-link tables,也不必设置数据源,事实上他们不需要做任何事情,只需 run/launch 应用程序。

如何建立和获得 dns-less 连接?

好吧,MOST 简单的方法是总是,但是总是总是使用文件 dsn 创建 linked tables。事实上,当您从 Access 启动 ODBC 连接管理器时,默认是使用 FILE dsn。从不,也不要使用“系统”或“用户”dsn。

如果您 link table 使用该文件 dsn,Access 会将它们转换为 DNS-less 连接。到那时,您甚至可以删除您创建的 DSN - 访问 100% 会忽略 DSN,您不再需要它了。

下一个:

如果您一直在使用 nc 17 或 nc 11-18 驱动程序?那么是的,每个工作站必须安装相同的驱动程序。或者,您可以使用较旧的“遗留”sql 驱动程序。但要小心 - 旧版驱动程序不支持 datetime2 列数据类型。

因此,请确保您没有使用需要更新驱动程序的数据类型和列。

现在,对于一些较大的站点,我们仍然使用较旧的“遗留”驱动程序,因为该驱动程序安装在 OS 级别,并且已安装在 [=109] 的每个副本上=] 回到 windows xp - 事实上 windows 98SE 版开始提供该驱动程序。因此,您可以 100% 假设遗留 sql 驱动程序已经安装并将安装在每个工作站上。

并且通过使用 + 采用 dns-less 连接,则不需要在每个工作站上设置连接。当您 link 编辑 table 时,只要这些工作站与 sql 服务器在同一个网络上,那么它们就可以使用了。

现在,在某些网站上,我们实际上什至不能在现场,我们甚至不能 pre-link 到他们的 sql 服务器。所以,我们所做的是在应用程序启动时,我们检查当前 link 是否有 linked table,如果它与我们在设置时还包括的一个小外部文本文件不匹配工作站,然后我们在启动时使用 VBA 代码到 re-link tables。但是再一次,VBA 中 table 的 re-link 很容易,而且不需要在每个工作站上进行任何类型的“dsn”或 odbc 设置。

事实上,我们过去常常这样做的另一种方法是在前端有一个 table,它有一个记录,那个记录有连接字符串。因此,就在部署之前,我们只需在前端编辑一条记录 table 以正确连接到他们的 sql 服务器。再一次,在启动时,我们检查 linked table,看看连接字符串是否匹配,如果不匹配,那么我们 运行 VBA re-link 代码,再一次,零配置和零需要在每个工作站上设置任何东西。

那么,作为一般规则,部署访问应用程序的每只狗、青蛙、昆虫?我们设置了一些 re-link 代码并在启动时检查 link。事实上,即使没有 sql 服务器,大多数开发人员也会这样做 - 即使使用访问后端,也会包含 re-link 代码来解决此问题。

但是,是 link 访问后端,还是 sql 服务器后端?一些 link 检查和系统假定已被你炒作,这段代码将 运行 在启动时检查 linked table 是否指向到正确的位置。

但是,是后端 oracle,sql 服务器还是什么?您可以创建所谓的 dsn-less linked tables。如前所述,您可以使用 VBA 来执行此操作,或者实际上您可以使用 linked table 管理器 ---- 只要您在 linked,然后 access 为您将其转换为 dns-less,您就可以开始了。

因此,实际上,对于 odbc 失败,您不必 test/check/know,因为您在启动时检查了正确的连接字符串。

然而,有一种方法可以捕获并检查 odbc 故障,这涉及使用不同的连接方式,因为我们都知道,如果你有 odbc 故障,你就是鸭汤(你有退出交流ess,并且没有已知的方法解决这个问题 - (嗯,除了测试你是否可以连接,并且你不使用 linked table - 因为如前所述,一旦 odbc 连接错误触发,游戏结束。

你做这个“替代”测试的方式是这样的:

Function TestLogin(strCon As String) As Boolean

  On Error GoTo TestError

  Dim dbs          As DAO.Database
  Dim qdf          As DAO.QueryDef

  Set dbs = CurrentDb()
  Set qdf = dbs.CreateQueryDef("")

   qdf.connect = strCon
   
   qdf.ReturnsRecords = False

   'Any VALID SQL statement that runs on server will work below.
   ' this does assume user has enough rights to query built in
   ' system tables
   
   qdf.sql = "SELECT 1 "
   qdf.Execute

   TestLogin = True
   
   Exit Function

TestError:
   TestLogin = False
   Exit Function

End Function

所以,上面没有命中或使用linked table。还有以上的巨额奖金?一旦你执行了上述有效登录,那么任何和所有 linked tables 都将工作 - 并且甚至不需要在 [=113= 的连接字符串中包含 user/password 就可以工作]ed table。这在安全性方面有巨大的好处,因为现在您不必在 linked table 中包含 user/password,这当然会暴露 user/password 在平面文本中供所有可以查看并找到 sql user/password 的用户使用。

事实上,这意味着您可以 link 您的 table,但当您 link table 时不包括 user/password ! - 当您这样做时,这是一个巨大的安全漏洞,已被堵上并修复。

因此,一旦发生有效登录(如上),那么任何和所有 linked tables 现在都可以工作,甚至无需包含 user/passwords 在那些 linked table 连接字符串中。

如前所述,另一大好处是您可以使用上面的代码来测试有效连接,并避免可怕的“odbc”错误,因为如前所述,如果在任何时候都触发过 odbc 连接错误在某个时间点,您必须退出应用程序 - 没有其他出路。

但是,应该注意的是,如果您打算使用 wi-fi 连接,或者说基于云的 sql 服务器说 运行ning on Azure?

在那种情况下,通常使用 wi-fi,或基于云的版本 sql 服务器,当然,这种通过 Internet 的连接很容易发生小而频繁的 dis-connects。

ODBC 早在互联网出现之前就已经开发出来,而且早在人们会做诸如连接访问某些基于云的 sql 服务器 运行ning 以及使用互联网连接之类的事情之前。但是,如果这最终成为您的用例和部署案例?

那么您必须硬着头皮假设并确保您现在采用 nc 11-18 驱动程序。 (我会选择 nc17)。这些新驱动程序现在具有“互联网”感知能力,它们能够优雅地处理次要 dis-conects,实际上是自动处理 re-cover 和 re-connect.

那么,如果您打算使用 wi-fi 或连接到基于云的服务器?那么是的,你必须 link tables 使用 nc17 更新的驱动程序,然后你还必须确保你 linked tables 使用的相同驱动程序版本是安装在每个工作站上。您仍然不必设置任何 dsn 连接和所有这些爵士乐 - 但您必须确保您使用的驱动程序也安装在这些工作站上。

如上所述,对于较大的部署,我们因此使用标准的“遗留”sql 驱动程序,因为去所有工作站安装此驱动程序太痛苦了。

但是,我们有一个位置,几个月来他们一直在 odbc 连接失败。我们让他们更换了路由器,甚至更换了服务器上的网卡 - 但问题仍然存在。

我们怀疑某些工作站开启了激进的电​​源管理,较新的 windows 10-11 经常会使网卡进入睡眠状态,因此在使用访问时,我们会看到 odbc 错误。因此,对于那家公司,我们让他们安装了 nc17,并使用该驱动程序 link 访问 sql 服务器,问题就消失了(因为那些较新的驱动程序现在已经内置于 re-connect ability - 这是 ODBC 的一项相对较新的功能,也是遗留系统和驱动程序所没有的功能。