如何强制 Access 更改无 DSN 的 ODBC 连接的用户名和密码?
Posted
技术标签:
【中文标题】如何强制 Access 更改无 DSN 的 ODBC 连接的用户名和密码?【英文标题】:How can I force Access to change the user-name and password for a DSN less ODBC connection? 【发布时间】:2011-12-08 16:41:41 【问题描述】:前言
我有一个带有 mysql 后端的 Access 2010 前端。我想使用默认 MySQL 用户名最初连接到后端数据库并进行密码检查等,然后切换到用户特定的 MySQL 用户名。
我已经创建了代码来更改连接字符串并使用新用户名重新连接 MySQL 表,但 Access 烦人地一直记住原始用户名和密码并使用那个。
问题
如何强制 MS Access 2010 忘记原始用户名和密码以连接到 ODBC 并在连接字符串中使用新用户名和密码?
复制
重现我的问题
MySQL: 创建一个名为“test”的新架构 在新架构上创建 3 个表: “table1” “table2” “table3” 创建两个有权访问该架构的新用户: 名称:“SQLUser1”,密码:“Pass01” 名称:“SQLUser2”,密码:“Pass02” 访问端: 创建一个新的 MS Access 2010 项目 创建一个新的空表单 添加 2 个名为“Cmd_User1”和“Cmd_User2”的按钮 在下面添加示例代码 您需要在 GenConString() 函数中更正服务器名称 (sServer = "MySQL")。 运行表单 点击“Cmd_User1”按钮 点击“Cmd_User2”按钮 现在检查 MySQL 日志,它将使用 user: "SQLUser1" 进行两个连接:(示例代码:
Option Compare Database
Option Explicit
Private Sub Cmd_User1_Click()
'Remove all existing tables
Call RemoveAllTables
'Connect the tables
Call AttachDSNLessTable("table1", "table2", GenConString("SQLUser1", "Pass01"))
Call AttachDSNLessTable("table2", "table2", GenConString("SQLUser1", "Pass01"))
Call AttachDSNLessTable("table3", "table3", GenConString("SQLUser1", "Pass01"))
End Sub
Private Sub Cmd_User2_Click()
'Remove all existing tables
Call RemoveAllTables
'Connect the tables
Call AttachDSNLessTable("table1", "table1", GenConString("SQLUser2", "Pass02"))
Call AttachDSNLessTable("table2", "table2", GenConString("SQLUser2", "Pass02"))
Call AttachDSNLessTable("table3", "table3", GenConString("SQLUser2", "Pass02"))
End Sub
Private Sub RemoveAllTables()
Dim bFound As Boolean, TblDef As DAO.TableDef
bFound = True 'Force to loop once
While (bFound = True)
bFound = False
For Each TblDef In CurrentDb.TableDefs
If Not (TblDef.Connect = "") Then
Call CurrentDb.TableDefs.Delete(TblDef.Name)
bFound = True
End If
Next TblDef
Wend
End Sub
Private Function AttachDSNLessTable(stLocalTableName As String, stRemoteTableName As String, stConnect As String)
On Error GoTo AttachDSNLessTable_Err
Set td = CurrentDb.CreateTableDef(stLocalTableName, dbAttachSavePWD, stRemoteTableName, stConnect)
CurrentDb.TableDefs.Append td
AttachDSNLessTable = True
Exit Function
AttachDSNLessTable_Err:
AttachDSNLessTable = False
MsgBox "AttachDSNLessTable encountered an unexpected error: " & Err.Description
End Function
Private Function GenConString(ByVal sUserName As String, ByVal sPassword As String) As String
Dim sConString As String, sServer As String, sDatabase As String, iPort As Integer
'Pull back all the required fields
sServer = "MySQL"
sDatabase = "test"
iPort = "3306"
'Generate connection string
sConString = "ODBC;Driver=MySQL ODBC 5.1 Driver; " _
& "Server=" & sServer & "; " _
& "Database=" & sDatabase & "; " _
& "UID=" & sUserName & "; " _
& "PWD=" & sPassword & "; " _
& "Port=" & iPort & "; " _
& "Option=3"
'Return new connection string
GenConString = sConString
End Function
【问题讨论】:
经过数小时的挖掘,我怀疑它可能是导致此问题的“ODBC 连接池”。请参阅:support.microsoft.com/kb/169470 但尚未发现如何检查它是否正在使用,更重要的是如何清除池以便创建新集合......有什么想法吗? 也许没有找到这个:support.microsoft.com/kb/216950/EN-US 并且它似乎对我的 MySQL 驱动程序被禁用,所以看不到它是怎么回事。回到绘图板... :( 只是一个想法,可能有帮助也可能没有帮助:tek-tips.com/viewthread.cfm?qid=556609 嘿嘿嘿嘿嘿嘿嘿嘿。据我所知,这只是告诉您在获得最终用户名之前确保没有任何东西连接到后端数据库。因为我需要在此之前进行连接,所以它没有任何好处。不过还是谢谢。 【参考方案1】:我认为您最好的方法是仅使用您的第二个用户名与您的 MySQL
数据库建立一个连接。至于在检查密码等时的原始连接,您不能使用第一个用户名保存传递查询并使用它运行吗?
【讨论】:
我不确定我是否理解您的建议,马特。听起来你建议我只使用一个用户名和密码来连接而不更改它们,这似乎有点挫败问题的对象,因为我目前有这种方法(系统使用通用用户名连接到 MySQL然后用户使用他们的应用程序特定用户名登录)并希望在用户使用他们自己的应用程序特定用户名/密码登录时更改 MySQL 的用户名,但由于清除 Access 缓存问题,这个问题是因为我做不到。 :( @Zasurus 抱歉,我以为是您的 user1 正在检查密码,但它实际上是上面代码示例中未列出的通用帐户。那么在这种情况下,您不能忽略链接您的表并使用 ADO 连接到 MySQL 数据库。然后您就可以关闭一个用户的连接并使用不同的用户名打开另一个用户? 如果我忽略我的表的重新链接,那么它将使用上次关闭访问时链接的 MySQL 用户名?使用 ADO 连接有何不同?它不会像现在一样缓存连接的 MySQL 用户名和密码,还是您建议我使用 ODBC 以外的方法进行连接?如果是这样,那是什么以及它是如何工作的? @Zasurus 我建议根本没有链接表(对不起,我没有说清楚),然后使用 ado 记录集而不是访问使用链接的本机“DAO”与您的数据库交互表,当您使用 Jet 数据库引擎时,'DAO' 很好,但对于外部数据源,'ADO' 更好,因为它被定制为能够与大多数数据源交互。这里有一个示例:sqlstrings.com/MySQL-connection-strings.htm 您仍然使用 ODBC 驱动程序,但您采取的任何操作都与您打开的当前连接有关。 谢谢,我将不得不更深入地研究 ADO,看看我是否可以使用它。这听起来确实是一个不错的选择,如果它允许我通过 Access 缓存用户名并拒绝在不重新加载访问权限的情况下更改它来解决这个问题,那么它可能会解决问题。当我对 ADO 有更多了解时会回来。 :)以上是关于如何强制 Access 更改无 DSN 的 ODBC 连接的用户名和密码?的主要内容,如果未能解决你的问题,请参考以下文章
在 Java 中为 MS Access 创建无 DSN 连接
如何使用 ASP.Net 数据源通过 ODBC DSN 连接到 Access 数据库?