我有多个用户,使用两个ODBC系统DSN之一通过Access连接到SQL Server:REPORT和REPORTS。除名称外,它们相同。我会定期更新或创建新的基于Access的工具,然后将其部署到共享网络驱动器。我目前必须维护每个工具的两个版本-一个使用REPORT,另一个使用REPORTS。我正在寻找一种测试和重新链接表的方法:
我有在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。
HTH