2017-06-21 56 views
0

我的部門使用使用VBA和Access 2016創建的應用程序。它最初指向我們的一臺服務器上的Access數據庫。在將數據遷移到不同的服務器之後,我現在需要將它指向該不同服務器上的其他SQL Server數據庫。但我似乎無法建立聯繫。如何連接到Access 2016 VBA中的新數據源?

我有dbowner有關服務器的權限。

連接字符串中的原代碼如下:

'Remove the filter, close the log on form, and open the Switchboard 
rst.Filter = 0 
DoCmd.Close acForm, "frmUserLogOn" 

'Open the Main Switchboard 
DoCmd.OpenForm "frmMain", acNormal 

'Open the InactiveShutDown form in Hidden mode 
DoCmd.OpenForm "frmInactiveShutDown", acNormal, , , , acHidden 
... 

Set conn = CurrentProject.Connection 
... 

rstLog.Open "tblUserLog", conn, adOpenKeyset, adLockOptimistic 
rstLog.AddNew 
    rstLog!UserID = rst!UserID 
    rstLog!TimeIn = Now() 
rstLog.Update 

我的新代碼如下:

'DoCmd.OpenForm "frmInactiveShutDown", acNormal, , , , acHidden 
'Commented out the above statement 
...  
'Set conn = CurrentProject.Connection 
'================================================================== 
'Start of Added Code for SQL Migration 
Set conn = New ADODB.Connection 
With conn 
    .ConnectionString = "Provider=SQLNCLI11;Data Source=(My Server Name);Initial Catalog=(My Database Name);User ID=(Username);Password=(Password)" 
    .Open 
    If .State = adStateClosed Then 
     MsgBox "Connection unsuccessful. Could not open connection.", vbInformation, "Error:" 
    End If 
End With 

Set rst = New ADODB.Recordset 
With rst 
    .ActiveConnection = conn 
    .CursorLocation = adUseClient 
    .CursorType = adOpenStatic 
    .LockType = adLockOptimistic 
    .Open "tbl_Users" 
End With 
'End of Added Code for SQL Migration - See Section 2 for rest of code. 
'================================================================== 
... 

'Section 2 of Code 
'================================================================== 
'Start of added code for SQL Migration 
rstLog.Open "tblUserLog", conn, adOpenStatic, adLockOptimistic 
rstLog.AddNew 
    rstLog!UserID = rst!UserID 
    rstLog!TimeIn = DateTime.Now() 
rstLog.Update 
MsgBox "Success! Connection was made successfully.", vbInformation 
'End of added code for SQL Migration 
'=================================================================== 

我的形式有一個下拉選擇列表中的用戶形成表。我在該表中添加了一個測試用戶,但該測試用戶沒有顯示在下拉列表中。因此,我認爲這種聯繫沒有形成。

是否必須在引號中輸入數據源,初始目錄,用戶ID和密碼的名稱?那麼UserID='Admin'; Password='Test'

任何人都知道我在做什麼錯了?

+0

你是否給出錯誤信息?當你嘗試時會發生什麼? –

+1

這不是VB.NET代碼 – Plutonix

+0

也,引號是正確的,但我相信用戶ID應該是用戶ID或用戶ID(全部在一起)。 [檢查出來](https://www.connectionstrings.com/sql-server-native-client-11-0-oledb-provider/standard-security/) –

回答

1

基本上,本地Access前端數據庫和後端SQL Server數據庫之間的版本混淆了相同的命名錶。目前,您的代碼更新了SQL Server後端上的tblUserLog,並且在Access前端端不一樣,這可能是綁定到您的表單的那一端。因此,爲什麼你看不到任何更新,因爲服務器表從不顯示。

簡單地做一兩件事情:

  1. 使用SQL Server版本:刪除或存檔訪問版本,並添加tblUserLogODBC linked table。請務必刪除dbo_或其他架構前綴並保留相同名稱tblUserLog。並且由於表名不會改變,因此表單和VBA代碼等所有內容都不需要更改。

  2. 使用Access版本:保持本地Access表,tblUserLog,並更新這一個在VBA這需要增加另一個連接對象,並運行該連接上一個記錄更新。見下面server_local_的前綴對ADO對象:

    ' OPEN SERVER CONNECTION AND SERVER TABLE RECORDSET 
    Set server_conn = New ADODB.Connection 
    
    With server_conn 
        .ConnectionString = "Provider=SQLNCLI11;Data Source=(My Server Name);Initial Catalog=(My Database Name);User ID=(Username);Password=(Password)" 
        .Open 
        If .State = adStateClosed Then 
         MsgBox "Connection unsuccessful. Could not open connection.", vbInformation, "Error:" 
        End If 
    End With 
    
    Set server_rst = New ADODB.Recordset 
    With server_rst 
        .ActiveConnection = conn 
        .CursorLocation = adUseClient 
        .CursorType = adOpenStatic 
        .LockType = adLockOptimistic 
        .Open "tbl_Users" 
    End With 
    
    ' OPEN LOCAL CONNECTION AND UPDATE LOCAL TABLE RECORDSET 
    Set local_conn = CurrentProject.Connection 
    
    Set local_rstLog = New ADODB.Recordset 
    local_rstLog.Open "tblUserLog", local_conn, adOpenStatic, adLockOptimistic 
    local_rstLog.AddNew 
        local_rstLog!UserID = server_rst!UserID  ' NOTICE SERVER DATA USED HERE 
        local_rstLog!TimeIn = DateTime.Now() 
    local_rstLog.Update 
    
    ... 
    ' RELEASE RESOURCES 
    Set server_rst = Nothing: Set local_rstLog = Nothing 
    Set server_conn = Nothing: Set local_conn = Nothing