连接dsn_管理DSN减少连接

连接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
参数如下
  1. TableName:您要在Access中显示的名称
  2. RemoteTable:SQL Server中表的名称(包括架构名称,即dbo.Customers)
  3. 位置: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

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值