簡體   English   中英

將多用戶訪問前端連接到SQL Server后端

[英]Connecting a Multi User Access Front End to SQL Server Back End

一如既往地感謝您的幫助!

我已經構建了一個Access數據庫,我們打算將其分發給大約100個最終用戶。 我目前正在為5個用戶運行試點計划。 我已將表遷移到SQL 2014 Server,但目前試驗程序的后端位於共享網絡文件夾中(位置未知)。 我通過在該共享網絡上保存文件並指示最終用戶將副本保存到其桌面來分發Access前端(accde文件類型)。 飛行員工作正常,如果不是有點慢。

我遇到的問題是:

我能夠在我的機器上設置ODBC連接,並能夠通過該連接連接到SQL Server后端。 但是,我不知道如何讓我的最終用戶訪問服務器上的表。 我是否需要為服務器上的每個用戶創建一個用戶名並為其提供讀寫訪問權限? 我是否還需要在計划安裝前端的每台計算機上創建ODBC連接? 我寧願不必在每台機器上創建ODBC連接,是否可以解決這個問題? 謝謝!

訪問版本:2013 SQL:2014致力於SSMS 2014

-Charlie

一些東西:

創建鏈接表時,只需使用功能區導入和鏈接 - 然后使用ODBC數據庫。 只需選擇文件DSN即可。 原因是DEFAULT的訪問將使用無DSN連接。 簡單來說,這意味着當您鏈接表格時,您可以將您的applcatation分發到每個工作站,而無需設置SYSTEM / Machine DSN。

所以請記住,使用默認文件DSN - 一旦Access創建到SQL Server的鏈接,那么這些鏈接是無DSN的,並且您不需要在每個工作站上進行任何設置。

至於在SQL服務器上創建用戶? 好吧,除非你想為每個用戶提供某種特殊的安全性,否則你可能不需要。 如果您使用SQL登錄,請確保在上述鏈接過程中“檢查”保存密碼選項。 再次,因為默認情況下鏈接表是DSN-less,然后每個用戶實際上將使用同一個SQL用戶/密碼,因此這對每個用戶都是透明的(他們不必登錄)。

如果您使用Windows身份驗證進行SQL登錄,則使用Windows系統而非SQL服務器設置安全性。 在這種情況下,每個用戶的Windows登錄將用於控制(允許)使用SQL服務器。 如果您不使用域控制器,那么您將使用SQL登錄,並且可能只是您正在使用的一個登錄就足夠了。 通常即使在企業環境中,因為我不想為每個登錄和SQL服務器的權限調用IT管理員,那么我仍然選擇SQL登錄。 因此,“曾經”IT管理員給我足夠的SQL服務器權限,然后我可以自由創建我自己的登錄,或者只是為每個人使用“同一個”登錄,因此不必浪費時間打擾IT鄉親。

還有一些額外的要點:忽略建議使用各種ADO和VBA代碼和連接字符串等 - 它們不是必需的。 事實上,在大多數情況下,您希望在應用程序中避免使用ADO代碼。 而且,對於SQL服務器(ADO傾向於依賴),oleDB正在被折舊。

您仍然需要將每個工作站上的前端程序放在一起。 就像你在每個工作站或會計軟件包上安裝文字一樣,既然你正在開發軟件,那么你就像過去30年來IT行業那樣在每個工作站上安裝你的軟件。 您當然可以在共享文件夾上共享數據,但是您可以安裝實際的應用程序(word,Excel,或者在這種情況下,您可以在EACH工作站上安裝。)在任何部署之前,您應該將accDB編譯為accDE。

因此,如果您對這些用戶的部署位於同一網絡上,那么啟動“連接”或“鏈接”到SQL服務器時,您並不需要任何特殊代碼。 如果您是“非現場”的開發人員或顧問,那么您可能需要在啟動時添加一些代碼以重新鏈接到他們的sql服務器,這無疑會與您在異地開發的服務器不同。 因此,如果您無法在現場開發,或者您使用的SQL服務器是“復制”或“測試”,則需要一些能夠重新鏈接到“不同”SQL服務器然后正在開發的SQL服務器的能力。正在使用的實際生產SQL服務器的版本。

每台計算機上都不需要ODBC連接。 您可以通過DoCmd.TransferDatabase使用ODBC連接字符串來創建連接。 這是持久性的,因此您可以在前端的開發副本上執行連接/更新,並且連接將存在並保留在您所創建的任何最終用戶副本中。

您必須處理身份驗證問題。 根據您的安全情況,您可以創建一個“數據庫用戶”,並在上述連接中包含用戶名和密碼。 如果您在AD環境中,則可以使用它進行身份驗證。 或者,您為每個用戶或用戶組創建單獨的SQL帳戶。 無論您做什么,如果Access具有對它們的讀/寫權限,用戶將能夠查看和編輯表。 您可以使用視圖將它們鏈接到Access而不是表本身來保護單個表。

我建議不要讓用戶制作前端的本地副本。 這使得確保您的用戶使用最新版本的前端成為一場噩夢。 鼓勵他們改為做捷徑。 除非你有每個用戶的本地臨時表或動態編輯表單/報告的代碼,否則沒有太多理由不讓每個人都使用相同的前端文件。 即使在這種情況下,也要創建一個部署批處理文件,為每個用戶創建/覆蓋前端副本。

鏈接到SQL Server數據庫的示例代碼:

Public Sub LoadDatabase()

Dim MyDB As DAO.Database
Set MyDB = CurrentDb
Dim d As DAO.Recordset
Set d = MyDB.OpenRecordset("SELECT TableName FROM tblLinkTables")
d.MoveFirst
Do While Not d.EOF
    DoCmd.DeleteObject acTable, d!TableName
    DoCmd.TransferDatabase acLink, "ODBC Database", "ODBC;Driver={SQL Server};Server=MYSQLSERVERNAME;Database=MyDatabaseName;Uid=DatabaseUser;Pwd=DatabaseUserPassword", acTable, d!TableName, d!TableName, False, True
    d.MoveNext
  Loop
d.Close
Set d = Nothing

End Sub

要鏈接的表的列表存在於名為tblLinkTables的本地表上,其中每個表都要鏈接一個字段TableName。 這是一個非常簡化的版本。 我實際使用的那個能夠具有與SQL表不同的本地表名,還能鏈接視圖並為它們創建主鍵(可選)。

以下是如何獲取與SQL Server的連接的一個示例。 它支持使用可信連接(Windows用戶被授權訪問,或者您可以指定sqlserver定義的用戶ID和密碼)。

' The following are some of the parameters the connection will use.
Global gv_DBS_SQLServer                 As ADODB.Connection
Global gvstr_SQLServer_Name             As String
Global gv_SQLServer_DSN                 As String
Global gvstr_SQLServer_Database         As String

'Call the GetConnection Function
' Pass Name of Server; Database Name; Connection Variable; adUseServer; True if using Password; False if not using a Trusted Connection;
' Sample
    If GetConnection(gvstr_SQLServer_Name, gvstr_SQLServer_Database, _
            gv_DBS_SQLServer, adUseServer, True, False) = False Then
        MsgBox "Unable to connect to SQL Server", vbOKOnly, "No Connection"
    End If


Public Function GetConnection(ByVal strDSN As String, _
        ByVal strDatabase As String, _
        ByRef cnLocal As ADODB.Connection, _
        ByVal CursorLoc As CursorLocationEnum, _
        ByVal UsePassword As Boolean, _
        ByVal blnTrusted As Boolean) As Boolean

Dim strConnectString    As String
Dim strDisplay          As String

    On Error GoTo ERROR_HANDLER
    GetConnection = False
Retry_Connection:
    If cnLocal Is Nothing Then Set cnLocal = New ADODB.Connection
    If cnLocal.State = adStateOpen Then
        Debug.Print "Connection already open -- -will not reopen!!"
        GetConnection = True
        GoTo Proc_Exit
    End If
    With cnLocal
        Debug.Print "Use TRUSTED CONNECTION (ABOVE)"
        If blnTrusted = True Then
            strConnectString = "Driver={SQL Server};" & _
                               "Server=" & strDSN & ";" & _
                               "Database=" & strDatabase & ";" & _
                               "Trusted_Connection=yes"
        Else
            strConnectString = "Driver={SQL Server};" & _
                               "Server=" & strDSN & ";" & _
                               "Database=" & strDatabase & ";" & _
                               "User Id=UUUUUUU;Password=" & DecryptString("PPPPPPPP") & ""

            strDisplay = "Driver={SQL Server};" & _
                         "Server=" & strDSN & ";" & _
                         "Database=" & strDatabase & ";" & _
                         "User Id=UUUUUU;Password=PPPPPPP"

        End If

         Debug.Print "Will use Conn String: " & strDisplay
        .ConnectionString = strConnectString
        .CursorLocation = CursorLoc
        .Open
    End With
    GetConnection = True
Proc_Exit:
    Exit Function
ERROR_HANDLER:
    Debug.Print Err.Number & vbCrLf & Err.Description
    Err.Source = "Module_Connect: " 
    DocAndShowError
    Resume Proc_Exit
    Resume Next
    Resume
End Function

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM