>我有多个用户使用两个 ODBC 系统 DSN 之一通过 Access 连接到 SQL Server:REPORT 和 REPORTS。除了名称外,它们是相同的。我定期更新或创建新的基于 Access 的工具,然后将其部署到共享网络驱动器。我目前必须维护每个工具的两个版本 - 一个使用报告,另一个使用报告。我正在寻找一种测试和重新链接表的方法:
- 如果存在 REPORT,请使用它并重新链接表。
- 否则 如果存在报告,请使用它并重新链接表。
- 否则返回错误消息。
我有在 VBA 中使用无 DSN 连接的经验,如果没有办法测试已经存在的 ODBC 连接,这可能是一个可行的选择。理想情况下,我会让 IT 部门对 DSN 名称进行标准化,但历史如此之深,以至于我无法轻松识别谁使用哪个 DSN。
Rob,
下面是一些代码,它首先返回正常工作的 DSN(通过尝试从列出的两个 DSN 中的每一个导入测试表(,然后遍历数据库中的所有链接表以根据需要正确设置 DSN:
Function fGetODBCName() As String
On Error GoTo E_Handle
DoCmd.DeleteObject acTable, "dbo_tblTest"
DoCmd.TransferDatabase acLink, "ODBC Database", "ODBC;DSN=REPORT;Trusted_Connection=Yes;DATABASE=TEST", acTable, "tblUser", "dbo_tblTest"
If Not IsNull(DLookup("Name", "MSysObjects", "Name='dbo_tblTest'")) Then
fGetODBCName = CurrentDb.TableDefs("dbo_tblTest").Connect
Else
DoCmd.TransferDatabase acLink, "ODBC Database", "ODBC;DSN=REPORTS;Trusted_Connection=Yes;DATABASE=TEST", acTable, "tblUser", "dbo_tblTest"
If Not IsNull(DLookup("Name", "MSysObjects", "Name='dbo_tblTest'")) Then
fGetODBCName = CurrentDb.TableDefs("dbo_tblTest").Connect
End If
End If
DoCmd.DeleteObject acTable, "dbo_tblTest"
fExit:
On Error Resume Next
Exit Function
E_Handle:
Select Case Err.Number
Case 3146 ' DSN does not exist
Resume Next
Case 7874 ' dbo_tblTest does not exist so cannot delete it
Resume Next
Case Else
MsgBox Err.Description & vbCrLf & vbCrLf & "fGetODBCName", vbOKOnly + vbCritical, "Error: " & Err.Number
End Select
Resume fExit
End Function
Sub sRelinkODBC()
On Error GoTo E_Handle
Dim db As DAO.Database
Dim lngLoop1 As Long
Dim lngCount As Long
Dim strConnect As String
Dim strLocal As String
Dim strSource As String
strConnect = fGetODBCName
If Len(strConnect) > 0 Then
Set db = DBEngine(0)(0)
db.TableDefs.Refresh
lngCount = db.TableDefs.Count - 1
For lngLoop1 = lngCount To 0 Step -1
If Len(db.TableDefs(lngLoop1).Connect) > 0 Then
If db.TableDefs(lngLoop1).Connect <> strConnect Then ' only relink if needed
strLocal = db.TableDefs(lngLoop1).Name
strSource = db.TableDefs(lngLoop1).SourceTableName
DoCmd.DeleteObject acTable, strLocal
DoCmd.TransferDatabase acLink, "ODBC Database", strConnect, acTable, strSource, strLocal
End If
End If
Next lngLoop1
db.TableDefs.Refresh
Else ' not able to find a suitable DSN
End If
sExit:
On Error Resume Next
Set db = Nothing
Exit Sub
E_Handle:
MsgBox Err.Description & vbCrLf & vbCrLf & "sRelinkODBC", vbOKOnly + vbCritical, "Error: " & Err.Number
Resume sExit
End Sub
虽然这行得通,但我强烈建议您与系统管理员联系,让他们使用组策略向所有用户推出单个 DSN。
呵呵