【问题标题】:Access with 1 MySQL Table asking for credentials使用 1 个 MySQL 表进行访问,要求提供凭据
【发布时间】:2019-05-12 17:16:06
【问题描述】:

我有一个使用本地 sql 服务器后端的访问数据库,用于除 1 个基于 Web 的 MySQL 表之外的所有表。 MySQL表有50行左右,3个字段,一点都不大。我有一个 odbc 连接设置,并且该表与保存的密码链接。这张表每天最多更新30次...有时连接中断,会出现MySQL连接弹窗...点击test会成功,点击ok会让代码继续。它正在进行 1 行更新 (SET LastUpdatedDate = #" & now() & "# WHERE ItemID = 'xyz')。

我想捕获一个错误,或者如果它不可用时让它在没有连接的情况下继续......但似乎没有产生错误。发生这种情况时,我宁愿不更新表,然后必须物理选择 ok 以使其再次运行。此问题存在于美国各地的多台 PC 上的多个位置。我认为这是托管 MySQL 数据库的服务器有问题 - 我只是想知道如何忽略它们并继续使用其他代码......再次,没有产生错误(所以 On Error ......不会'不工作)。有任何想法吗?使用 Access 2016。

更新:我当前的设置是 ping 服务器...如果 ping 得到响应,我认为它已启动...然后我运行 'CurrentDb.Execute "UPDATE XYZ SET ABC = 'DEF' WHERE GHI ='JKL'”。就这么简单。如果我尝试查询表 XYZ 并且它不可用,我会得到相同的连接弹出窗口。我应该如何刷新桌子?删除链接并重新创建?

新更新 终于开始尝试下面 Andre 提出的无 DSN 直通查询。当我进入“执行”步骤时,我收到一条错误消息,提示我无法执行选择查询......但它是一个更新查询。这是 SQL 字符串....SQL = "UPDATE [Status] SET ItemDate = NOW() WHERE PlantID = '" & PlantID & "' AND ItemID = '" & ItemID & "'"

【问题讨论】:

  • 老实说,我会更改代码以在每次执行时刷新链接。这将强制它刷新,然后你不会看到错误。
  • 发布您当前的代码。有几种方法可以解决此问题,但您需要向我们展示您目前所拥有的。
  • 您是否尝试过 Pass-Through 查询?

标签: mysql vba ms-access


【解决方案1】:

我建议您不要在链接表上运行 Access 查询,而是使用动态创建的无 DSN Pass-Through 查询

这应该始终有效,或者引发可捕获的错误。

Const ConnectString = "ODBC;DRIVER={MySQL ODBC 5.1 Driver};SERVER=your.server.com;PORT=3306;DATABASE=mydatabase;UID=myuserid;PWD=mypassword"

Dim qdf As DAO.QueryDef
Set qdf = CurrentDb.CreateQueryDef("")
With qdf
    ' Setting .Connect turns it into a Pass-Through query
    .Connect = ConnectString
    ' Need to set this for non-SELECT queries
    .ReturnsRecords = False
    ' Note: you need to use MySql syntax here, not Access SQL, especially the correct date format
    .SQL = "UPDATE XYZ SET ABC = 'DEF' WHERE GHI = 'JKL'"
    ' or since MySql has a NOW() function too, just this:
    .SQL = "UPDATE foo SET LastUpdatedDate = NOW() WHERE ItemID = 'xyz'"
    .Execute
End With

您也可以尝试保存的 Pass-Through 查询,它也可以正常工作。那么你只需要提供当前的.Sql,而不是连接字符串。

【讨论】:

  • 抱歉耽搁了——终于有时间试试这个了。当我进入“执行”步骤时,我收到一条错误消息,提示我无法执行选择查询......但它是一个更新查询。 .SQL = "UPDATE [Status] SET ItemDate = NOW() WHERE PlantID = '" & PlantID & "' AND ItemID = '" & ItemID & "'"
  • 太棒了!那是我需要的线。我现在已经为这个操作添加了一个错误处理程序,并且应该能够捕获任何弹出的错误。我真的很感激!
【解决方案2】:

如果您使用选项 dbFailOnError 执行 SQL 命令,也许您会得到一个有用的错误?像 CurrentDB.Execute("Your SQL", dbFailOnError)

【讨论】:

  • 我还没有尝试过...我会添加它并看看会发生什么...无法预测何时会发生中断,因此可能需要一段时间才能判断它是否有效。
  • 不 - 没有任何帮助 - 将它添加到两台不同的电脑上,并且都锁定在连接字符串上。还有其他想法吗?
  • 您是否查看了 MySql 连接的连接器/ODBC 设置?有一个选项“启用自动重新连接” - 此处显示dev.mysql.com/doc/connector-odbc/en/…
  • 一夜之间试了试(也选择了“重新连接时不提示”,但(或组合)都不起作用。谢谢!
  • 正确 - 启用自动重新连接后仍然弹出连接。
【解决方案3】:

在尝试UPDATE 之前,先做一个简单的SELECT。如果它没有返回合理的结果,则假定连接已断开。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2019-09-13
    • 2020-08-03
    • 2013-01-13
    • 1970-01-01
    • 1970-01-01
    • 2016-08-03
    • 1970-01-01
    相关资源
    最近更新 更多