VBA 与 ADO,多个数据源连接

问题描述 投票:0回答:1

我正在尝试连接具有不同数据源的表;本工作簿基于 SQL Server。 以下是我的尝试。

尝试运行此程序时,会显示运行时错误。 我对这个错误并不感到惊讶。 我真的没想到它会运行,也想不出还有什么可以尝试的。

在单独的子例程中运行时,两个连接均成功。

感谢任何帮助!

Dim cnPubs As ADODB.Connection
Set cnPubs = New ADODB.Connection
Dim cnPubsSQL As ADODB.Connection
Set cnPubsSQL = New ADODB.Connection
Dim strConn As String, strConnSQL As String, fldCount As Long, iCol As Long, Slct As String, SQLfrom As String, 

BouncePNs = "`" & ThisWorkbook.Sheets("Sheet1").Name & "$`"""

strConn = strConn & "Provider=Microsoft.ACE.OLEDB.12.0;"
strConn = strConn & " Data Source=" & ThisWorkbook.FullName & ";Extended Properties=""Excel 12.0 Xml"""
cnPubs.Open strConn
strConnSQL = "PROVIDER=SQLOLEDB;"
strConnSQL = strConnSQL & "DRIVER={SQLServer};SERVER=XXSQLP02\XXSQLP02;UID=product_user;PWD=xxxx;Database=product"
cnPubsSQL.Open strConnSQL

Dim rsPubs As ADODB.Recordset
Set rsPubs = New ADODB.Recordset

Slct = "SELECT Whse, Mfg,[Part Number] "

SQLfrom = "  FROM "
SQLfrom = SQLfrom & BouncePNs
SQLfrom = SQLfrom & "LEFT OUTER JOIN vwPart"
SQLfrom = SQLfrom & "ON " & BouncePNs & ".PN = vwPart.[Part Number]"

Workbooks.Add
With rsPubs
    .ActiveConnection = cnPubsSQL
    .ActiveConnection = cnPubs
    .Open Slct & SQLfrom
    fldCount = rsPubs.Fields.Count
    For iCol = 1 To fldCount
        Cells(1, iCol).Value = rsPubs.Fields(iCol - 1).Name
    Next iCol
    Cells(2, 1).CopyFromRecordset rsPubs
    .Close
End With
excel vba ado qsqlquery
1个回答
0
投票

您无法将多个连接合并到一个查询中。 SQL 语句在数据库中执行(即使该数据库是 Excel),而不是在客户端(您的代码)执行,并且每个数据库只知道它自己,而不知道任何其他数据库。 ADO 只是一个将命令发送到数据库并接收结果的包装器。

您的记录集 (

rsPubs
) 只有一个连接(当前为
cnPubs
),并且 SQL 语句将使用该连接执行。我假设您的 SQL 尝试将工作表中的数据与数据库中的数据连接起来,但这根本行不通。

可能的解决方法:

  • 循环 Excel 数据并为数据的每一行发出单独的 SQL 语句(您应该深入研究 ADODB.Parameter 以加快该过程)。

  • 将 Excel 的内容写入数据库的临时表中,并在数据库端执行联接。

  • 将数据库中的相关数据加载到单独的工作表中(可能使用

    In
    子句)并在 Excel 端执行联接。

© www.soinside.com 2019 - 2024. All rights reserved.