Sql server MS OLE DB驱动程序:电源查询与ADO

Sql server MS OLE DB驱动程序:电源查询与ADO,sql-server,oledb,powerquery,Sql Server,Oledb,Powerquery,我有一个调用SQL Server的VBA脚本。此脚本首先测试与SQL server的有效连接,如果有效,则运行电源查询 我的“测试连接”scriptlet类似于: Function TestSQLConnection() Dim cnn As ADODB.Connection TestSQLConn = False Set cnn = New ADODB.Connection cnn.Open "Provider=sqloledb;Data Source=myserver;Initial Ca

我有一个调用SQL Server的VBA脚本。此脚本首先测试与SQL server的有效连接,如果有效,则运行电源查询

我的“测试连接”scriptlet类似于:

Function TestSQLConnection()
Dim cnn As ADODB.Connection

TestSQLConn = False
Set cnn = New ADODB.Connection
cnn.Open "Provider=sqloledb;Data Source=myserver;Initial Catalog=MyDB;Integrated Security=SSPI;"
If cnn.State = adStateOpen Then
    TestSQLConnection = True
    cnn.Close
End If
With ActiveSheet.ListObjects.Add(SourceType:=0, Source:= _
    "OLEDB;Provider=Microsoft.Mashup.OleDb.1;Data Source=$Workbook$;Location=""SomeTable"";Extended Properties=""""" _
    , Destination:=Range("$A$1")).QueryTable
    .CommandType = xlCmdSql
    .CommandText = Array("SELECT * FROM [SomeTable]")
    .ListObject.DisplayName = "SomeTable"
    .Refresh BackgroundQuery:=False
End With
端函数

我的“Power Query”脚本类似于:

Function TestSQLConnection()
Dim cnn As ADODB.Connection

TestSQLConn = False
Set cnn = New ADODB.Connection
cnn.Open "Provider=sqloledb;Data Source=myserver;Initial Catalog=MyDB;Integrated Security=SSPI;"
If cnn.State = adStateOpen Then
    TestSQLConnection = True
    cnn.Close
End If
With ActiveSheet.ListObjects.Add(SourceType:=0, Source:= _
    "OLEDB;Provider=Microsoft.Mashup.OleDb.1;Data Source=$Workbook$;Location=""SomeTable"";Extended Properties=""""" _
    , Destination:=Range("$A$1")).QueryTable
    .CommandType = xlCmdSql
    .CommandText = Array("SELECT * FROM [SomeTable]")
    .ListObject.DisplayName = "SomeTable"
    .Refresh BackgroundQuery:=False
End With
我的VBA脚本以前指向SQL 2014,它既有旧的sqloledb驱动程序,也有新的msoledbsql驱动程序。但是现在,我的脚本指向SQL 2017,它没有msoledbsql驱动程序。在此服务器上,“测试连接”scriptlet失败。因此,我在服务器上安装了msoledbsql,并将“测试”连接scriptlet修改为:

    cnn.Open "Provider=msoledbsql;Data Source=myserver;Initial Catalog=MyDB;Integrated Security=SSPI;"

现在一切似乎都好了。但是,我不明白为什么我不需要修改powerqueryscriptlet中的任何内容。Power查询中的OLE DB调用只是“知道”使用适当的驱动程序吗?

OLEDB调用不是Power查询用来连接数据库的,而是Excel用来从Power查询的操作中检索最终结果的。您可以在“Microsoft.Mashup.OleDb”源代码中看到这一点,它基本上是Power Query的后端。使用Power Query自带的SQL Server connector连接到您的数据库,这可能在不同版本之间运行良好。

OLEDB调用不是Power Query用来连接到您的数据库的调用,而是Excel用来从Power Query的操作中检索最终结果的调用。您可以在“Microsoft.Mashup.OleDb”源代码中看到这一点,它基本上是Power Query的后端。与数据库的连接是使用Power Queries自己的SQL Server连接器实现的,该连接器可能在不同版本之间运行良好