sql-server - Access VBA 生成的 ODBC 连接字符串恢复
问题描述
我正在为位于本地共享服务器上的 SQL Server (Express 2019) DB 创建本地 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 查询,如果连接字符串不包含登录信息,它们就不起作用。
以编程方式强制连接字符串包含此信息的任何想法?
解决方案
尝试使用链接您的表格DoCmd.TransferDatabase
。
DoCmd.TransferDatabase acLink, "ODBC Database", [your_cnn_string], acTable, [source_tbl_name], [linked_table_name], , True
中的最后一个选项TranserDatabase
是StoreLogin
.
我在自己的应用程序中使用它。
TransferDatabase
在这里阅读。
推荐阅读
- angular - 使用输入的引用提取输入值
- sql - Postgresql-(psycopg2.errors.SyntaxError)输入末尾的语法错误
- pine-script - Pine 脚本中的长/短策略
- c# - 当我在 C# 中将图像从 Datagrid 视图显示到图片框时以及当我在 datagrid 视图中检查我的图像时出现错误消息
- mongodb - 在 MongoDB 中设计追随者和追随者模式?
- graphql - 如何在 localhost 中使用 apollo graphql 进行 fastify 会话
- github - Visual Code Studio,不支持文件导入回调 - 未找到文件源
- java - 带有“默认 NEWID()”的 SQL Server UNIQUEIDENTIFIER 的 JPA 映射
- kotlin - 使字符串以 Kotlin 中的指定前缀开头
- python - 获取 AttributeError 解析 JSON 数据