我正在尝试连接具有不同数据源的表;本工作簿基于 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
您无法将多个连接合并到一个查询中。 SQL 语句在数据库中执行(即使该数据库是 Excel),而不是在客户端(您的代码)执行,并且每个数据库只知道它自己,而不知道任何其他数据库。 ADO 只是一个将命令发送到数据库并接收结果的包装器。
您的记录集 (
rsPubs
) 只有一个连接(当前为 cnPubs
),并且 SQL 语句将使用该连接执行。我假设您的 SQL 尝试将工作表中的数据与数据库中的数据连接起来,但这根本行不通。
可能的解决方法:
循环 Excel 数据并为数据的每一行发出单独的 SQL 语句(您应该深入研究 ADODB.Parameter 以加快该过程)。
将 Excel 的内容写入数据库的临时表中,并在数据库端执行联接。
将数据库中的相关数据加载到单独的工作表中(可能使用
In
子句)并在 Excel 端执行联接。