连接dsn
介绍直到最近,我将对连接到MS SQL Server后端的所有MS Access数据库使用系统DSN。 设置非常容易,不需要DSN-Less连接所需要的所有在线代码。 但是,尝试切换到测试服务器,确保在客户端计算机上具有正确的DSN设置(更改取决于32或64位客户端系统)是一件很痛苦的事情。因此,现在,我切换到DSN较少的连接,并决定发布我的操作方式(因为无法在线找到所需的一切)。
建立首先,我创建了两个本地表来存储不同SQL Server位置,另一个创建了表列表以及它们应该连接到的位置。
tblBE
BE_ID_pk AutoNumber
Driver Text
Server Text
DatabaseName Text tblTableLocation
TableID_pk AutoNumber
TableName Text
RemoteTableName Text
LocationID_fk Number
One-to-Many join on tblBE.BE_ID_pk = tblTableLocation.LocationID_fk
码
首先,我有将表添加到TableDefs集合的代码。 此函数将表添加到TableDefs,然后将表添加到tblTableLocation中的表列表。
Public Function AddTable(TableName As String, RemoteTable As String, Location As Long) As Boolean
On Error GoTo Error_Handler
Dim db As DAO.Database
Dim td As TableDef
Dim strCon As String
Dim strAddQry As String
Set db = CurrentDb
strCon = "ODBC;" & GetLocation(Location) & "Trusted_Connection=YES"
Set td = db.CreateTableDef(TableName, dbAttachSavePWD, RemoteTable, strCon)
db.TableDefs.Append td
strAddQry = "INSERT INTO tblTableLocation (TableName, RemoteTableName, LocationID_fk) " & _
"VALUES ('" & TableName & "', '" & RemoteTable & "', " & Location & ")"
db.Execute strAddQry, dbFailOnError
AddTable = True
Exit_Procedure:
Set db = Nothing
Set td = Nothing
Exit Function
Error_Handler:
AddTable = False
Resume Exit_Procedure
End Function
Private Function GetLocation(LocationID As Long) As String
On Error GoTo Error_Handler
Dim db As DAO.Database
Dim rst As DAO.Recordset
Dim strRst As String
Dim strLoc As String
strRst = "SELECT * FROM tblBE WHERE BE_ID_pk = " & LocationID
Set db = CurrentDb
Set rst = db.OpenRecordset(strRst, dbOpenDynaset)
With rst
strLoc = "DRIVER=" & !Driver & ";SERVER=" & !Server & ";DATABASE=" & !DatabaseName & ";"
End With
GetLocation = strLoc
Exit_Procedure:
On Error Resume Next
rst.Close
Set db = Nothing
Set rst = Nothing
Exit Function
Error_Handler:
Resume Exit_Procedure
End Function
参数如下
- TableName:您要在Access中显示的名称
- RemoteTable:SQL Server中表的名称(包括架构名称,即dbo.Customers)
- 位置:tblBE中要连接的服务器/数据库的PK值。 位置信息来自GetLocation()函数。
在服务器之间移动表的代码几乎相同,但是在将表添加到TableDefs集合之前,首先将其删除。 因此,将删除旧位置中的链接表,然后创建一个链接到新位置的新链接表。
Public Function MoveTable(LocalTable As String, RemoteTable As String, Location As Long) As Boolean
On Error GoTo Error_Handler
Dim td As TableDef
Dim strCon As String
Dim db As DAO.Database
Set db = CurrentDb
db.TableDefs.Delete LocalTable
strCon = "ODBC;" & GetLocation(Location) & ";Trusted_Connection=YES"
Set td = db.CreateTableDef(LocalTable, dbAttachSavePWD, RemoteTable, strCon)
db.TableDefs.Append td
MoveTable = True
Exit_Procedure:
Set db = Nothing
Set td = Nothing
Exit Function
Error_Handler:
AttachDSNLessTable = False
Resume Exit_Procedure
End Function
调用代码
我有一个未绑定的表格,可以让我在文本框和组合框中输入所有信息。 确切的设计并不重要,但是我有两个部分:一个添加表,另一个将表移到另一台服务器。
首先,添加一个表。 用于本地表名称,远程表名称的文本框,以及用于服务器/数据库的组合框。 我认为控件名称在含义上相当明显。Private Sub cmdAttachTable_Click()
On Error GoTo Error_Handler
If Me.txtLTable & "" <> "" And Me.txtRTable & "" <> "" And Not IsNull(Me.cboLoc) Then
If AddTable(Me.txtLTable, Me.txtRTable, Me.cboLoc) = False Then
MsgBox "Attempt to attach " & Me.txtLTable & " to the database failed.", vbCritical
End If
Else
MsgBox "All three fields need to be populated in order to attach a table.", vbInformation
End If
Exit_Procedure:
Exit Sub
Error_Handler:
Resume Exit_Procedure
End Sub
移动表。
“从”和“到”服务器/数据库的组合框。
Private Sub cmdChangeBackend_Click()
On Error GoTo Error_Handler
Dim strTables As String
Dim db As DAO.Database
Dim rstTables As DAO.Recordset
Dim strMsg As String
If Not IsNull(Me.cboFrom) And Not IsNull(Me.cboTo) Then
strTables = "SELECT * FROM tblTableLocation WHERE LocationID_fk = " & Me.cboFrom
Set db = CurrentDb
Set rstTables = db.OpenRecordset(strTables, dbOpenDynaset)
With rstTables
Do While Not .EOF
If AttachDSNLessTable(!TableName, !RemoteTableName, Me.cboTo) = False Then
strMsg = "Connection attempt for " & !TableName & " failed."
MsgBox strMsg, vbCritical, "Connection Attempt Failed"
Else
.Edit
!LocationID_fk = Me.cboTo
.Update
End If
.MoveNext
Loop
End With
Else
MsgBox "Both drop-down boxes must have values"
End If
Exit_Procedure:
On Error Resume Next
rstTables.Close
Set db = Nothing
Set rstTables = Nothing
Exit Sub
Error_Handler:
Resume Exit_Procedure
End Sub
我所有SQL Server后端数据库都有两个连接的数据库。
一个是数据数据库,另一个是Employee数据库,列出了他们对该数据库的权限(我做了一个自定义构建的数据库,这样就不必为每个数据库都创建它。我可以稍后再发表另一篇文章。)。
因此,我不能仅将所有表从一台服务器移动到另一台服务器。
拥有“从”组合框后,我只能将一个服务器/数据库中的表移动到另一服务器/数据库中,而将其他表保留下来。
结论
我已经使用过一次,可以告诉您它比使用链接表管理器并要求新的位置要简单得多。 对我来说,它要求为每张桌子提供新的位置。 当使用10多个表时(我现在有24个表),这很烦人。 现在,我要做的就是选择两个并单击一个按钮。 做完了
翻译自: https://bytes.com/topic/access/insights/957707-managing-dsn-less-connections
连接dsn