【发布时间】:2021-08-20 00:33:01
【问题描述】:
我正在为位于本地共享服务器上的 SQL Server (Express 2019) 数据库创建本地 MS Access (365) 前端应用程序。
我有一个登录表单,可以在用户登录时重新链接所有链接的表和视图。(这主要不是为了安全,所以请不要告诉我这个设置对于安全性有多么不足 - 我知道。 )
基本上,我在 Access 应用程序中有一个本地表,其中列出了登录时需要重新链接的所有表名。登录时,删除当前链接,然后代码循环遍历表列表并根据流程中构建的连接字符串(包括 UID 和 PWD)链接它们。但是当我在登录后检查连接字符串时,它不包括登录信息。我的 Excel 工作簿与这些链接表之一有数据连接,直到我在链接表管理器中手动编辑字符串后才能连接。
下面是登录过程的代码:
Private Sub cmdConnect_Click()
Dim db As Database
Dim tdf As TableDef
Dim rst As Recordset
Dim rst1 As Recordset
Dim strServer As String
Dim strDB As String
Dim strTable As String
Dim strConnect As String
Dim strMsg As String
Dim strPass As String
Dim strPrimary As String
On Error GoTo HandleErr
Set db = CurrentDb
strPass = DLookup("[Password]", "tblUsers", "[User] = '" & Me.txtUser & "'")
If StrComp(Me.txtPwd, strPass, vbBinaryCompare) <> 0 Then
strMsg = "Incorrect Username or password!"
GoTo ExitHere
End If
' Create a recordset to obtain server object names.
Set rst = db.OpenRecordset("tblSQLTables", dbOpenSnapshot)
If rst.EOF Then
strMsg = "There are no tables listed in tblSQLTables."
GoTo ExitHere
End If
'Assign the current user in table
Set rst1 = db.OpenRecordset("tblUsers", dbOpenDynaset, dbSeeChanges)
With rst1
.MoveFirst
Do Until rst1.EOF
.Edit
Select Case !user
Case Me.txtUser
!Current = -1
Case Else
!Current = 0
End Select
.Update
.MoveNext
Loop
End With
strConnect = "ODBC;Driver={ODBC Driver 17 for SQL Server};Trusted_Connection=No;DSN=SQL1;UID=" _
& Me.txtUser & ";PWD=" & Me.txtPwd & ";"
'delete all existing linked tables
Call deleteLinks
' Walk through the recordset and create the links.
Do Until rst.EOF
strServer = rst!SQLServer
strDB = rst!SQLDatabase
strTable = rst!SQLTable
' Create a new TableDef object.
Set tdf = db.CreateTableDef("dbo_" & strTable, 0, "dbo." & strTable, strConnect & "Server=" & strServer & ";Database=" & strDB & ";")
' Set the Connect property to establish the link.
db.TableDefs.Append tdf
Debug.Print tdf.Connect
Set tdf = Nothing
rst.MoveNext
Loop
strMsg = "Tables linked successfully."
rst.Close
Set rst = Nothing
Set tdf = Nothing
Set db = Nothing
DoCmd.Close acForm, Me.name
DoCmd.OpenForm "frmStart"
ExitHere:
MsgBox strMsg, , "Link SQL Tables"
Exit Sub
HandleErr:
Select Case Err
Case Else
strMsg = Err & ": " & Err.Description
Resume ExitHere
End Select
End Sub
Private Sub deleteLinks()
Dim rst As Recordset
Dim db As Database
Dim tdf As TableDef
Set db = CurrentDb
For Each tdf In db.TableDefs
If tdf.name Like "dbo_*" Then
DoCmd.DeleteObject acTable, tdf.name
End If
Next
End Sub
当我查看即时窗口以查看打印的 tdf.connect 时,它给了我:
ODBC;DRIVER=ODBC Driver 17 for SQL Server;SERVER=RNC1SQL\SQLEXPRESS;UID=****;PWD=*************;Trusted_Connection=No;APP=Microsoft Office;DATABASE=RNCMasterfile;
但是当我在链接表管理器中查看连接字符串时,我得到以下信息:
DRIVER=ODBC Driver 17 for SQL Server;SERVER=RNC1SQL\SQLEXPRESS;Trusted_Connection=No;APP=Microsoft Office;DATABASE=RNCMasterfile;
奇怪的是,我可以访问和使用 Access 中的表,但我有 Excel 电子表格,其中连接到基于链接表的 Access 查询,如果连接字符串不包含登录信息,它们就不起作用。
任何想法以编程方式强制连接字符串包含此信息?
【问题讨论】:
-
当您稍后显式设置服务器和数据库时,为什么要使用 DSN (
DSN=SQL1) 设置strConnect?也许这种混合会导致麻烦?尝试不使用 DSN。 -
哦,那是我尝试过的,但并没有改变任何东西。忘记带回去了。我在这方面很绿色......
标签: sql-server ms-access odbc connection-string