2011-12-08 78 views
1

前言

我有一個帶有MySQL後端的Access 2010前端。我想使用默認的MySQL用戶名來初始連接到後端數據庫並進行密碼檢查等,然後切換到用戶特定的MySQL用戶名。如何強制Access更改DSN less ODBC連接的用戶名和密碼?

我已經創建了代碼來更改連接字符串,並重新連接MySQL表與新的用戶名,但訪問煩人地記住原來的用戶名和密碼,並使用該代碼。

問題

我怎麼能強迫MS Access 2010中忘記了原來的用戶名和密碼才能連接到ODBC並使用連接字符串中的新的?

複製

要重新創建我的問題

  • MySQL的:
    • 創建一個名爲 「測試」
    • 新模式的新模式創建3個表:
      • 「 table1「
      • 」選項卡LE2"
      • 「表3」
    • 創建有權訪問架構兩個新用戶:
      • 名稱: 「SQLUser1」,道: 「Pass01」
      • 名稱: 「SQLUser2」,通: 「Pass02」
  • 接入端:
    • 創建一個新的MS ACCE SS 2010項目
    • 創建一個新的空形式
      • 添加2個按鈕被稱爲「Cmd_User1」和「Cmd_User2」
    • 添加以下
      • 示例代碼,您將需要更正服務器名稱( sServer =「MySQL」)在GenConString()函數中。
    • 運行形式
    • 點擊 「Cmd_User1」 按鈕
    • 點擊 「Cmd_User2」 按鈕
  • 現在檢查MySQL的日誌,它會使用用戶: 「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 
+0

經過數小時的挖掘,我懷疑它可能是導致此問題的「ODBC連接池」。請參閱:http://support.microsoft.com/kb/169470但是沒有發現如何檢查它是否正在使用,更重要的是如何清除池,以便創建一個新的集合...任何想法? – GazB

+0

也許沒有找到:http://support.microsoft.com/kb/216950/EN-US,它似乎被我的MySQL驅動程序禁用,因此看不到它是如何的。回到畫板...... :( – GazB

+0

只是一個想法,可能會也可能沒有幫助:http://www.tek-tips.com/viewthread.cfm?qid=556609 – Fionnuala

回答

1

我認爲你最好的辦法是隻有一個連接到你的MySQL數據庫,使用你的第二個用戶名。至於在檢查密碼等時的原始連接,您是否可以不保存帶有第一個用戶名的傳遞查詢並以此運行?

+0

我不知道我理解你的建議馬特。這聽起來像你的建議我只使用一個用戶名和密碼進行連接,不改變它們,似乎有點擊敗問題的對象,因爲我目前擁有該方法(系統使用通用用戶名連接到MySQL然後用戶使用其特定於應用程序的用戶名登錄),並且希望在用戶使用其自己的應用程序特定的用戶名/密碼登錄時更改MySQL的用戶名,但由於清除Access緩存問題,此問題是因爲我不能那樣做。:( – GazB

+0

@ Zasurus道歉,我以爲它是你的user1,它正在檢查密碼,但它實際上是一個未在上面的代碼示例中列出的通用帳戶。在這種情況下,你不能忽略鏈接你的表,而是使用ADO連接到MySQL數據庫。然後,您可以關閉一個用戶的連接並使用其他用戶名打開另一個用戶? –

+0

如果我忽略我的表的重新鏈接,那麼它將使用上次關閉訪問時所鏈接的MySQL用戶名?如何使用ADO連接有什麼不同?難道它仍然不會像現在這樣緩存連接的MySQL用戶名和密碼,或者您是否建議我使用ODBC以外的方法連接?如果是這樣,它是如何工作的? – GazB

相關問題