Microsoft Excel 允许从“其他来源”导入数据。其中一种选择是使用 OLE DB 提供程序。
如何获取可用 OLE DB 提供程序的列表?
如果您有可用的 powershell,只需将其粘贴到 powershell 命令提示符中即可:
foreach ($provider in [System.Data.OleDb.OleDbEnumerator]::GetRootEnumerator())
{
$v = New-Object PSObject
for ($i = 0; $i -lt $provider.FieldCount; $i++)
{
Add-Member -in $v NoteProperty $provider.GetName($i) $provider.GetValue($i)
}
$v
}
积分和更高级的用法: http://dbadailystuff.com/list-all-ole-db-providers-in-powershell
我正在回答我自己的问题,因为这比我预期的更难找到。 Google-fu只能回答我的部分问题;我需要综合各种博客文章和官方文档中的信息。
下面是 VBScript,您可以复制/粘贴到文本文件中并在 Windows 上运行。您不需要本地管理员权限即可运行此版本。
根据注册表的大小和 CPU 的速度,运行可能需要一分钟。结果是一个带有文本的消息框,可以使用
Ctrl+C
将其复制到剪贴板。
主要参考:https://sysmod.wordpress.com/2014/07/11/vbscript-to-list-installed-oledb-providers/
'List of installed OLEDB providers on local computer
Option Explicit
Const HKEY_CLASSES_ROOT = &H80000000
Const HKEY_CURRENT_USER = &H80000001
Const HKEY_LOCAL_MACHINE = &H80000002
Const HKEY_USERS = &H80000003
Const HKEY_CURRENT_CONFIG = &H80000005
Dim OutText, strComputer, objRegistry
Dim num
Dim ProgIdDict
strComputer = "."
Set objRegistry = GetObject("winmgmts:\\" & strComputer & "\root\default:StdRegProv")
OutText = "Note: Strike Ctrl+C to copy full text to clipboard"
Num = 1
Set ProgIdDict = CreateObject("Scripting.Dictionary")
' I discovered these registrations can appear in three different places.
' Use ProgIdDict to prevent dupes in the output
Append objRegistry, HKEY_CLASSES_ROOT, "HKEY_CLASSES_ROOT", "CLSID", ProgIdDict, Num, OutText
Append objRegistry, HKEY_LOCAL_MACHINE, "HKEY_LOCAL_MACHINE", "SOFTWARE\Classes\CLSID", ProgIdDict, Num, OutText
Append objRegistry, HKEY_LOCAL_MACHINE, "HKEY_LOCAL_MACHINE", "SOFTWARE\Classes\Wow6432Node\CLSID", ProgIdDict, Num, OutText
Sub Append(ByVal objRegistry, ByVal HKEYConstant, ByVal HKEYConstantStr, ByVal KeyPrefixStr, ByVal ProgIdDict, ByRef Num, ByRef OutText)
Dim Key, arrKeys
Dim strKeyPath, strValue, uValue
objRegistry.enumKey HKEYConstant, KeyPrefixStr, arrKeys
for each key in arrKeys
strKeyPath = KeyPrefixStr & "\" & key
' if key exists...
' I noticed something weird where non-MSOLAP entries use the first style,
' and MSOLAP entries use the second style.
If 0 = objRegistry.GetDWordValue(HKEYConstant, strKeyPath, "OLEDB_SERVICES", uValue) _
Or 0 = objRegistry.GetDWordValue(HKEYConstant, strKeyPath & "\OLEDB_SERVICES", "", uValue) _
Then
objRegistry.GetStringValue HKEYConstant,strKeyPath & "\ProgID","",strValue
If Not ProgIdDict.Exists(strValue) _
Then
ProgIdDict.Add strValue, strValue
OutText=OutText & vbcrlf & vbcrlf
'get the (Default) value which is the name of the provider
objRegistry.GetStringValue HKEYConstant,strKeyPath,"",strValue
OutText=OutText & num & ") " & strValue & vbcrlf & "Key: \\" & HKEYConstantStr & "\" & KeyPrefixStr & "\" & key
' and the expanded description
objRegistry.GetStringValue HKEYConstant,strKeyPath & "\OLE DB Provider","",strValue
OutText=OutText & vbcrlf & "OLE DB Provider: " & strValue
objRegistry.GetStringValue HKEYConstant,strKeyPath & "\ProgID","",strValue
OutText=OutText & vbcrlf & "ProgID: " & strValue
objRegistry.GetStringValue HKEYConstant,strKeyPath & "\VersionIndependentProgID","",strValue
OutText=OutText & vbcrlf & "VersionIndependentProgID: " & strValue
num = 1 + num
End If
end if
next
End Sub
Wscript.Echo OutText
另一个使用 PowerShell 的解决方案,这次利用 .NET 代码(归功于 jrich523.wordpress.com)。
将其插入 PowerShell 控制台:
(New-Object system.data.oledb.oledbenumerator).GetElements()
产生如下输出:
SOURCES_NAME : SQLOLEDB Enumerator
SOURCES_PARSENAME : {DFA22B8E-E68D-11d0-97E4-00C04FC2AD98}
SOURCES_DESCRIPTION : Microsoft OLE DB Enumerator for SQL Server
SOURCES_TYPE : 2
SOURCES_ISPARENT : False
SOURCES_CLSID : {DFA22B8E-E68D-11d0-97E4-00C04FC2AD98}
在 Windows 资源管理器中:
OLEDB 提供了一个类,可以为您枚举所有 OLE DB 提供程序。
{c8b522d0-5cf3-11ce-ade5-00aa0044773d}
CLSID_OLEDB_ENUMERATOR
(来自 sdk 中的 msdaguid.h)创建枚举器
ISourcesRowset enum = (ISourcesRowset)CreateComObject(CLSID_OLEDB_ENUMERATOR);
以 OLEDB 形式获取结果
IRowset
:
IRowset rowset = enum.GetSourcesRowset(null, IRowset, 0, null);
IRowset
界面,就像 OLEDB 的其余部分一样......无情。这是 API 的噩梦,是在 Java 风靡的时代所梦想的。幸运的是,Microsoft 创建了一个围绕 OLEDB 的友好包装器:称为 ActiveX 数据对象 (ADO)。它甚至提供了一个方便的功能,将 OLEDB IRowset
包装到 ADO Recordset
(适配器模式)中:
Recordset rs = (Recordset)CreateComObject(CLASS_Recordset);
(rs as ADORecordsetConstruction).Rowset = rowset;
现在您可以迭代结果:
SOURCES_NAME SOURCES_PARSENAME SOURCES_DESCRIPTION SOURCES_TYPE SOURCES_ISPARENT SOURCES_CLSID
-------------------------- -------------------------------------- ---------------------------------------------------- ------------ ---------------- --------------------------------------
SQLOLEDB {0C7FF16C-38E3-11d0-97AB-00C04FC2AD98} Microsoft OLE DB Provider for SQL Server 1 False {0C7FF16C-38E3-11d0-97AB-00C04FC2AD98}
MSOLAP {10154F28-4979-4166-B114-3E7A7926C747} Microsoft OLE DB Provider for Analysis Services 10.0 1 False {10154F28-4979-4166-B114-3E7A7926C747}
MSOLAP {10154F28-4979-4166-B114-3E7A7926C747} Microsoft OLE DB Provider for Analysis Services 10.0 3 False {10154F28-4979-4166-B114-3E7A7926C747}
MSDataShape {3449A1C8-C56C-11D0-AD72-00C04FC29863} MSDataShape 1 False {3449A1C8-C56C-11D0-AD72-00C04FC29863}
SQLNCLI11 {397C2819-8272-4532-AD3A-FB5E43BEAA39} SQL Server Native Client 11.0 1 False {397C2819-8272-4532-AD3A-FB5E43BEAA39}
ADsDSOObject {549365d0-ec26-11cf-8310-00aa00b505db} OLE DB Provider for Microsoft Directory Services 1 False {549365d0-ec26-11cf-8310-00aa00b505db}
MSOLEDBSQL {5A23DE84-1D7B-4A16-8DED-B29C09CB648D} Microsoft OLE DB Driver for SQL Server 1 False {5A23DE84-1D7B-4A16-8DED-B29C09CB648D}
MSOLEDBSQL Enumerator {720818D5-1465-4812-839F-9F15C38A52CB} Microsoft OLE DB Driver for SQL Server Enumerator 2 False {720818D5-1465-4812-839F-9F15C38A52CB}
SQLNCLI11 Enumerator {8F612DD2-7E28-424f-A2FD-C2EECC314AA2} SQL Server Native Client 11.0 Enumerator 2 False {8F612DD2-7E28-424f-A2FD-C2EECC314AA2}
Windows Search Data Source {9E175B8B-F52A-11D8-B9A5-505054503030} Microsoft OLE DB Provider for Search 1 False {9E175B8B-F52A-11D8-B9A5-505054503030}
MSDASQL {c8b522cb-5cf3-11ce-ade5-00aa0044773d} Microsoft OLE DB Provider for ODBC Drivers 1 False {c8b522cb-5cf3-11ce-ade5-00aa0044773d}
MSDASQL Enumerator {c8b522cd-5cf3-11ce-ade5-00aa0044773d} Microsoft OLE DB Enumerator for ODBC Drivers 2 False {c8b522cd-5cf3-11ce-ade5-00aa0044773d}
MSOLAP {DBC724B0-DD86-4772-BB5A-FCC6CAB2FC1A} Microsoft OLE DB Provider for Analysis Services 14.0 1 False {DBC724B0-DD86-4772-BB5A-FCC6CAB2FC1A}
MSOLAP {DBC724B0-DD86-4772-BB5A-FCC6CAB2FC1A} Microsoft OLE DB Provider for Analysis Services 14.0 3 False {DBC724B0-DD86-4772-BB5A-FCC6CAB2FC1A}
Microsoft.Jet.OLEDB.4.0 {dee35070-506b-11cf-b1aa-00aa00b8de95} Microsoft Jet 4.0 OLE DB Provider 1 False {dee35070-506b-11cf-b1aa-00aa00b8de95}
SQLOLEDB Enumerator {DFA22B8E-E68D-11d0-97E4-00C04FC2AD98} Microsoft OLE DB Enumerator for SQL Server 2 False {DFA22B8E-E68D-11d0-97E4-00C04FC2AD98}
MSDAOSP {dfc8bdc0-e378-11d0-9b30-0080c7e9fe95} Microsoft OLE DB Simple Provider 1 False {dfc8bdc0-e378-11d0-9b30-0080c7e9fe95}
MSDAORA {e8cc4cbe-fdff-11d0-b865-00a0c9081c1d} Microsoft OLE DB Provider for Oracle 1 False {e8cc4cbe-fdff-11d0-b865-00a0c9081c1d}
Microsoft 记录了 ISourcesRowset::GetSourcesRowset archive
中的列SOURCES_NAME
(0):数据存储或枚举器的不变名称。
SOURCES_PARSENAME
(1):传递给 IParseDisplayName
以获得数据源对象或枚举器的名字的字符串。
SOURCES_DESCRIPTION
(2):OLE DB 数据源对象或枚举器的描述。
SOURCES_TYPE
(3):指定该行是描述数据源对象还是枚举器:
DBSOURCETYPE_DATASOURCE_TDP
(1): 表示表格数据提供者DBSOURCETYPE_ENUMERATOR
(2): 表示枚举器DBSOURCETYPE_DATASOURCE_MDP
(3):表示多维(OLAP)提供者DBSOURCETYPE_BINDER
(4):表示支持直接 URL 绑定器的提供者绑定器
如果一段代码能够同时用作数据源对象和枚举器,则它会在行集中列出两次,每个角色一次。SOURCES_ISPARENT
(4):如果该行描述了一个枚举数,则如果该枚举数是父枚举数,则SOURCES_ISPARENT 为 VARIANT_TRUE;也就是说,其枚举包含刚刚调用 ISourcesRowset::GetSourcesRowset
的枚举器。这允许消费者向后进行枚举。枚举器是否能够枚举其父级是特定于提供者的。否则,SOURCES_ISPARENT 为 VARIANT_FALSE。
如果该行描述数据源对象,则使用者将忽略 SOURCES_ISPARENT。
我遇到了 Steinar Herland 的 powershell 脚本找不到我的 oledb 提供程序的问题。我写了一个 C# 小程序,但确实做到了。
using System.Data.OleDb;
var oleEnum = new OleDbEnumerator();
var elems = oleEnum.GetElements();
if (elems != null && elems.Rows != null)
foreach (System.Data.DataRow row in elems.Rows)
if (!row.IsNull("SOURCES_NAME") && row["SOURCES_NAME"] is string)
Console.WriteLine(row["SOURCES_NAME"]);
我通过 @Steinar Herland
编辑了代码如果您只想显示 ACCESS OLEDB 提供程序,只需将其粘贴到 powershell 命令提示符中:
foreach ($provider in [System.Data.OleDb.OleDbEnumerator]::GetRootEnumerator())
{
if ($provider.GetValue(0) -like "Microsoft.ACE*")
{
$v = New-Object PSObject
Add-Member -in $v NoteProperty "Provider Name" $provider.GetValue(0)
Add-Member -in $v NoteProperty "Description" $provider.GetValue(2)
$v
}
}
打开 Windows PowerShell 并键入:
Get-OdbcDriver
它将列出您 PC 上所有可用的 ODBC 驱动程序。