0

我们正在将 ADP 项目转换为 ACCDB,因为 Office 2013 版本不再支持 ADP。

我有以下代码来更改ADP中的应用程序连接:

Function ChangeADPConnection(strServerName As String, strDBName As _
   String, Optional strUN As String, Optional strPW As String) As Boolean
Dim strConnect As String
On Error GoTo EH:
Application.CurrentProject.CloseConnection
'The Provider, Data Source, and Initial Catalog arguments are required.
strConnect = "Provider=SQLOLEDB.1" & _
";Data Source=" & strServerName & _
";Initial Catalog=" & strDBName
If strUN <> "" Then
    strConnect = strConnect & ";user id=" & strUN
    If strPW <> "" Then
        strConnect = strConnect & ";password=" & strPW
    End If
Else  'Try to use integrated security if no username is supplied.
    strConnect = strConnect & ";integrated security=SSPI"
End If
Application.CurrentProject.OpenConnection strConnect
ChangeADPConnection = True
Exit Function
EH:
MsgBox Err.Number & ": " & Err.Description, vbCritical, "Connection Error"
ChangeADPConnection = False
End Function

但是,我不确定如何更改 ACCDB 中的当前项目连接?

我正在使用带有 SQL Server 的链接表作为后端

这是我尝试过的:

Public Function ChangeACCDBConnection(strServerName As String, strDBName As _
   String, Optional strUN As String, Optional strPW As String) As Boolean

    Dim strConnect As String
    Dim cnn As ADODB.Connection
    Application.CurrentProject.Connection.Close
    On Error GoTo EH:
    strConnect = "XXXXX"
    Set Con = New ADODB.Connection
    Con.ConnectionString = strConnect
    CurrentProject.OpenConnection strConnect // Error here
    ChangeConnection = True
    Exit Function

EH:
    MsgBox Err.Number & ": " & Err.Description, vbCritical, "Connection Error"
    ChangeConnection = False
End Function

我收到一个错误,更改当前项目连接。连接字符串很好,它已成功连接到数据库。

唯一的事情是如何将该连接设置为 Application.CurrentProject 以便在应用程序中使用它。

非常感谢任何帮助..

4

2 回答 2

3

据我所知,在标准的 Access 数据库应用程序(不是 ADP)中,您只能通过以下方式操作您的连接:

  1. 删除链接表并使用代码重新创建这些链接。如果您正确执行此操作,您可以链接/重新链接到任何有效的数据源。这对任何 ADO 连接都没有影响。链接表实际上使用 DAO 和 ODBC 的组合作为数据访问层。
  2. 在代码模块中创建一个 ADO 连接对象作为全局变量。当你想切换数据源时,编写函数来改变它的连接。(您也可以将所有这些包装在一个类中。)

我认为非 ADP 应用程序没有像 ADP 这样的内置全局 ADO 连接,因此您必须使用上面列出的方法。

于 2014-12-30T15:36:53.883 回答
0

您的代码可以继续使用 currentProject.connection,但您不能更改它。

实际上,currentproject 连接将始终解析为您当前的前端数据库。

但是,这意味着使用此连接对象的现有代码将继续工作。

所以,如果你有这个:

Dim rs As New ADODB.Recordset

rs.Open ("select * from tblHotels"), CurrentProject.Connection
Do While rs.EOF = False
   Debug.Print rs!FirstName
   rs.MoveNext
Loop
rs.Close
Set rs = Nothing

幕后发生的事情是上面解析到我们的字体端,然后解析到 tblHotels(到 sql server 的链接表)。因此,Access 将使用 CURRENT 前端数据库作为当前连接。它解析为该表,但该表链接(指向)sql server,因此访问将使用链接表中的信息为您解析此连接。

我不能再强调当前项目连接因此解析为本地对象(链接表)。由于该表指向 sql server,那么 access 将使用链接表中的信息,您就可以了。

因此,在概念层面:继续使用当前项目。您永远不会更改、触摸、编辑或修改访问返回的当前项目连接。

在实践层面:要指向或更改 sql 表解析到的 sql server,您必须重新链接表并将它们指向新的/不同的数据库。

因此,无需更改整个应用程序连接,您只需调用重新链接表代码即可。完成此重新链接后,您可以继续在代码中使用当前项目连接对象。所以这里唯一真正的区别是您不能(永远)更改连接对象,但您只需重新链接表以指向正确的数据库。

归根结底,这个门槛意味着您永远不必在代码中处理连接字符串,除了重新链接例程。

请注意,您应该让您的重新链接代码也更改/设置您拥有的任何 PT 查询。

因此,要使用 PT 查询,您可以:

Dim rst     As DAO.Recordset

With CurrentDb.QueryDefs("qryPassR")
  .SQL = "select * from tblBooking where id = " & BookingID
  Set rst = .OpenRecordset()
End With

请记住,上面是发送到 SQL Server 的原始 T-SQL。

或者,要调用存储过程,您可以:

Dim rst     As DAO.Recordset

With CurrentDb.QueryDefs("qryPassR")
  .SQL = "exec MyStoredProc " & BookingID
  .Execute
End With

请注意,在上面我们没有处理代码中的连接字符串,我们甚至不必处理连接对象。(我们甚至不必创建连接对象来调用 SQL Server 存储过程。如果存储过程是返回记录,那么我们当然会使用第一种语法:

Dim rst     As DAO.Recordset

With CurrentDb.QueryDefs("qryPassR")
  .SQL = "exec MyStoredProc " & BookingID

  Set rst = .OpenRecordset()
End With

如果您有/有基于参数的表单,那么您现在将表单直接绑定到链接表。

要传递(限制)表单数据集,您可以使用它

Docmd.OpenForm "frmBooking",,,"id = " & bookingID

以上将加载表单,并且仅从 sql server 中提取一条记录,尽管表单直接绑定到链接表。

因此,表单的参数(以限制提取的记录)应使用上述 open form 命令的“简单” where 子句。

因此,您不需要一些新的全局连接对象,而是可以继续使用当前项目连接。

于 2019-03-31T19:17:08.533 回答