【问题标题】:Access VBA generated ODBC connection string revertsAccess VBA 生成的 ODBC 连接字符串恢复
【发布时间】: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


【解决方案1】:

尝试使用 DoCmd.TransferDatabase 链接您的表格。

DoCmd.TransferDatabase acLink, "ODBC Database", [your_cnn_string], acTable, [source_tbl_name], [linked_table_name], , True

TranserDatabase 中的最后一个选项是StoreLogin

我在自己的应用程序中使用它。

了解TransferDatabase here

【讨论】:

  • 谢谢,我会试试的。
  • 太棒了!这似乎奏效了。布欧特。现在它想询问我作为表链接到的所有视图的主键。其中许多视图是没有主键的复杂查询。当传输进入时,我如何绕过必须分配主键?现在我必须点击取消 20 次。
  • 啊,是的,我记得。已经有一段时间了,但我相信如果您在 Access 第一次记住您的回复时通过并分配 PK。我不再收到提示,并且我检查了我的 PK 分配代码 - 没有。至于没有PK的,我相信你选择OK(或任何选项)而不选择PK。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-03-17
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多